Skip to content

The Five Pillars

Open in ChatGPTOpen in Claude

Every default the framework ships is evaluated through five pillars — cost · security · scalability · observability · sustainability — and must be defensible on all five before it lands. This page is the decoder ring for “why is the default like that?” questions; nearly every answer is one of these five words.

Prefer the cheaper option whenever it doesn’t trade away another pillar:

  • Lambdas default to arm64 (Graviton) — cheaper and faster for most workloads.
  • S3 buckets default to SSE-S3, not SSE-KMS — encryption at rest without per-object KMS request charges; pass a key when you actually need a CMK.
  • The budget stack exists but defaults off — it’s account-global, so it’s an explicit opt-in rather than a surprise.

Secure-by-default, with the sharp edges structurally removed:

  • Buckets block all public access and enforce TLS out of the box.
  • Secret values never enter SSM or synthesized templates — only ARNs cross stack boundaries; values are resolved at runtime via IAM grants.
  • Registry auth tokens live in ~/.npmrc, never in committed files (Install); a composer API surface with no auth choice is an error, never silently public.
  • A dedicated security perimeter (WAF, SES) is a stack of its own, on by default in the full starters.

Serverless primitives, composed so nothing is a bottleneck by construction:

  • Every queue gets a dead-letter queue by default — failure handling exists in every environment, not just the ones someone remembered to configure.
  • Stacks deploy independently over SSM wiring — no lock-step deployment coupling as the system grows.

If it can fail, you can see it:

  • X-Ray tracing on by default; structured logging with explicit retention (30d dev / 90d prod) on every function.
  • The observability stack wires error alarms, DLQ-depth alarms, an alert topic with chat adapters, and a dashboard as a unit.
  • Even the CLI follows the pillar: errors are [Axis]-prefixed and name exactly what’s wrong, and invalid inputs throw rather than silently default.

The lowest-footprint choice that does the job:

  • arm64 compute and scale-to-zero serverless services keep the energy and cost floor at zero when idle.
  • This documentation site practices it too: static zero-JS-by-default output, with the API reference generated from source so the docs maintain themselves instead of rotting.

The pillars are for your decisions too. When you extend Axis — a new stack, a new construct default, a passthrough override — run the same five questions. “DLQ on by default” is the canonical worked example: observability and scalability improved at near-zero cost, with no security or sustainability downside. Defaults that survive all five questions tend to survive production.

© 2026 Axis Tech. Powered by axis-tech.co.