Dawnlet · under the hood

How Dawnlet actually works

These pages describe the design of each part of the app — the data it keeps, the rules it enforces, and the decisions that shaped it. They're blueprints, not source code: enough to understand the mechanism and argue with it, without reproducing the implementation.

SwiftUI · iOS 17+ Supabase · Postgres No push server 9 write-ups

Start here

If you only read one, read Architecture — the rest assume its vocabulary (repositories, view models, the module pattern every feature repeats).

The shape of the whole thing

Dawnlet is a native SwiftUI app talking to a Supabase Postgres database. There is no backend service of ours in between: the app authenticates against Supabase directly and queries tables over PostgREST, with row-level security doing the work a server-side authorization layer would otherwise do.

LayerWhat it isWhat it deliberately isn't
ClientSwiftUI, iOS 17+, one app target Not cross-platform, not a web view. Widgets and a Watch app are anticipated but not built.
DataSupabase Postgres, one table per concept, RLS on every one No API service of ours, so no endpoint to secure separately or keep in sync with the client.
AuthSign in with Apple, exchanged directly for a Supabase session No password, no email, no custom token minting, no name or email stored.
Privileged workOne Edge Function, for account deletion Not a general-purpose API. It exists because deleting an auth user needs a key that must never ship in an app.
NotificationsComputed and scheduled entirely on the device No APNs, no push payloads, no notification server.
PurchasesStoreKit, one non-consumable product No subscription, and no server-side record of who bought what.
Why so little server

Every piece of server-side machinery is a thing that can break, leak, or need paying for. The parts of Dawnlet that genuinely need a server — durable storage and cross-device sync — use one. The parts that don't, like deciding whether to remind you about a habit tonight, run where the data already is.

A note on honesty

The app is under active development, and these pages describe what's built, not what's planned. Where something is a placeholder — the journal module, widgets, the Watch app — the relevant page says so rather than describing it in the present tense.