LIFE ORGANIZER
An offline-first life app: quests, a morning check-in, a journal, finance, a meal plan, and a coach that reads every other surface before it writes. Everything lives in Dexie + IndexedDB with optional Supabase sync. The AI runs on your own OpenAI key.
Hover a phone to bring it forward.
Tuesday, April 14
Quiet evening
I let go of what doesn't move me forward.
Your finance quest has been stuck in phase 1 for 2 weeks. Today's a good day to log one expense — start small. Workout streak is alive: 4 days. Don't let it snap.
Daily Flow
My Quests
Paused
Open
Insight
Building self-worth
In the red
Journal
What surprised you this week — for better or worse?
Which quest feels hardest right now, and why?
When did you last feel truly free?
Free writing
Let your thoughts flow
Finances
Income
3.200,00 €
Expenses
2.840,00 €
Balance
+360,00 €
Coach Context Sources
Morning Rituals
Offline Latency
Offline Reads
How the morning coach knows you
Before the OpenAI call, the app pulls a context packet from six sources — everything it already stores about you — so the coach answers to your actual week, not a blank prompt.
the long-term vision, short + full text
every active quest + its current phase
the last 5 entries, prompts + free text
outstanding tasks, up to 5 surfaced
only the ones marked active
last 7 check-ins — sport, meditation, wake time
what's on your mind this morning
// Context-aware morning coach — no generic prompts
const [vision, quests, journalEntries, todos, mantras, checkins] =
await Promise.all([
db.vision.get('nordstern'),
db.quests.toArray(),
db.journalEntries.orderBy('date').reverse().limit(5).toArray(),
db.todos.filter(t => !t.completed).toArray(),
db.mantras.filter(m => m.active).toArray(),
db.morningCheckins.orderBy('date').reverse().limit(7).toArray(),
])
const streak = checkins.filter(c => c.didExercise).length
// Assemble CONTEXT_PARTS, then call GPT-4o-mini with a coach system promptThe radar that browses your own URLs
You add any URL as a source, and on refresh the app hits OpenAI's Responses API with the web_search tool: GPT opens the URL, pulls real events from the next seven days, and returns JSON the app renders as cards. No hardcoded feeds, no scraper to keep alive.
// Lifestyle Radar — AI browses your own URLs for events
const response = await client.responses.create({
model: 'gpt-4o-mini',
tools: [{
type: 'web_search_preview',
user_location: { type: 'approximate', country: 'DE', city: 'Berlin' },
}],
input: `Event-Scout for Berlin. Search ${source.url} for real events
between ${today} and ${endDate}. Return JSON:
[{ name, date, location, url, description }]`,
})
const events = JSON.parse(response.output_text)
// Dexie.radarEvents.bulkAdd(events) — reactive UI via useLiveQueryChoices that shaped the build
- →Dexie holds the truth, Supabase only syncs
Dexie is the source of truth, so reads are local and the app runs offline. An opt-in Supabase Auth sync pushes all 22 tables to a single
user_datarow for multi-device. - →Build the context before the prompt
Six parallel DB queries assemble your current state, then one OpenAI call runs against it. More code than a raw prompt, but that's what keeps the coach specific instead of generic.
- →A check-in instead of a streak counter
Three quick checks — sport, meditation, wake time — plus a daily note. A streak punishes a missed day; this just records where today stands and moves on.
- →Live queries via dexie-react-hooks
With
useLiveQuerythe UI updates the moment the local DB changes — no refetch, no stale state, no spinner on everyday reads. - →Bring your own OpenAI key
No server-side proxy. Your key sits in settings and calls go straight from the browser with
dangerouslyAllowBrowser. Not enterprise-grade, but you own the cost and the AI layer needs no infrastructure of its own.