Architecture Decision Record · Security
The Walking Skeleton Has No Skin
& Foundations
Atlas, Mumbai
11 Jul 2026
Context
What are you building, and which secrets or sensitive data must exist on the device? (e.g. offline-first marketplace; payment tokens and a local catalogue live on-device.)
The Five Skeleton-Stage Decisions
For each: mark where your choice lands on the reversal meter — cheap to change later, or effectively permanent. Spend your attention on the right end.
Where do your secrets live?
Hardcoded in a Dart constant, a bundled .env, or a config file shipped in the binary.
On-device secrets in Keychain / Keystore (via secure storage). Powerful secrets stay server-side.
Where is the client / server trust boundary?
Pricing, discounts, eligibility and feature gates decided on the client "because it's faster."
Treat the client as hostile. Anything that must be true — price, permission, payment — is enforced server-side.
Is data-at-rest encrypted — and where's the key?
Plaintext local database. Or encrypted, but with the key as a string literal three lines above.
Encrypted store (e.g. SQLCipher). Key lives in Keychain / Keystore — never in the source.
What is your certificate-pinning stance?
"It's HTTPS, we're fine." A user with a proxy and their own cert can map your whole private API.
Pin the cert/key you trust — and own a rotation plan so you can't brick clients in the field.
What telemetry leaves the device?
Capture everything, sort out privacy later. PII rides out in request bodies, traces and screenshots.
Allow-list what may leave. Mask screenshots, hash identifiers. Decide before you capture.
Decision
The stance you're taking, in one or two lines.
Consequences we accept
The trade-offs and deferrals you're consciously taking on.
Never defer
There is exactly one decision on this page you never postpone: no long-lived secret ships inside the binary. Everything else can wait a lab — this cannot. Anything in the compiled app is readable, obfuscated or not.