LIFE ORGANIZER
A personal OS — offline-first, built around the core flows: quests with user-defined phases, a morning check-in that anchors the day, a journal with AI-generated prompts, finance, todos and reminders, a meal plan and shopping list, a lifestyle radar that scans your own data sources for real events, and a coach that reads every other surface before writing. Dexie + IndexedDB is the offline-first store, with optional Supabase sync for multi-device. The AI layers run 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
The Coach
The morning message isn't a generic prompt. Before calling OpenAI, the app assembles a context packet from seven sources — everything it already knows about you. The coach writes against that, not against a blank canvas.
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
The Lifestyle Radar is a second AI layer, and it runs on a different pattern than the coach. You add any URL as a source and give it a category. Hit refresh, and the app calls OpenAI's Responses API with the web_search tool — GPT actually browses the URL, extracts real events in a seven-day window, and returns structured JSON that the app renders as cards. No hardcoded feeds. No scraping logic to maintain. If you stop caring about a source, you delete it.
// 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 useLiveQueryKey Decisions
- →Dexie + Supabase, not one or the other
IndexedDB via Dexie is the source of truth — every read is local, every write is instant, the app works fully offline. Supabase Auth gates an opt-in cloud sync that pushes and pulls all 22 tables to a single
user_datarow for multi-device. Local stays the fast path; the network only shows up on push/pull. - →Context packet before prompt
The AI can't be personal if you don't give it your actual data. Seven parallel DB queries assemble the state, then a single OpenAI call. More code than a raw prompt — but the only way the coach stops sounding like a fortune cookie.
- →Morning check-in over streak gamification
Three categorical checks (sport, meditation, wake time) plus a daily note — one pass, one screen. Streak-based habit trackers punish you for missing a day; the morning check-in surfaces the daily state without turning discipline into a game.
- →Live queries via dexie-react-hooks
useLiveQuerymeans the UI updates the instant the local DB changes — no refetch, no stale state. Day-to-day reads have no loading layer; only cloud sync and OpenAI calls show progress. - →Bring your own OpenAI key
No server-side AI proxy. You paste your OpenAI key in settings; calls go straight from the browser to OpenAI with
dangerouslyAllowBrowser. Trade-off: the key lives in local storage (not enterprise-grade), but the cost is on you, the rate limits are on you, and the AI layer needs zero infrastructure beyond the Supabase auth + sync that's already there.