Skip to content

LifeOS System Design — How Justin Will Use This

The end-state Justin is building toward. Captures intent + workflows so any future agent (brain, cron, fresh Claude) can understand what each surface is FOR, not just what it IS.

North star: a fluid system

Bot ↔ Notion ↔ Gmail ↔ Calendar should flow without friction. Justin captures intent in 5 seconds via voice/text from anywhere. The system handles routing, scheduling, syncing. Everything lands where it should without him thinking about it.

The two telegram bots Justin uses

Bot Purpose Personality
@forge_inbox_capture_bot Low-friction one-shot capture: tasks, habit ticks, knowledge fragments, calendar events Fast, no chitchat, single-action
@forge_lifeos_coordinator_bot Multi-step synthesis: create projects, query state, schedule meetings, manage habits, run reviews Conversational, uses many tools, can spawn workers

Plus @forge_remote_bridge_bot for full Claude Code parity (separate work).


Capture flows (inbox bot)

Brand-routed task creation

User says: "Life Task: buy macro lens for VR shoots" Bot: parses "Life Task" → routes to Life Tasks DB. Creates row with task body, default Priority=Medium, no Due. Replies: "Saved to Life Tasks."

Spoken keyword Routes to Brand prop
"Life task X" Life Tasks Life
"JustinWieb task X" / "JWVR task X" / "VR task X" JWVR Tasks JWVR
"Nova task X" Nova Tasks Nova
"Fishing task X" Fishing Tasks Fishing
"Bass task X" Bass Tasks Bass
"Task X" (no brand qualifier) Life Tasks (default) Life

Capture extracts: task title (≤80 chars; rest goes in Notes), tags (multi-select if mentioned), Source=Telegram.

Tasks without due dates

When capture creates a task without Due, it adds it AND replies briefly. The COORDINATOR runs a daily check (or post-creation): "I see Life Task 'buy macro lens' has no due date. Should I schedule it for the weekend?" — coordinator pings via Telegram, Justin replies, coordinator updates Due + (optionally) creates calendar event.

Tasks with due date AND time → calendar sync

When tool_create_task receives due with both date AND time (e.g., "buy lens by Friday 3pm"): 1. Capture creates Notion task with Due 2. Capture (or coordinator) also creates Google Calendar event via tool_create_calendar_event 3. Stores returned event id in Task.Calendar Event ID (rich_text) 4. Sets Task.Calendar Synced = true

If task is updated later, sync via tool_update_calendar_event using stored id.

Project creation with auto-tasks (coordinator only)

User: "@coordinator create a JWVR video project: Quest 4 launch sponsorship" Coordinator: 1. Creates JWVR Projects row: Name="Quest 4 launch sponsorship", Status=Active 2. Auto-creates 4 child tasks in JWVR Tasks, all linked to the project: - "Script — Quest 4 launch" (Scheduled today + 0d) - "Shoot — Quest 4 launch" (Scheduled today + 7d) - "Edit — Quest 4 launch" (Scheduled today + 14d) - "Post — Quest 4 launch" (Scheduled today + 21d) 3. Replies with Notion project URL.

This requires a new tool: tool_create_video_project(project_name, brand="jwvr", base_offset_days=0).

Future templates (also as bot tools): - tool_create_video_series_project — for multi-episode series - tool_create_sponsor_deal_project — for sponsor deals (creates Sponsor row + Deal + Deliverables) - tool_create_nova_client_project — Nova client onboarding template - Eventually: tool_create_premiere_pro_handoff — preps a Premiere project file from the Notion task

Habit ticking via inbox

User: "drank 3 more cups" Coordinator/capture: 1. Looks up Hydrate's today row (cron-pre-created) 2. Increments Quantity by 3 (cumulative — not overwrite) 3. Replies: "Hydrate now 8 / 15 cups. 7 more to go."

User: "did my workout" Bot: 1. Sets Gym today's Quantity = 1 2. Hit goal flips true. Replies: "✅ Gym hit. Streak: 1, week: 1/3."

User: "skip wake up early today, slept in" Bot: leaves Quantity=null. Streak resets next cron run (yesterday's hits don't roll over since today missed).

Tools needed: - tool_log_habit(habit_name, quantity_delta=None, quantity=None, notes=None) — UPDATES existing today row, supports quantity_delta for increment OR quantity for absolute. Default quantity=1 if neither passed (interprets "did the thing").

Habit definition creation (coordinator only)

User: "@coordinator add a new habit: cold shower, 2 mins, daily" Coordinator: 1. Creates Habit Definitions row: Name="Cold shower", Cadence target="Daily", Goal qty=2, Unit="minutes", Active?=true 2. Replies: "Added Cold shower (2 min daily). It'll appear in tomorrow's Habits log."

Tools needed: - tool_create_habit_definition(name, goal_qty, goal_unit, cadence="Daily", goal_freq=None, area=None) - tool_pause_habit(habit_name) — sets Active?=false - tool_archive_habit(habit_name) — page_archive

Sleep → calendar (coordinator only)

User: "add my Eight Sleep last night to my calendar" Coordinator: 1. Calls Forge Context API or Eight Sleep poller to get last night's sleep start/stop 2. Creates calendar event: summary="😴 Sleep", start=actual sleep start, end=actual sleep end, calendar=Sleep (or main with colorId=lavender) 3. Replies: "Logged: sleep 22:34 to 06:42 (8h 8m)."

Same shape for Garmin sleep ("add my Garmin sleep last night").

Tools needed: - tool_log_sleep(source="eight"|"garmin", date="last night"|"YYYY-MM-DD")

Calendar event with category color

User: "schedule lunch with Krystal Saturday 1pm" Coordinator: 1. Parses: time, attendee (Krystal — known person) 2. Creates calendar event: summary="Lunch with Krystal", start=Saturday 13:00, end=Saturday 14:00, colorId=sage (Personal) 3. Replies: "Set."

Categories → calendar colors:

Category Google Calendar colorId Color name
Work / Forge 9 Blueberry
Personal / Family 10 Basil
Sleep 1 Lavender
Errands 5 Banana
Workout / Health 11 Tomato
Entertainment 6 Tangerine
Travel 7 Peacock
Default / unset (omit) default

tool_create_calendar_event should accept category param that maps to colorId.


Hourly check-in automation (8am-8pm CT)

The killer time-tracking feature.

Cron behavior

forge_telegram_hourly_checkin.py fires every top-of-hour from 08:00 to 20:00 CT (13 fires/day).

Each fire: pushes a Telegram message to Justin via @forge_inbox_capture_bot:

Quick check-in. What did you do in the last hour? (Reply with the activity. Ill log it to your calendar and brief you on whats next.)

Justin's reply (any phrasing)

"worked on the Notion redesign with Claude"

Coordinator's response

  1. Parses activity + infers category (Work in this case)
  2. Creates calendar event: 13:00–14:00 (the hour just past), summary="Worked on Notion redesign", colorId=Blueberry
  3. Replies with the briefing:

    Logged: 13:00-14:00 Worked on Notion redesign (Work).

    Coming up: - 14:30 Krystal call (Personal) - 16:00 ship JWVR thumbnail (JWVR Tasks, due today)

    Habits today: 5/7 ticked. Still need: Hydrate (12/15), Read 10 pages, Morning journal.

Tools needed: - tool_log_time_block(activity, category, hour=None) — creates calendar event for the hour just past - tool_briefing(window="next_2_hours") — pulls upcoming tasks + events + outstanding habits

Sunday weekly review

User: "@coordinator weekly review" Coordinator: 1. Pulls past 7 days of calendar events 2. Aggregates by colorId / category (sum hours) 3. Pulls past 7 days of habit hits + streaks 4. Pulls completed Tasks and active Projects 5. Formats narrative reply:

Past week: - 32h Work (Forge + JWVR) - 12h Personal (Krystal, errands) - 56h Sleep (avg 8h) - 5h Workout (3/3 Gym days hit) - 4h Entertainment (movie, video games)

Habits: 4/7 nailed (Hydrate, Wake up early, Gym, Read). Missed Morning journal 3 days.

Tasks closed: 12. Projects active: 4 (Quest 4 launch on track).

Tool: tool_weekly_review() (heavy: makes ~5 calendar queries + Notion queries + composes prose).


Email integration (Gmail)

Per security rules, only DRAFT emails. Send requires Justin's chat confirmation.

Use cases

User: "draft an email to Krystal about Saturday plans" Coordinator: 1. Drafts: subject="Saturday plans", body="Hey, thinking dinner around 6 then maybe a movie. Sound good? -J" 2. Saves as Gmail draft (personal account) 3. Replies: "Drafted. Want me to send?"

User: "yes send" Coordinator: sends. (Per Justin's per-batch approval rule)

User: "find emails from Brand X about sponsor deal" Coordinator: tool_search_emails(query, account)

User: "create a task from this email" (replying to a forwarded email or referencing one) Coordinator: tool_email_to_task

Tools (most exist): - tool_search_emails ✓ - tool_read_email ✓ - tool_email_to_task ✓ - tool_draft_email ✓ - tool_send_email (NEEDS confirmation prompt; not auto-send) - tool_archive_emails ✓ - tool_get_email_thread ✓ - New: tool_summarize_inbox() — summary of unread, important, action-required


Notion structure: gaps to fill

Mostly ready. Just-shipped additions:

  • ✅ Calendar Event ID + Calendar Synced on all 5 Tasks DBs (just added)

Remaining to consider (not urgent for v1):

  • Project Templates: store JWVR/Nova/etc. project shapes (Notion templates feature). For now bot tool handles creation programmatically.
  • Calendar Event ID on Habits log (if syncing morning workout to calendar)
  • "Time Block" log DB? Probably skip — calendar is the time log; Notion shouldn't duplicate.

Bot tool surface (final list for bot-refiner)

In addition to the existing tool list in bot-tool-additions-2026-04-29.md Section 17, add:

New capture-persona tools (low-friction)

  • tool_create_task(task, brand="life", priority="Medium", due=None, scheduled=None, notes=None, tags=None) — already in handoff; ENSURE due-with-time also creates calendar event when present
  • tool_log_habit(habit_name, quantity_delta=None, quantity=None, notes=None) — UPDATES today's cron-created row; supports incremental delta
  • tool_save_to_inbox(title, body, tags=None) — already exists

New coordinator-persona tools (heavy)

  • tool_create_project(name, brand="jwvr", outcome=None, due=None, area=None) — base project creation
  • tool_create_video_project(name, brand="jwvr", start_offset=0) — Project + 4 auto-tasks (Script, Shoot, Edit, Post)
  • tool_create_sponsor_deal(sponsor_name, value, deliverables_list) — Sponsor + Deal + Deliverables in one
  • tool_link_task_to_project(task_query, project_query, brand) — already in handoff
  • tool_create_habit_definition(name, goal_qty, goal_unit, cadence="Daily", goal_freq=None, area=None)
  • tool_pause_habit(habit_name) / tool_archive_habit(habit_name)
  • tool_log_sleep(source="eight"|"garmin", date="last night") — pulls from poller, creates calendar event
  • tool_log_time_block(activity, category, hour=None) — for hourly check-in
  • tool_briefing(window="next_2_hours") — next-up summary
  • tool_weekly_review() — Sunday review with calendar aggregation
  • tool_followup_unscheduled_tasks() — daily prompt for tasks without Due dates

Plus all the Notion-edit tools from the playbook (forge_notion_api.py wrappers): tool_search_notion, tool_create_subpage, tool_archive_page, tool_set_page_icon, tool_create_linked_view, tool_favorite_page, tool_move_block, etc.


Crons that automate the above

Cron Schedule Purpose
forge-habits-instantiate.timer 04:00 daily Create today's Habits log rows (LIVE)
forge-habits-streaks.timer 23:55 daily Compute Days hit this week + Current streak (LIVE)
forge-mkdocs-build.timer every 2 min Rebuild forge mkdocs site (LIVE)
forge-telegram-hourly-checkin.timer hourly 08:00–20:00 CT Send hourly check-in prompt (TO BUILD)
forge-followup-unscheduled.timer 18:00 daily Coordinator pings Justin about today's unscheduled tasks (TO BUILD)
forge-weekly-review-prep.timer Sun 17:30 CT Pre-stage data for Justin's Sunday review (TO BUILD)

Order of build (Justin's call)

  1. Bot-refiner ships brain fixes per bot-tool-additions-2026-04-29.md (existing handoff)
  2. Resume services + smoke test capture/coordinator
  3. Add brand-routing keywords to capture persona system prompt
  4. Add new coordinator tools in priority order: a. tool_create_video_project (high value, used often) b. tool_log_sleep (one-off but pleasant) c. tool_briefing (foundation for hourly check-in) d. tool_log_time_block + hourly check-in cron e. tool_weekly_review f. The rest (sponsor deal, habit pause/archive, etc.)
  5. Sunday review handoff: once a couple weeks of time-block data accumulates, refine prompts.

Each step ships independently. Justin uses the system as it builds.


What "fluid" means here

Examples of seamless flows once everything ships:

  1. Mid-meeting: "@coordinator JWVR task: shoot review tomorrow 9am" → Notion task + calendar event + invite (if collaborator) all created in one tool call.
  2. Pre-coffee: 04:00 Habits row instantiation, 06:00 morning brief push, 06:30 reminder for first habit.
  3. Mid-edit-sprint: hourly check-in fires at 14:00 → Justin replies "edited the macro lens video" → calendar event 13-14 logged + briefed on what's next.
  4. Sunday afternoon: "@coordinator weekly review" → 30-second summary of where the week went, what hit, what missed, what's queued for next week.

[Claude Code, LifeOS designer, 2026-04-29]