BuildTeam Onboarding
Build · Life Organizer

LIFE ORGANIZER

VISION → QUEST → PHASES → OUTCOME

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.

PWADexieSupabaseOpenAI
App Screens

Hover a phone to bring it forward.

22:45
Self-employed. Abroad. Free.

Tuesday, April 14

Quiet evening

I let go of what doesn't move me forward.

Your coach for today

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

☀️Start
🗺️Quests
📖Journal
💰Money
❤️Dating
•••More
01Home
22:45

My Quests

📖AI Agency
2/5

Paused

📖Legacy & Inheritance
1/4

Open

📖Relationships
1/5

Insight

📖Dating
33/5

Building self-worth

📖Finances
1/5

In the red

☀️Start
🗺️Quests
📖Journal
💰Money
❤️Dating
•••More
02Quests
22:45

Journal

1

What surprised you this week — for better or worse?

2

Which quest feels hardest right now, and why?

3

When did you last feel truly free?

🪶
📓

Free writing

Let your thoughts flow

☀️Start
🗺️Quests
📖Journal
💰Money
❤️Dating
•••More
03Journal
22:45

Finances

April 2026
📈

Income

3.200,00

📉

Expenses

2.840,00

💰

Balance

+360,00

📈 Log income
📉 Log expense
Rent890,00
Freelance project+1.200,00
Groceries REWE67,30
Spotify9,99
+
☀️Start
🗺️Quests
📖Journal
💰Money
❤️Dating
•••More
04Finanzen
React 19
Framer Motion
Dexie
Supabase
OpenAI
Tailwind
0

Coach Context Sources

0

Morning Rituals

0ms

Offline Latency

0%

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.

01
Nordstern

the long-term vision, short + full text

02
Quests

every active quest + its current phase

03
Journal

the last 5 entries, prompts + free text

04
Todos

outstanding tasks, up to 5 surfaced

05
Mantras

only the ones marked active

06
Morning rituals

last 7 check-ins — sport, meditation, wake time

07
Today's note

what's on your mind this morning

services/openai.ts
// 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 prompt

The 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.

services/radar.ts
// 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 useLiveQuery

Key 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_data row 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

    useLiveQuery means 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.