3426 lines
113 KiB
Plaintext
3426 lines
113 KiB
Plaintext
**LIFE OS**
|
|
|
|
Architecture Design Document
|
|
|
|
Complete System Specification --- All Layers
|
|
|
|
-------------------- ----------------------------------------------------
|
|
**Document Type** Final Architecture Design
|
|
|
|
**Version** 2.0 --- February 2026
|
|
|
|
**Status** Approved for Build
|
|
|
|
**Author** M. Dombaugh
|
|
|
|
**Server** defiant-01 46.225.166.142
|
|
|
|
**Production URL** lifeos.invixiom.com
|
|
|
|
**Dev URL** lifeos-dev.invixiom.com
|
|
|
|
**Repository** github.com/mdombaugh/life-os
|
|
|
|
**Backend** Python 3.12 / FastAPI / SQLAlchemy
|
|
|
|
**Database** PostgreSQL 16
|
|
|
|
**Infrastructure** Docker / Nginx / Let\'s Encrypt
|
|
|
|
**Phases** Phase 1 (build) / Phase 2 (AI) / Phase 3 (polish)
|
|
-------------------- ----------------------------------------------------
|
|
|
|
-----------------------------------------------------------------------
|
|
**Table of Contents**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**1.** Vision and Goals 3
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**2.** Functional Requirements 4
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**3.** Non-Functional Requirements 6
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**4.** System Architecture Overview 7
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**5.** Subsystems and Capabilities 9
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**6.** Data Architecture 12
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**7.** Application Layer Architecture 22
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**8.** Generic Code Architecture 25
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
**9.** Frontend Architecture 27
|
|
|
|
-------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**10.** Infrastructure Architecture 30
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**11.** Search Architecture 33
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**12.** Time Management Architecture 34
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**13.** AI and MCP Architecture 36
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**14.** Security Architecture 38
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**15.** Phase Build Plan 39
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**16.** Migration Plan 42
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
**17.** Appendix: Table Inventory 43
|
|
|
|
--------- --------------------------------------------------------- -------
|
|
|
|
-----------------------------------------------------------------------
|
|
**1. Vision and Goals**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**1.1 Vision Statement**
|
|
|
|
Life OS is a personal productivity platform that unifies every aspect of
|
|
professional and personal work into a single, structured system. It
|
|
eliminates context-switching between disconnected tools by providing a
|
|
single source of truth for tasks, projects, knowledge, decisions,
|
|
relationships, meetings, processes, time, and releases. The system is
|
|
designed to grow with the user\'s workload without becoming unwieldy,
|
|
through consistent hierarchical organization, powerful search, and AI
|
|
assistance.
|
|
|
|
**1.2 Problem Statement**
|
|
|
|
- Too many disconnected tools: tasks in one place, notes in another,
|
|
contacts in a CRM, meetings in a calendar, decisions nowhere.
|
|
Context is lost between tools.
|
|
|
|
- Too much to do, too little time: no visibility into total committed
|
|
work versus available capacity. Overcommitment is invisible until it
|
|
becomes a crisis.
|
|
|
|
- Knowledge dispersal: decisions, rationale, and meeting outcomes are
|
|
not captured systematically. Institutional knowledge is lost or hard
|
|
to find.
|
|
|
|
- No process memory: recurring work is redone from scratch each time
|
|
instead of being captured as a reusable, improvable process.
|
|
|
|
- Reactive instead of proactive: without a structured daily focus and
|
|
time budget system, urgent work crowds out important work.
|
|
|
|
**1.3 Strategic Goals**
|
|
|
|
---------------- ------------------------------------------------------
|
|
**G1 - Single One system handles tasks, notes, knowledge, contacts,
|
|
hub** meetings, decisions, processes, releases, and time. No
|
|
external tool required for core productivity.
|
|
|
|
**G2 - Hierarchy Everything has a clear home in the Domain \> Area \>
|
|
clarity** Project hierarchy. Navigation is always obvious.
|
|
|
|
**G3 - Time The system surfaces overcommitment before it happens,
|
|
sovereignty** not after. Time estimates, budgets, and tracking are
|
|
first-class.
|
|
|
|
**G4 - Knowledge Every significant decision, meeting outcome, and
|
|
capture** process is documented and findable. Organizational
|
|
knowledge accumulates over time.
|
|
|
|
**G5 - AI The system is designed for AI interaction from day
|
|
leverage** one. Any capable AI model can read, create, and update
|
|
any entity via the MCP interface.
|
|
|
|
**G6 - The architecture uses portable, standard technologies
|
|
Longevity** with no vendor lock-in. The system should still be
|
|
running and maintainable in 10 years.
|
|
|
|
**G7 - Speed** Common actions (capture, task create, status update,
|
|
search) require the minimum possible steps. Friction
|
|
is the enemy of adoption.
|
|
|
|
**G8 - Single-user system. Uptime and data safety matter more
|
|
Reliability** than scale. Logical deletes protect all data. Backups
|
|
are automated.
|
|
---------------- ------------------------------------------------------
|
|
|
|
**1.4 Design Principles**
|
|
|
|
- Hierarchy first. Everything belongs to a Domain. Areas and Projects
|
|
are optional groupings.
|
|
|
|
- KISS. Simple solutions chosen wherever functionality is equivalent.
|
|
Complexity must earn its place.
|
|
|
|
- Consistent patterns. Every list, form, and detail view follows
|
|
identical structural conventions. Learn once, apply everywhere.
|
|
|
|
- Logical deletes everywhere. No data is permanently destroyed without
|
|
explicit admin action.
|
|
|
|
- Context travels with navigation. Drill-down pre-fills context into
|
|
all create actions.
|
|
|
|
- Search is first-class. Global search covers every entity from day
|
|
one.
|
|
|
|
- Generic over specific. Shared base code handles common operations.
|
|
Entity-specific code handles only genuinely unique business logic.
|
|
|
|
- Config-driven where possible. Menu structure, simple entities, and
|
|
form layouts are configuration - not code.
|
|
|
|
-----------------------------------------------------------------------
|
|
**2. Functional Requirements**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
*Priority: Must = required for Phase 1. Should = high value, Phase 1 if
|
|
possible. Could = Phase 2/3.*
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.1 Core Hierarchy**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-001** System shall support four-level hierarchy: **Must** Phase 1
|
|
Domain \> Area \> Project \> Tasks/Content
|
|
|
|
**FR-002** Content items (Tasks, Notes, Lists, Links, **Must** Phase 1
|
|
Files) shall attach at Domain, Area, or
|
|
Project level
|
|
|
|
**FR-003** All hierarchy items shall support soft delete **Must** Phase 1
|
|
with recovery via Admin \> Trash
|
|
|
|
**FR-004** All list views shall support filter, sort, **Must** Phase 1
|
|
search, and drag-to-reorder
|
|
|
|
**FR-005** Sidebar shall support status filtering, text **Must** Phase 1
|
|
search, and smart auto-collapse
|
|
|
|
**FR-006** Breadcrumb navigation shall appear on all **Must** Phase 1
|
|
detail views
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.2 Task Management**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-010** Tasks shall support priority (1-4), status, **Must** Phase 1
|
|
context, tags, due date, deadline,
|
|
recurrence, estimate, energy level
|
|
|
|
**FR-011** Tasks shall support subtasks via parent_id **Must** Phase 1
|
|
self-reference
|
|
|
|
**FR-012** Tasks shall support dependencies with full **Must** Phase 1
|
|
DAG (FS, FF, SS; SF via Admin)
|
|
|
|
**FR-013** Dependency cycle detection shall run on **Must** Phase 1
|
|
creation and reject circular dependencies
|
|
|
|
**FR-014** Status cascade shall automatically update **Must** Phase 1
|
|
dependent task statuses on blocker completion
|
|
|
|
**FR-015** Task list shall display in compact density **Must** Phase 1
|
|
(one row per task, all metadata inline)
|
|
|
|
**FR-016** Bulk actions shall be available: mark done, **Must** Phase 1
|
|
move, delete, add to focus
|
|
|
|
**FR-017** Quick add inline input shall appear at top of **Must** Phase 1
|
|
every task list
|
|
|
|
**FR-018** Waiting for / delegated field shall link task **Must** Phase 1
|
|
to a Contact with auto follow-up reminder
|
|
|
|
**FR-019** Task templates shall allow reusable **Must** Phase 1
|
|
blueprints with subtask checklists
|
|
|
|
**FR-020** Overdue tasks shall have distinct visual **Must** Phase 1
|
|
treatment (red date + left border)
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.3 Daily Focus and Time Management**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-030** Daily focus list shall be date-scoped and **Must** Phase 1
|
|
orderable by drag. Position is the priority
|
|
signal.
|
|
|
|
**FR-031** Time estimates (minutes) shall be settable on **Must** Phase 1
|
|
tasks
|
|
|
|
**FR-032** Time tracking shall support start/stop timer **Must** Phase 1
|
|
per task, with running timer visible in
|
|
topbar
|
|
|
|
**FR-033** Time budgets per domain (weekly hours target) **Must** Phase 1
|
|
shall surface overcommitment on dashboard
|
|
|
|
**FR-034** Time blocks shall reserve calendar slots with **Must** Phase 1
|
|
context and energy level
|
|
|
|
**FR-035** Eisenhower Matrix view shall derive from **Must** Phase 1
|
|
existing priority and due date data
|
|
|
|
**FR-036** Dashboard shall show estimated hours in focus **Should** Phase 1
|
|
vs available time for the day
|
|
|
|
**FR-037** Weekly review built-in process template shall **Should** Phase 1
|
|
be provided at first setup
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.4 Knowledge Management**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-040** Notes shall support rich text with inline **Must** Phase 1
|
|
wiki-style linking via \[\[ syntax
|
|
|
|
**FR-041** Notes shall be organizable in recursive **Must** Phase 1
|
|
folders with one folder per note
|
|
|
|
**FR-042** Notes shall support M2M project associations **Must** Phase 1
|
|
with is_primary flag
|
|
|
|
**FR-043** Meeting notes shall be toggled off by default **Must** Phase 1
|
|
in the Notes view
|
|
|
|
**FR-044** Decisions shall be a first-class entity **Must** Phase 1
|
|
linked to projects, contacts, and optionally
|
|
meetings
|
|
|
|
**FR-045** Decisions shall support superseded_by **Must** Phase 1
|
|
self-reference and status lifecycle
|
|
|
|
**FR-046** File preview shall display images and PDFs **Must** Phase 1
|
|
inline without downloading
|
|
|
|
**FR-047** Note version history shall record previous **Could** Phase 2
|
|
body states
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.5 Meetings, Contacts, CRM**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-050** Meetings shall support agenda, transcript, **Must** Phase 1
|
|
rich text notes, action items, attendees,
|
|
decisions
|
|
|
|
**FR-051** Action items in meetings shall convert to **Must** Phase 1
|
|
tasks with one click, retaining meeting link
|
|
|
|
**FR-052** Meeting series shall use parent_id **Must** Phase 1
|
|
self-reference on the meetings table
|
|
|
|
**FR-053** Contacts shall associate to tasks, projects, **Must** Phase 1
|
|
lists, appointments, meetings with role field
|
|
|
|
**FR-054** Follow-up reminders per contact shall surface **Must** Phase 1
|
|
in dashboard and as sidebar badge
|
|
|
|
**FR-055** Pipeline / deal stages for CRM shall be **Could** Phase 2
|
|
supported
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.6 Processes and Releases**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-060** Processes shall be typed as workflow **Must** Phase 1
|
|
(sequential, enforced) or checklist (any
|
|
order)
|
|
|
|
**FR-061** Process runs shall copy step content at **Must** Phase 1
|
|
creation. Template changes do not affect
|
|
active runs.
|
|
|
|
**FR-062** Process runs shall support all_at_once or **Must** Phase 1
|
|
step_by_step task generation modes
|
|
|
|
**FR-063** Releases shall be a system-level entity with **Must** Phase 1
|
|
M2M associations to multiple projects
|
|
|
|
**FR-064** Tasks shall optionally be tagged to a **Must** Phase 1
|
|
release. Untagged tasks form the project
|
|
backlog.
|
|
|
|
**FR-065** Milestones shall attach to a release or **Must** Phase 1
|
|
project with a target date and completion
|
|
state
|
|
|
|
**FR-066** Release detail shall show aggregate progress **Must** Phase 1
|
|
across all associated projects
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**2.7 Search, Capture, Admin**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------ --------------------------------------------- -------------- -----------
|
|
**ID** **Requirement** **Priority** **Phase**
|
|
|
|
**FR-070** Global search (Cmd/K) shall cover every **Must** Phase 1
|
|
entity with results grouped by type
|
|
|
|
**FR-071** Scoped search shall default to current **Must** Phase 1
|
|
project context, expandable to global
|
|
|
|
**FR-072** Capture bar shall accept multi-line paste and **Must** Phase 1
|
|
auto-parse into individual items
|
|
|
|
**FR-073** Capture items shall be convertible to any **Must** Phase 1
|
|
entity type
|
|
|
|
**FR-074** Context-aware capture shall pre-fill **Must** Phase 1
|
|
domain/project when opened within a project
|
|
|
|
**FR-075** Admin Trash shall show all soft-deleted items **Must** Phase 1
|
|
with restore and permanent delete
|
|
|
|
**FR-076** CSV export shall be available for tasks, **Must** Phase 1
|
|
projects, contacts, decisions
|
|
|
|
**FR-077** Personal dashboard metrics widget shall show **Must** Phase 1
|
|
weekly/monthly completion stats
|
|
|
|
**FR-078** AI MCP server shall expose all entities to AI **Must** Phase 2
|
|
models via MCP and OpenAI function format
|
|
|
|
**FR-079** Browser extension shall capture current page **Could** Phase 2
|
|
as weblink or capture item
|
|
------------ --------------------------------------------- -------------- -----------
|
|
|
|
-----------------------------------------------------------------------
|
|
**3. Non-Functional Requirements**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
------------------- ------------------------------------------------------
|
|
**NFR-01 Page load under 500ms for standard views on local
|
|
Performance** network. Search results within 300ms. Timer updates in
|
|
real time.
|
|
|
|
**NFR-02 Target 99.5% uptime. Docker restart policy: always.
|
|
Reliability** Automated daily database backup to /opt/lifeos/backups
|
|
with 30-day retention.
|
|
|
|
**NFR-03 Data Logical deletes on all entities. No data permanently
|
|
Safety** destroyed without two-step admin confirmation.
|
|
PostgreSQL WAL enabled.
|
|
|
|
**NFR-04 No vendor lock-in. Standard PostgreSQL schema.
|
|
Portability** Standard Python. File storage on local filesystem.
|
|
Migratable to any Linux host.
|
|
|
|
**NFR-05 Generic base architecture reduces duplication.
|
|
Maintainability** Config-driven entities require zero code for new
|
|
simple entities. All routers follow identical
|
|
patterns.
|
|
|
|
**NFR-06 Security** Single-user, self-hosted. API key authentication for
|
|
MCP. Environment variables for all secrets. Never
|
|
committed to git. HTTPS enforced.
|
|
|
|
**NFR-07 Every common action reachable in 3 clicks or fewer.
|
|
Usability** Capture reachable in 1 click from anywhere. Search
|
|
reachable via keyboard shortcut always.
|
|
|
|
**NFR-08 Mobile** Bottom tab bar navigation. All core views usable on
|
|
phone. Swipe actions in Phase 3.
|
|
|
|
**NFR-09 Single-user system. No scale requirements. Design
|
|
Scalability** supports tens of thousands of records without
|
|
degradation via proper indexing.
|
|
|
|
**NFR-10 Application logs to stdout, captured by Docker. Error
|
|
Observability** logging with stack traces. Nginx access logs retained
|
|
7 days.
|
|
------------------- ------------------------------------------------------
|
|
|
|
-----------------------------------------------------------------------
|
|
**4. System Architecture Overview**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**4.1 High-Level Architecture**
|
|
|
|
+-----------------------------------------------------------------------+
|
|
| **Architecture Style** |
|
|
| |
|
|
| Server-rendered monolith with a config-driven generic core. No SPA, |
|
|
| no build pipeline, no microservices. Intentionally simple stack |
|
|
| chosen for longevity and maintainability. |
|
|
+-----------------------------------------------------------------------+
|
|
|
|
> ┌─────────────────────────────────────────────────────────┐
|
|
>
|
|
> │ CLIENTS │
|
|
>
|
|
> │ Browser (desktop) Browser (mobile) AI Models │
|
|
>
|
|
> └────────────┬────────────────┬───────────────┬───────────┘
|
|
>
|
|
> │ │ │
|
|
>
|
|
> ▼ ▼ ▼
|
|
>
|
|
> ┌─────────────────────────────────────────────────────────┐
|
|
>
|
|
> │ NGINX (defiant-01) │
|
|
>
|
|
> │ SSL termination · routing · static files · rate limit │
|
|
>
|
|
> │ lifeos.invixiom.com → lifeos-prod:8002 │
|
|
>
|
|
> │ lifeos-dev.invixiom.com → lifeos-dev:8003 │
|
|
>
|
|
> │ /ai/\* → lifeos-mcp:8004 \[Phase 2\] │
|
|
>
|
|
> └──────────────────────┬──────────────────────────────────┘
|
|
>
|
|
> │
|
|
>
|
|
> ┌───────────────┼───────────────┐
|
|
>
|
|
> ▼ ▼ ▼
|
|
>
|
|
> lifeos-prod lifeos-dev lifeos-mcp
|
|
>
|
|
> FastAPI:8002 FastAPI:8003 MCP Server:8004
|
|
>
|
|
> (production) (development) \[Phase 2\]
|
|
>
|
|
> │ │ │
|
|
>
|
|
> └───────────────┴───────────────┘
|
|
>
|
|
> │
|
|
>
|
|
> ▼
|
|
>
|
|
> ┌─────────────────┐
|
|
>
|
|
> │ lifeos-db │
|
|
>
|
|
> │ PostgreSQL 16 │
|
|
>
|
|
> │ lifeos_prod │
|
|
>
|
|
> │ lifeos_dev │
|
|
>
|
|
> └─────────────────┘
|
|
>
|
|
> │
|
|
>
|
|
> ┌────────┴────────┐
|
|
>
|
|
> ▼ ▼
|
|
>
|
|
> /opt/lifeos/ /opt/lifeos/
|
|
>
|
|
> files/prod/ files/dev/
|
|
>
|
|
> (file storage) (file storage)
|
|
|
|
**4.2 Request Flow**
|
|
|
|
> Browser request (HTTPS)
|
|
>
|
|
> → Nginx: SSL termination, domain routing
|
|
>
|
|
> → FastAPI route handler
|
|
>
|
|
> → Config resolution (entity type, field definitions)
|
|
>
|
|
> → BaseRepository or EntityRepository (SQLAlchemy async)
|
|
>
|
|
> → PostgreSQL (query execution)
|
|
>
|
|
> → Jinja2 template render (server-side HTML)
|
|
>
|
|
> → HTML response → browser
|
|
|
|
Form submissions use standard HTML POST. JavaScript handles only UI
|
|
interactions: sidebar collapse state, search modal, theme toggle, timer
|
|
display, markdown preview, drag-to-reorder. No fetch/XHR to backend from
|
|
JS.
|
|
|
|
**4.3 Docker Network Topology**
|
|
|
|
> Network: lifeos_network (bridge)
|
|
>
|
|
> Container Image Ports Volumes
|
|
>
|
|
> ─────────────────────────────────────────────────────────────────
|
|
>
|
|
> lifeos-db postgres:16-alpine 5432 (internal) pg_data
|
|
>
|
|
> lifeos-prod lifeos-app:latest 8002 (internal) files/prod
|
|
>
|
|
> lifeos-dev lifeos-app:latest 8003 (internal) files/dev
|
|
>
|
|
> lifeos-mcp lifeos-mcp:latest 8004 (internal) \[Phase 2\]
|
|
|
|
All container ports are internal to the Docker network. Only Nginx is
|
|
exposed to the public internet (ports 80, 443).
|
|
|
|
-----------------------------------------------------------------------
|
|
**5. Subsystems and Capabilities**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
Life OS is composed of nine subsystems. Each subsystem is a coherent
|
|
capability domain with its own entities, views, and business logic. All
|
|
subsystems share the generic code base, data architecture, search, and
|
|
AI interface.
|
|
|
|
--------------- ------------------- ---------------------------------------
|
|
**Subsystem** **Primary **Key Capabilities**
|
|
Entities**
|
|
|
|
CRM contacts, Contact directory with roles,
|
|
appointments, appointment scheduling, follow-up
|
|
reminders reminders linked to contacts,
|
|
task/meeting/project associations with
|
|
role field
|
|
|
|
Project projects, releases, Full project lifecycle, releases
|
|
Management milestones, tasks, spanning multiple projects, milestone
|
|
dependencies tracking, DAG dependencies with cycle
|
|
detection and status cascade, progress
|
|
calculation
|
|
|
|
Task Management tasks, Priority/status/context, subtasks,
|
|
task_templates, dependencies, templates, time estimates
|
|
daily_focus, and tracking, Eisenhower matrix view,
|
|
time_entries daily focus with timer
|
|
|
|
Knowledge notes, Rich text notes with wiki-linking,
|
|
Management note_folders, recursive folders, decision knowledge
|
|
note_links, base with supersession chain, file
|
|
decisions, files, management with preview
|
|
links
|
|
|
|
Meeting meetings, decisions Full meeting records with
|
|
Management agenda/transcript/notes, action item
|
|
conversion, attendee management, series
|
|
support, decision capture
|
|
|
|
Process processes, Workflow vs checklist distinction,
|
|
Management process_steps, reusable templates, runs with snapshot
|
|
process_runs, isolation, task generation (all-at-once
|
|
process_run_steps or step-by-step)
|
|
|
|
Time Management time_entries, Time tracking per task, calendar time
|
|
time_blocks, blocking, domain weekly budgets,
|
|
time_budgets overcommitment surfacing, Eisenhower
|
|
matrix
|
|
|
|
Personal capture, Capture queue with multi-line parse,
|
|
Productivity daily_focus, GTD context types, daily focus, weekly
|
|
context_types review process, personal metrics
|
|
dashboard
|
|
|
|
Weblinks and weblinks, Organized bookmark system, recursive
|
|
Bookmarks weblink_folders folders, auto-generated project
|
|
folders, browser extension in Phase 2
|
|
--------------- ------------------- ---------------------------------------
|
|
|
|
**5.1 Subsystem Interaction Map**
|
|
|
|
> Tasks ←──────── Projects ←─── Releases
|
|
>
|
|
> │ │ │
|
|
>
|
|
> ├── Contacts ├── Processes ├── Milestones
|
|
>
|
|
> │ (waiting) │ (run tasks) │
|
|
>
|
|
> ├── Time ├── Notes └── Projects (M2M)
|
|
>
|
|
> │ Entries │ (M2M)
|
|
>
|
|
> ├── Daily ├── Decisions
|
|
>
|
|
> │ Focus │ (tabs)
|
|
>
|
|
> └── Dependencies └── Files
|
|
>
|
|
> (DAG) (polymorphic)
|
|
>
|
|
> Meetings ──── Decisions ──── Projects
|
|
>
|
|
> │ │
|
|
>
|
|
> ├── Contacts └── Contacts
|
|
>
|
|
> ├── Tasks (action items)
|
|
>
|
|
> └── Notes (auto-filed)
|
|
>
|
|
> Capture ──── any entity (polymorphic conversion)
|
|
>
|
|
> Search ──── every entity (full-text)
|
|
>
|
|
> MCP ──── every entity (Phase 2)
|
|
|
|
**5.2 Admin Subsystem**
|
|
|
|
- Trash: all soft-deleted items, grouped by entity type. Restore or
|
|
permanent delete.
|
|
|
|
- Context Types: manage GTD execution context lookup table.
|
|
|
|
- Dependency Settings: enable/disable start_to_finish dependency type.
|
|
|
|
- Export: CSV (Phase 1), JSON/PDF/Markdown (Phase 3).
|
|
|
|
- Model Registry: configure AI model connections (Phase 2).
|
|
|
|
- Theme: dark/light toggle (Phase 3).
|
|
|
|
- Storage: disk usage summary per domain.
|
|
|
|
-----------------------------------------------------------------------
|
|
**6. Data Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**6.1 Universal Column Conventions**
|
|
|
|
Every table without exception follows this field order and naming:
|
|
|
|
> id UUID PK DEFAULT gen_random_uuid()
|
|
>
|
|
> \[foreign keys\] nullable where optional
|
|
>
|
|
> \[content fields\] entity-specific
|
|
>
|
|
> tags TEXT\[\] nullable - flexible labels
|
|
>
|
|
> sort_order INT NOT NULL DEFAULT 0
|
|
>
|
|
> is_deleted BOOL NOT NULL DEFAULT false
|
|
>
|
|
> deleted_at TIMESTAMPTZ nullable
|
|
>
|
|
> created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
>
|
|
> updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
|
|
+-----------------------------------------------------------------------+
|
|
| **Search Vector Convention** |
|
|
| |
|
|
| All searchable tables additionally carry: search_vector TSVECTOR. A |
|
|
| PostgreSQL trigger maintains this column automatically on |
|
|
| insert/update. A GIN index on search_vector enables fast full-text |
|
|
| queries. |
|
|
+-----------------------------------------------------------------------+
|
|
|
|
**6.2 Core Hierarchy Tables**
|
|
|
|
**domains**
|
|
|
|
----------------- ----------------- ----------------- -----------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
name TEXT No Work, Personal,
|
|
Business
|
|
|
|
color TEXT Yes Hex color #RRGGBB
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at TIMESTAMPTZ No
|
|
|
|
updated_at TIMESTAMPTZ No
|
|
----------------- ----------------- ----------------- -----------------
|
|
|
|
**areas**
|
|
|
|
----------------- ----------------- ----------------- -----------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
domain_id UUID No FK domains
|
|
CASCADE
|
|
|
|
name TEXT No
|
|
|
|
description TEXT Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- -----------------
|
|
|
|
**projects**
|
|
|
|
----------------- ----------------- ----------------- --------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
domain_id UUID No FK domains
|
|
|
|
area_id UUID Yes FK areas (optional grouping)
|
|
|
|
name TEXT No
|
|
|
|
description TEXT Yes
|
|
|
|
status TEXT No active\|on_hold\|completed\|archived
|
|
|
|
due_date DATE Yes
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- --------------------------------------
|
|
|
|
**tasks**
|
|
|
|
------------------------ ----------------- ----------------- ---------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
domain_id UUID Yes FK domains
|
|
|
|
area_id UUID Yes FK areas
|
|
|
|
project_id UUID Yes FK projects (null=standalone)
|
|
|
|
release_id UUID Yes FK releases (null=backlog)
|
|
|
|
parent_id UUID Yes Self-ref for subtasks
|
|
|
|
title TEXT No
|
|
|
|
description TEXT Yes
|
|
|
|
priority INT No 1=critical 2=high 3=normal 4=low
|
|
|
|
status TEXT No open\|in_progress\|blocked\|done\|cancelled
|
|
|
|
due_date DATE Yes Soft target
|
|
|
|
deadline TIMESTAMPTZ Yes Hard deadline
|
|
|
|
recurrence TEXT Yes null\|daily\|weekly\|monthly
|
|
|
|
estimated_minutes INT Yes Time estimate
|
|
|
|
energy_required TEXT Yes high\|medium\|low
|
|
|
|
context TEXT Yes FK context_types.value
|
|
|
|
is_custom_context BOOL Yes True if free-text context
|
|
|
|
waiting_for_contact_id UUID Yes FK contacts - delegated to
|
|
|
|
waiting_since DATE Yes Date delegation started
|
|
|
|
import_batch_id UUID Yes Groups bulk-imported tasks
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
completed_at TIMESTAMPTZ Yes Set when status=done
|
|
|
|
created_at / updated_at TIMESTAMPTZ No
|
|
------------------------ ----------------- ----------------- ---------------------------------------------
|
|
|
|
**notes**
|
|
|
|
----------------- ----------------- ----------------- -----------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
domain_id UUID Yes FK domains
|
|
|
|
project_id UUID Yes FK projects
|
|
(primary project)
|
|
|
|
folder_id UUID Yes FK note_folders
|
|
(one folder)
|
|
|
|
meeting_id UUID Yes FK meetings if
|
|
meeting note
|
|
|
|
title TEXT No Required
|
|
|
|
body TEXT Yes Rich text content
|
|
|
|
content_format TEXT No Default: rich
|
|
|
|
is_meeting_note BOOL No Default false
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- -----------------
|
|
|
|
**note_folders**
|
|
|
|
----------------- ----------------- ----------------- -----------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
parent_id UUID Yes Self-ref
|
|
recursive
|
|
|
|
name TEXT No
|
|
|
|
auto_generated BOOL No True for system
|
|
meeting folders
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- -----------------
|
|
|
|
**lists and list_items**
|
|
|
|
----------------- ----------------- ----------------- -------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (lists) UUID No PK
|
|
|
|
domain_id UUID Yes FK domains
|
|
|
|
area_id UUID Yes FK areas
|
|
|
|
project_id UUID Yes FK projects
|
|
|
|
name TEXT No
|
|
|
|
list_type TEXT No checklist\|ordered\|unordered
|
|
|
|
description TEXT Yes
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- list_items \-\--
|
|
|
|
id (list_items) UUID No PK
|
|
|
|
list_id UUID No FK lists
|
|
|
|
parent_item_id UUID Yes Self-ref for nested items
|
|
|
|
content TEXT No
|
|
|
|
completed BOOL No Default false
|
|
|
|
completed_at TIMESTAMPTZ Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
----------------- ----------------- ----------------- -------------------------------
|
|
|
|
**links and files**
|
|
|
|
------------------- ----------------- ----------------- ----------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (links) UUID No PK
|
|
|
|
domain_id UUID Yes
|
|
|
|
project_id UUID Yes
|
|
|
|
label TEXT No Display name
|
|
|
|
url TEXT No Full URL
|
|
|
|
description TEXT Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- files \-\--
|
|
|
|
id (files) UUID No PK
|
|
|
|
filename TEXT No UUID-prefixed storage name
|
|
|
|
original_filename TEXT No User-facing name
|
|
|
|
storage_path TEXT No /opt/lifeos/files/{env}/{uuid}\_{name}
|
|
|
|
mime_type TEXT Yes
|
|
|
|
size_bytes INT Yes
|
|
|
|
description TEXT Yes
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
------------------- ----------------- ----------------- ----------------------------------------
|
|
|
|
Files associate to entities via file_mappings junction (polymorphic). No
|
|
direct FK on the files table.
|
|
|
|
**6.3 System Level Tables**
|
|
|
|
**contacts**
|
|
|
|
----------------- ----------------- ----------------- -----------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
first_name TEXT No
|
|
|
|
last_name TEXT Yes
|
|
|
|
company TEXT Yes
|
|
|
|
role TEXT Yes Job title
|
|
|
|
email TEXT Yes
|
|
|
|
phone TEXT Yes
|
|
|
|
notes TEXT Yes Free text
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- -----------------
|
|
|
|
**appointments**
|
|
|
|
----------------- ----------------- ----------------- ------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
title TEXT No
|
|
|
|
start_at TIMESTAMPTZ No
|
|
|
|
end_at TIMESTAMPTZ Yes
|
|
|
|
all_day BOOL No Default false
|
|
|
|
location TEXT Yes
|
|
|
|
description TEXT Yes
|
|
|
|
recurrence TEXT Yes null\|daily\|weekly\|monthly
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- ------------------------------
|
|
|
|
**meetings**
|
|
|
|
----------------- ----------------- ----------------- ---------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
parent_id UUID Yes Self-ref: links instance to
|
|
series anchor
|
|
|
|
title TEXT No
|
|
|
|
meeting_date DATE No
|
|
|
|
start_at TIMESTAMPTZ Yes
|
|
|
|
end_at TIMESTAMPTZ Yes
|
|
|
|
location TEXT Yes Zoom, Google Meet, room name
|
|
|
|
status TEXT No scheduled\|completed\|cancelled
|
|
|
|
priority INT Yes 1=critical to 4=low
|
|
|
|
recurrence TEXT Yes For standing meetings
|
|
|
|
agenda TEXT Yes Rich text pre-meeting
|
|
|
|
transcript TEXT Yes Pasted from recording service
|
|
|
|
notes_body TEXT Yes Rich text during/post meeting
|
|
|
|
sort_order INT No Default sort: date desc
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
----------------- ----------------- ----------------- ---------------------------------
|
|
|
|
**decisions**
|
|
|
|
------------------ ----------------- ----------------- ------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
title TEXT No Summary of the decision
|
|
|
|
rationale TEXT Yes Full reasoning, rich text
|
|
|
|
status TEXT No proposed\|accepted\|rejected\|superseded
|
|
|
|
impact TEXT No low\|medium\|high
|
|
|
|
decided_at DATE Yes When decision was made (outside meeting
|
|
too)
|
|
|
|
meeting_id UUID Yes FK meetings (optional)
|
|
|
|
superseded_by_id UUID Yes Self-ref FK decisions
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
------------------ ----------------- ----------------- ------------------------------------------
|
|
|
|
**releases and milestones**
|
|
|
|
----------------- ----------------- ----------------- -------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (releases) UUID No PK - System level, not under a project
|
|
|
|
name TEXT No Release 1.0, First Draft, Beta
|
|
|
|
version_label TEXT Yes 1.0.0, v2, Draft-1
|
|
|
|
description TEXT Yes
|
|
|
|
status TEXT No planned\|in_progress\|released\|cancelled
|
|
|
|
target_date DATE Yes
|
|
|
|
released_at DATE Yes Actual release date
|
|
|
|
release_notes TEXT Yes Rich text changelog
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
|
|
\-\-- \-\-- \-\-- \-\-- milestones \-\--
|
|
|
|
id (milestones) UUID No PK
|
|
|
|
release_id UUID Yes FK releases (optional)
|
|
|
|
project_id UUID Yes FK projects (optional)
|
|
|
|
name TEXT No
|
|
|
|
target_date DATE No
|
|
|
|
completed_at DATE Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
----------------- ----------------- ----------------- -------------------------------------------
|
|
|
|
**processes, process_steps, process_runs, process_run_steps**
|
|
|
|
--------------------- ----------------- ----------------- ------------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (processes) UUID No PK
|
|
|
|
name TEXT No Publish a Book, Client Onboarding
|
|
|
|
description TEXT Yes
|
|
|
|
process_type TEXT No workflow\|checklist - key distinction
|
|
|
|
category TEXT Yes operational\|creative\|admin\|technical
|
|
|
|
status TEXT No draft\|active\|deprecated
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
\-\-- \-\-- \-\-- \-\-- process_steps \-\--
|
|
|
|
id (process_steps) UUID No PK
|
|
|
|
process_id UUID No FK processes
|
|
|
|
title TEXT No
|
|
|
|
instructions TEXT Yes Rich text
|
|
|
|
expected_output TEXT Yes
|
|
|
|
estimated_days INT Yes
|
|
|
|
context TEXT Yes FK context_types.value
|
|
|
|
sort_order INT No Sequential order
|
|
|
|
\-\-- \-\-- \-\-- \-\-- process_runs \-\--
|
|
|
|
id (process_runs) UUID No PK
|
|
|
|
process_id UUID No FK processes (source template)
|
|
|
|
title TEXT No Onboard ACME Corp - Mar 2026
|
|
|
|
status TEXT No not_started\|in_progress\|completed\|cancelled
|
|
|
|
process_type TEXT No Copied from template at run creation
|
|
|
|
task_generation TEXT No all_at_once\|step_by_step
|
|
|
|
project_id UUID Yes FK projects (optional context)
|
|
|
|
contact_id UUID Yes FK contacts (optional context)
|
|
|
|
started_at TIMESTAMPTZ Yes
|
|
|
|
completed_at TIMESTAMPTZ Yes
|
|
|
|
\-\-- \-\-- \-\-- \-\-- process_run_steps \-\--
|
|
|
|
id UUID No PK
|
|
(process_run_steps)
|
|
|
|
run_id UUID No FK process_runs
|
|
|
|
title TEXT No Copied from process_step - immutable
|
|
|
|
instructions TEXT Yes Copied from process_step - immutable
|
|
|
|
status TEXT No pending\|in_progress\|done\|skipped
|
|
|
|
completed_by_id UUID Yes FK contacts
|
|
|
|
completed_at TIMESTAMPTZ Yes
|
|
|
|
notes TEXT Yes
|
|
|
|
sort_order INT No
|
|
--------------------- ----------------- ----------------- ------------------------------------------------
|
|
|
|
**time management tables**
|
|
|
|
------------------ ----------------- ----------------- ----------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (time_entries) UUID No PK
|
|
|
|
task_id UUID No FK tasks
|
|
|
|
start_at TIMESTAMPTZ No
|
|
|
|
end_at TIMESTAMPTZ Yes null if timer running
|
|
|
|
duration_minutes INT Yes Calculated on stop
|
|
|
|
notes TEXT Yes
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at TIMESTAMPTZ No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- time_blocks \-\--
|
|
|
|
id (time_blocks) UUID No PK
|
|
|
|
task_id UUID Yes FK tasks (optional - block
|
|
can be contextual)
|
|
|
|
title TEXT No
|
|
|
|
context TEXT Yes deep_work\|meetings\|admin
|
|
|
|
energy TEXT Yes high\|medium\|low
|
|
|
|
start_at TIMESTAMPTZ No
|
|
|
|
end_at TIMESTAMPTZ No
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at / TIMESTAMPTZ No
|
|
updated_at
|
|
|
|
\-\-- \-\-- \-\-- \-\-- time_budgets \-\--
|
|
|
|
id (time_budgets) UUID No PK
|
|
|
|
domain_id UUID No FK domains
|
|
|
|
weekly_hours DECIMAL No Target hours per week
|
|
|
|
effective_from DATE No
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at TIMESTAMPTZ No
|
|
------------------ ----------------- ----------------- ----------------------------
|
|
|
|
**supporting system tables**
|
|
|
|
------------------- ----------------- ----------------- ----------------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id (daily_focus) UUID No PK
|
|
|
|
focus_date DATE No
|
|
|
|
task_id UUID No FK tasks
|
|
|
|
slot INT Yes Display order - position is the priority signal
|
|
|
|
completed BOOL No Default false
|
|
|
|
note TEXT Yes
|
|
|
|
created_at TIMESTAMPTZ No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- capture \-\--
|
|
|
|
id (capture) UUID No PK
|
|
|
|
raw_text TEXT No
|
|
|
|
processed BOOL No Default false
|
|
|
|
converted_to_type TEXT Yes task\|project\|note\|list\|contact\|decision\|link
|
|
|
|
converted_to_id UUID Yes Polymorphic FK
|
|
|
|
area_id UUID Yes Context at capture time
|
|
|
|
project_id UUID Yes Context at capture time
|
|
|
|
list_id UUID Yes Context at capture time
|
|
|
|
import_batch_id UUID Yes Groups multi-line paste imports
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at TIMESTAMPTZ No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- task_templates \-\--
|
|
|
|
id (task_templates) UUID No PK
|
|
|
|
name TEXT No New Client Onboarding
|
|
|
|
description TEXT Yes
|
|
|
|
priority INT Yes Default priority
|
|
|
|
estimated_minutes INT Yes
|
|
|
|
energy_required TEXT Yes
|
|
|
|
context TEXT Yes
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- task_template_items \-\--
|
|
|
|
id UUID No PK
|
|
|
|
template_id UUID No FK task_templates
|
|
|
|
title TEXT No
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
------------------- ----------------- ----------------- ----------------------------------------------------
|
|
|
|
**weblinks, context_types, reminders**
|
|
|
|
------------------- ----------------- ----------------- -----------------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
(weblink_folders)
|
|
|
|
parent_id UUID Yes Self-ref recursive
|
|
|
|
name TEXT No
|
|
|
|
auto_generated BOOL No True for system project folders
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- weblinks \-\--
|
|
|
|
id (weblinks) UUID No PK
|
|
|
|
label TEXT No Display name
|
|
|
|
url TEXT No Full URL
|
|
|
|
description TEXT Yes
|
|
|
|
tags TEXT\[\] Yes
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- context_types \-\--
|
|
|
|
id SERIAL No Integer PK (not UUID)
|
|
|
|
value TEXT No deep_work\|quick\|waiting\|someday\|meeting\|errand
|
|
|
|
label TEXT No Display label
|
|
|
|
is_system BOOL No True for built-in types
|
|
|
|
sort_order INT No
|
|
|
|
is_deleted BOOL No
|
|
|
|
\-\-- \-\-- \-\-- \-\-- reminders \-\--
|
|
|
|
id UUID No PK
|
|
|
|
entity_type TEXT No contact\|task\|meeting\|appointment
|
|
|
|
entity_id UUID No Polymorphic FK
|
|
|
|
remind_at TIMESTAMPTZ No When to surface
|
|
|
|
note TEXT Yes Follow up re: contract renewal
|
|
|
|
delivered BOOL No False until shown in UI
|
|
|
|
is_deleted BOOL No
|
|
|
|
created_at TIMESTAMPTZ No
|
|
------------------- ----------------- ----------------- -----------------------------------------------------
|
|
|
|
**6.4 Junction Tables**
|
|
|
|
---------------------- --------------------- -----------------------------------
|
|
**Junction Table** **Connects** **Key Columns**
|
|
|
|
note_projects notes \<-\> projects is_primary BOOL
|
|
|
|
note_links notes \<-\> notes source_note_id, target_note_id
|
|
(wiki graph)
|
|
|
|
file_mappings files \<-\> any context_type TEXT, context_id UUID
|
|
entity
|
|
|
|
release_projects releases \<-\> (no extra)
|
|
projects
|
|
|
|
release_domains releases \<-\> (no extra - optional context)
|
|
domains
|
|
|
|
contact_tasks contacts \<-\> tasks role TEXT
|
|
|
|
contact_projects contacts \<-\> role TEXT
|
|
projects
|
|
|
|
contact_lists contacts \<-\> lists role TEXT
|
|
|
|
contact_list_items contacts \<-\> role TEXT
|
|
list_items
|
|
|
|
contact_appointments contacts \<-\> role TEXT
|
|
appointments
|
|
|
|
contact_meetings contacts \<-\> role TEXT
|
|
meetings (organizer\|attendee\|optional)
|
|
|
|
decision_projects decisions \<-\> (no extra)
|
|
projects
|
|
|
|
decision_contacts decisions \<-\> role TEXT
|
|
contacts (proposer\|approver\|stakeholder)
|
|
|
|
meeting_tasks meetings \<-\> tasks source TEXT
|
|
(discussed\|action_item)
|
|
|
|
process_run_tasks process_run_steps run_step_id FK
|
|
\<-\> tasks
|
|
|
|
folder_weblinks weblink_folders \<-\> (no extra)
|
|
weblinks
|
|
---------------------- --------------------- -----------------------------------
|
|
|
|
**6.5 Dependencies Table**
|
|
|
|
One polymorphic table handles all dependency relationships across all
|
|
entity types. Full DAG support.
|
|
|
|
----------------- ----------------- ----------------- --------------------------------------------------------------------
|
|
**Column** **Type** **Nullable** **Description**
|
|
|
|
id UUID No PK
|
|
|
|
blocker_type TEXT No task\|project\|process_step\|process_run
|
|
|
|
blocker_id UUID No
|
|
|
|
dependent_type TEXT No task\|project\|process_step\|process_run
|
|
|
|
dependent_id UUID No
|
|
|
|
dependency_type TEXT No finish_to_start\|finish_to_finish\|start_to_start\|start_to_finish
|
|
|
|
lag_days INT No Default 0
|
|
|
|
note TEXT Yes
|
|
|
|
is_deleted BOOL No Default false
|
|
|
|
deleted_at TIMESTAMPTZ Yes
|
|
|
|
created_at TIMESTAMPTZ No Auto
|
|
----------------- ----------------- ----------------- --------------------------------------------------------------------
|
|
|
|
Indexes: idx_dependencies_blocker (blocker_type, blocker_id),
|
|
idx_dependencies_dependent (dependent_type, dependent_id)
|
|
|
|
Constraints: UNIQUE (blocker_type, blocker_id, dependent_type,
|
|
dependent_id, dependency_type), CHECK no self-dependency
|
|
|
|
**6.6 Complete Table Inventory (50 tables)**
|
|
|
|
------------------------ --------------------- -------------------------
|
|
**Table** **Category** **Phase**
|
|
|
|
domains Core hierarchy 1
|
|
|
|
areas Core hierarchy 1
|
|
|
|
projects Core hierarchy 1
|
|
|
|
tasks Core hierarchy 1
|
|
|
|
notes Core hierarchy 1
|
|
|
|
note_folders Core hierarchy 1
|
|
|
|
lists Core hierarchy 1
|
|
|
|
list_items Core hierarchy 1
|
|
|
|
links Core hierarchy 1
|
|
|
|
files Core hierarchy 1
|
|
|
|
contacts System level 1
|
|
|
|
appointments System level 1
|
|
|
|
meetings System level 1
|
|
|
|
decisions System level 1
|
|
|
|
releases System level 1
|
|
|
|
milestones System level 1
|
|
|
|
processes System level 1
|
|
|
|
process_steps System level 1
|
|
|
|
process_runs System level 1
|
|
|
|
process_run_steps System level 1
|
|
|
|
daily_focus System level 1
|
|
|
|
capture System level 1
|
|
|
|
task_templates System level 1
|
|
|
|
task_template_items System level 1
|
|
|
|
time_entries Time management 1
|
|
|
|
time_blocks Time management 1
|
|
|
|
time_budgets Time management 1
|
|
|
|
weblink_folders System level 1
|
|
|
|
weblinks System level 1
|
|
|
|
context_types Lookup 1
|
|
|
|
reminders System level 1
|
|
|
|
dependencies Universal junction 1
|
|
|
|
note_projects Junction 1
|
|
|
|
note_links Junction 1
|
|
|
|
file_mappings Junction 1
|
|
|
|
release_projects Junction 1
|
|
|
|
release_domains Junction 1
|
|
|
|
contact_tasks Junction 1
|
|
|
|
contact_projects Junction 1
|
|
|
|
contact_lists Junction 1
|
|
|
|
contact_list_items Junction 1
|
|
|
|
contact_appointments Junction 1
|
|
|
|
contact_meetings Junction 1
|
|
|
|
decision_projects Junction 1
|
|
|
|
decision_contacts Junction 1
|
|
|
|
meeting_tasks Junction 1
|
|
|
|
process_run_tasks Junction 1
|
|
|
|
folder_weblinks Junction 1
|
|
|
|
note_version_history Knowledge mgmt 2
|
|
|
|
pipelines CRM 2
|
|
------------------------ --------------------- -------------------------
|
|
|
|
-----------------------------------------------------------------------
|
|
**7. Application Layer Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**7.1 Technology Stack**
|
|
|
|
---------------- ------------------------------------------------------
|
|
**Language** Python 3.12
|
|
|
|
**Framework** FastAPI (async)
|
|
|
|
**ORM** SQLAlchemy 2.0 async + psycopg3
|
|
|
|
**Templates** Jinja2 (server-rendered HTML)
|
|
|
|
**Forms** Standard HTML POST, python-multipart
|
|
|
|
**Search** PostgreSQL tsvector/tsquery (no external service)
|
|
|
|
**File python-multipart, aiofiles
|
|
handling**
|
|
|
|
**Config** python-dotenv, YAML for entity/menu config
|
|
|
|
**Validation** Pydantic v2 models for request/response
|
|
|
|
**Testing** pytest-asyncio, httpx
|
|
---------------- ------------------------------------------------------
|
|
|
|
**7.2 Project File Structure**
|
|
|
|
> life-os/
|
|
>
|
|
> main.py FastAPI app init, middleware, router includes
|
|
>
|
|
> config/
|
|
>
|
|
> entities.yaml Config-driven entity definitions (12 simple entities)
|
|
>
|
|
> menu.yaml Sidebar navigation config
|
|
>
|
|
> search.yaml Searchable entities and field weights
|
|
>
|
|
> core/
|
|
>
|
|
> database.py Async engine, session factory
|
|
>
|
|
> base_repository.py BaseRepository:
|
|
> list/get/create/update/soft_delete/restore
|
|
>
|
|
> generic_router.py Config-driven CRUD router for simple entities
|
|
>
|
|
> generic_templates.py Template context builder for config-driven views
|
|
>
|
|
> search.py Global search implementation
|
|
>
|
|
> dependencies.py DAG cycle detection, status cascade
|
|
>
|
|
> reminders.py Reminder surfacing on dashboard load
|
|
>
|
|
> timer.py Time tracking start/stop logic
|
|
>
|
|
> routers/
|
|
>
|
|
> tasks.py Task CRUD + subtasks + templates + bulk actions
|
|
>
|
|
> projects.py Project CRUD + progress calculation
|
|
>
|
|
> releases.py Release CRUD + multi-project aggregation
|
|
>
|
|
> meetings.py Meeting CRUD + action items + series
|
|
>
|
|
> decisions.py Decision CRUD + supersession chain
|
|
>
|
|
> processes.py Template CRUD + run management + task generation
|
|
>
|
|
> capture.py Queue management + multi-line parse + conversion
|
|
>
|
|
> focus.py Daily focus list management
|
|
>
|
|
> notes.py Note CRUD + wiki links + folder management
|
|
>
|
|
> search.py Global search endpoint
|
|
>
|
|
> files.py Upload + download + preview routing
|
|
>
|
|
> calendar.py Unified calendar view (appointments + meetings + tasks)
|
|
>
|
|
> admin.py Trash + context types + settings + export
|
|
>
|
|
> dashboard.py Dashboard aggregation + metrics widget
|
|
>
|
|
> time.py Time entries + blocks + budget views
|
|
>
|
|
> eisenhower.py Matrix view derivation
|
|
>
|
|
> \[generic entities\] domains, areas, contacts, weblinks, etc via
|
|
> generic_router
|
|
>
|
|
> templates/
|
|
>
|
|
> base.html Shell: topbar, sidebar, JS includes, theme classes
|
|
>
|
|
> \_list.html Generic list template (all entities)
|
|
>
|
|
> \_detail.html Generic detail shell (tabs, breadcrumb, header)
|
|
>
|
|
> \_form.html Generic create/edit form
|
|
>
|
|
> \_empty.html Generic empty state component
|
|
>
|
|
> dashboard.html Dashboard with widgets
|
|
>
|
|
> focus.html Daily focus view
|
|
>
|
|
> tasks.html Task list (extends \_list.html)
|
|
>
|
|
> task_detail.html Task detail with dependencies panel
|
|
>
|
|
> project_detail.html Project detail with tabs
|
|
>
|
|
> release_detail.html Release detail with multi-project view
|
|
>
|
|
> meeting_detail.html Meeting detail with action items
|
|
>
|
|
> process_detail.html Process template + runs
|
|
>
|
|
> note_detail.html Note editor with wiki link support
|
|
>
|
|
> calendar.html Calendar view
|
|
>
|
|
> eisenhower.html Eisenhower matrix view
|
|
>
|
|
> capture_queue.html Capture review and convert
|
|
>
|
|
> admin_trash.html Trash recovery view
|
|
>
|
|
> search_results.html Global search results
|
|
>
|
|
> static/
|
|
>
|
|
> style.css All styles (dark theme, light theme, components)
|
|
>
|
|
> app.js Sidebar collapse, search modal, timer, theme toggle
|
|
>
|
|
> sortable.js Drag-to-reorder (SortableJS CDN or local)
|
|
>
|
|
> requirements.txt
|
|
>
|
|
> .env NEVER committed to git
|
|
>
|
|
> docker-compose.yml
|
|
|
|
**7.3 Router Anatomy**
|
|
|
|
All routers follow this identical pattern regardless of entity
|
|
complexity:
|
|
|
|
> from fastapi import APIRouter, Request, Form, Depends
|
|
>
|
|
> from core.base_repository import BaseRepository
|
|
>
|
|
> from core.database import get_db
|
|
>
|
|
> router = APIRouter(prefix=\'/tasks\', tags=\[\'tasks\'\])
|
|
>
|
|
> templates = Jinja2Templates(directory=\'templates\')
|
|
>
|
|
> \@router.get(\'/\')
|
|
>
|
|
> async def list_tasks(request: Request, db=Depends(get_db),
|
|
> \...filters):
|
|
>
|
|
> repo = TaskRepository(db)
|
|
>
|
|
> items = await repo.list(filters=filters, sort=sort)
|
|
>
|
|
> sidebar = await get_sidebar_data(db)
|
|
>
|
|
> return templates.TemplateResponse(\'tasks.html\', {
|
|
>
|
|
> \'request\': request, \'items\': items, \'sidebar\': sidebar
|
|
>
|
|
> })
|
|
>
|
|
> \@router.post(\'/create\')
|
|
>
|
|
> async def create_task(request: Request, db=Depends(get_db),
|
|
> \...fields):
|
|
>
|
|
> repo = TaskRepository(db)
|
|
>
|
|
> task = await repo.create({\...fields})
|
|
>
|
|
> return RedirectResponse(url=f\'/tasks/{task.id}\', status_code=303)
|
|
|
|
-----------------------------------------------------------------------
|
|
**8. Generic Code Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
The generic architecture reduces code volume by 40-45% and ensures
|
|
consistency across all entities. Three layers work together:
|
|
BaseRepository handles all common data operations, config-driven
|
|
entities eliminate entity-specific code entirely for simple entities,
|
|
and the menu/sidebar is fully configuration-driven.
|
|
|
|
**8.1 Entity Classification**
|
|
|
|
-------------------- ------------------------ ------------------------------
|
|
**Classification** **Entities** **Approach**
|
|
|
|
Fully config-driven domains, areas, entities.yaml config +
|
|
(zero custom code) context_types, weblinks, generic_router.py +
|
|
weblink_folders, \_list.html + \_form.html
|
|
note_folders,
|
|
time_budgets,
|
|
task_templates,
|
|
task_template_items,
|
|
milestones,
|
|
release_domains,
|
|
release_projects
|
|
|
|
Generic base + contacts, appointments, BaseRepository extended with
|
|
overrides notes, links, files, custom methods. Standard
|
|
meetings, decisions, templates with entity-specific
|
|
releases, processes, blocks.
|
|
process_steps,
|
|
list_items, lists,
|
|
time_blocks,
|
|
time_entries, reminders,
|
|
note_links,
|
|
file_mappings
|
|
|
|
Substantially custom tasks, projects, Full custom router.
|
|
logic process_runs, BaseRepository as foundation.
|
|
process_run_steps, Business logic in dedicated
|
|
daily_focus, capture, service classes.
|
|
dependencies, search,
|
|
releases (aggregate),
|
|
task_templates
|
|
(instantiate), all
|
|
contact junction tables
|
|
-------------------- ------------------------ ------------------------------
|
|
|
|
**8.2 BaseRepository**
|
|
|
|
> class BaseRepository:
|
|
>
|
|
> def \_\_init\_\_(self, table: str, db: AsyncSession):
|
|
>
|
|
> self.table = table
|
|
>
|
|
> self.db = db
|
|
>
|
|
> async def list(self, filters={}, sort=\'sort_order\',
|
|
>
|
|
> page=1, per_page=50) -\> list:
|
|
>
|
|
> \# Adds WHERE is_deleted=false automatically
|
|
>
|
|
> \# Applies filter dict as WHERE clauses
|
|
>
|
|
> \# Applies sort with fallback to created_at
|
|
>
|
|
> async def get(self, id: UUID) -\> dict \| None:
|
|
>
|
|
> async def create(self, data: dict) -\> dict:
|
|
>
|
|
> \# Auto-sets created_at, updated_at, is_deleted=false
|
|
>
|
|
> \# Updates search_vector via trigger
|
|
>
|
|
> async def update(self, id: UUID, data: dict) -\> dict:
|
|
>
|
|
> \# Auto-sets updated_at
|
|
>
|
|
> async def soft_delete(self, id: UUID) -\> dict:
|
|
>
|
|
> \# Sets is_deleted=true, deleted_at=now()
|
|
>
|
|
> async def restore(self, id: UUID) -\> dict:
|
|
>
|
|
> \# Sets is_deleted=false, deleted_at=null
|
|
>
|
|
> async def bulk_soft_delete(self, ids: list\[UUID\]) -\> int:
|
|
>
|
|
> async def list_deleted(self) -\> list:
|
|
>
|
|
> \# Used by Admin \> Trash
|
|
>
|
|
> async def permanent_delete(self, id: UUID) -\> bool:
|
|
>
|
|
> \# Actual SQL DELETE - Admin only
|
|
|
|
**8.3 Config-Driven Entity Definition**
|
|
|
|
> \# config/entities.yaml
|
|
>
|
|
> domains:
|
|
>
|
|
> table: domains
|
|
>
|
|
> display_name: Domain
|
|
>
|
|
> display_plural: Domains
|
|
>
|
|
> icon: grid
|
|
>
|
|
> fields:
|
|
>
|
|
> \- name: name type: text required: true label: Domain Name
|
|
>
|
|
> \- name: color type: color required: false label: Color
|
|
>
|
|
> list_columns: \[name, color, created_at\]
|
|
>
|
|
> searchable: \[name\]
|
|
>
|
|
> sort_default: sort_order
|
|
>
|
|
> allow_reorder: true
|
|
>
|
|
> contacts:
|
|
>
|
|
> table: contacts
|
|
>
|
|
> display_name: Contact
|
|
>
|
|
> fields:
|
|
>
|
|
> \- name: first_name type: text required: true
|
|
>
|
|
> \- name: last_name type: text
|
|
>
|
|
> \- name: company type: text
|
|
>
|
|
> \- name: email type: email
|
|
>
|
|
> \- name: phone type: tel
|
|
>
|
|
> \- name: notes type: textarea
|
|
>
|
|
> \- name: tags type: tags
|
|
>
|
|
> list_columns: \[first_name, last_name, company, email\]
|
|
>
|
|
> searchable: \[first_name, last_name, company, email\]
|
|
|
|
**8.4 Config-Driven Sidebar**
|
|
|
|
> \# config/menu.yaml
|
|
>
|
|
> system_items:
|
|
>
|
|
> \- id: dashboard label: Dashboard icon: grid route: /
|
|
>
|
|
> \- id: focus label: Focus icon: target route: /focus badge:
|
|
> focus_count
|
|
>
|
|
> \- id: tasks label: All Tasks icon: check route: /tasks
|
|
>
|
|
> \- id: calendar label: Calendar icon: calendar route: /calendar
|
|
>
|
|
> \- id: meetings label: Meetings icon: users route: /meetings
|
|
>
|
|
> \- id: decisions label: Decisions icon: diamond route: /decisions
|
|
>
|
|
> \- id: releases label: Releases icon: tag route: /releases
|
|
>
|
|
> \- id: processes label: Processes icon: flow route: /processes
|
|
>
|
|
> \- id: notes label: Notes icon: file route: /notes
|
|
>
|
|
> \- id: contacts label: Contacts icon: person route: /contacts
|
|
>
|
|
> \- id: weblinks label: Weblinks icon: link route: /weblinks
|
|
>
|
|
> \- id: capture label: Capture icon: inbox route: /capture badge:
|
|
> capture_count
|
|
>
|
|
> \- id: admin label: Admin icon: settings route: /admin
|
|
>
|
|
> mobile_bottom_bar:
|
|
>
|
|
> \- id: dashboard icon: grid label: Home
|
|
>
|
|
> \- id: focus icon: target label: Focus
|
|
>
|
|
> \- id: tasks icon: check label: Tasks
|
|
>
|
|
> \- id: calendar icon: calendar label: Calendar
|
|
>
|
|
> \- id: more icon: menu label: More
|
|
>
|
|
> mobile_more_items: \[meetings, decisions, contacts, processes,
|
|
> weblinks, admin\]
|
|
|
|
-----------------------------------------------------------------------
|
|
**9. Frontend Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**9.1 Approach**
|
|
|
|
Server-rendered HTML via Jinja2 templates. No frontend framework, no
|
|
build pipeline, no npm. CSS custom properties for theming. Vanilla JS
|
|
for UI interactions only. SortableJS for drag-to-reorder (single
|
|
dependency).
|
|
|
|
**9.2 Design Tokens**
|
|
|
|
> /\* style.css - CSS custom properties \*/
|
|
>
|
|
> \[data-theme=\'dark\'\] {
|
|
>
|
|
> \--bg: #0D0E13; \--surface: #14161F;
|
|
>
|
|
> \--surface2: #1A1D28; \--border: #252836;
|
|
>
|
|
> \--text: #DDE1F5; \--muted: #5A6080;
|
|
>
|
|
> \--accent: #4F6EF7; \--accent-soft:rgba(79,110,247,.12);
|
|
>
|
|
> \--green: #22C98A; \--amber: #F5A623;
|
|
>
|
|
> \--red: #F05252; \--purple: #9B7FF5;
|
|
>
|
|
> }
|
|
>
|
|
> \[data-theme=\'light\'\] {
|
|
>
|
|
> \--bg: #F0F2F8; \--surface: #FFFFFF;
|
|
>
|
|
> \--surface2: #F7F8FC; \--border: #E3E6F0;
|
|
>
|
|
> \--text: #171926; \--muted: #8892B0;
|
|
>
|
|
> \--accent: #4F6EF7; \--accent-soft:rgba(79,110,247,.10);
|
|
>
|
|
> \--green: #10B981; \--amber: #F59E0B;
|
|
>
|
|
> \--red: #DC2626;
|
|
>
|
|
> }
|
|
|
|
**9.3 Universal Layout Patterns**
|
|
|
|
**These patterns apply identically to every screen. Learn once, apply
|
|
everywhere.**
|
|
|
|
-----------------------------------------------------------------------
|
|
**Every list view**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
> \[Page title + count\] \[+ Add button\]
|
|
>
|
|
> \[Filter chips: Status / Domain / Priority\] \[Sort dropdown\]
|
|
>
|
|
> \[Search within this view input\]
|
|
>
|
|
> ─────────────────────────────────────────────────────────
|
|
>
|
|
> \[Row\] \[check\] \[pri\] \[Title\...\...\...\...\] \[tag\] \[proj\]
|
|
> \[date\]
|
|
>
|
|
> \[Row\] \[check\] \[pri\] \[Title\...\...\...\...\] \[tag\] \[proj\]
|
|
> \[date\]
|
|
>
|
|
> \[Empty state with CTA if no items\]
|
|
|
|
-----------------------------------------------------------------------
|
|
**Every detail view**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
> \[Breadcrumb: Domain \> Area \> Project \> Item\]
|
|
>
|
|
> \[Header: name, metadata, progress bar if applicable\]
|
|
>
|
|
> \[Tabs: Tasks \| Notes \| Lists \| Links \| Files \| Contacts \|
|
|
> Decisions\]
|
|
>
|
|
> ─────────────────────────────────────────────────────────
|
|
>
|
|
> \[Tab content: same list pattern as above\]
|
|
|
|
-----------------------------------------------------------------------
|
|
**Three action levels - always same position**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
- Row level: hover shows quick actions right-aligned (complete, edit,
|
|
delete)
|
|
|
|
- Selection level: checkbox selects reveal bulk action bar at top
|
|
|
|
- Page level: + Add button top right, always visible
|
|
|
|
**9.4 Component Library**
|
|
|
|
----------------- ---------------------- ---------------------------------
|
|
**Component** **Description** **Used in**
|
|
|
|
list-row Compact task/item row All list views
|
|
with check, pri dot,
|
|
title, meta
|
|
|
|
filter-chip Toggleable filter All list views
|
|
button with active
|
|
state
|
|
|
|
sort-dropdown Sort selector with All list views
|
|
current sort shown
|
|
|
|
entity-header Name, metadata, All detail views
|
|
progress bar, status
|
|
badge
|
|
|
|
tab-strip Horizontal tab All detail views
|
|
navigation with active
|
|
state
|
|
|
|
related-widget Polymorphic attachment Detail views
|
|
list with + link
|
|
button
|
|
|
|
search-modal Full-screen search Global (Cmd/K)
|
|
overlay with grouped
|
|
results
|
|
|
|
toast Timed/dismissible Global
|
|
notification
|
|
(success/error/undo)
|
|
|
|
confirm-dialog Destructive action Delete actions
|
|
confirmation with item
|
|
name
|
|
|
|
timer-pill Running timer display Topbar
|
|
in topbar with stop
|
|
button
|
|
|
|
empty-state Illustrated All list views
|
|
placeholder with
|
|
guidance text and CTA
|
|
|
|
skeleton Grey placeholder All views
|
|
shapes for loading
|
|
state
|
|
|
|
wiki-link Inline \[\[ trigger Note editor
|
|
for note linking
|
|
|
|
file-preview Modal for File lists
|
|
image/PDF/video inline
|
|
preview
|
|
|
|
eisenhower-grid 2x2 matrix derived Tasks view
|
|
from priority +
|
|
urgency
|
|
----------------- ---------------------- ---------------------------------
|
|
|
|
**9.5 JavaScript Responsibilities**
|
|
|
|
JS handles only UI state. No data fetching from JS. No SPA routing.
|
|
|
|
- Sidebar collapse state (localStorage persistence per domain)
|
|
|
|
- Search modal open/close (Cmd/K trigger, Escape close)
|
|
|
|
- Theme toggle (data-theme attribute on html element, localStorage)
|
|
|
|
- Timer: start/stop, elapsed display, topbar pill update
|
|
|
|
- Drag-to-reorder via SortableJS, POST to /reorder endpoint on drop
|
|
|
|
- File preview modal open/close
|
|
|
|
- Wiki link \[\[ autocomplete dropdown in note editor
|
|
|
|
- Capture multi-line paste detection and line count preview
|
|
|
|
- Toast auto-dismiss timer
|
|
|
|
- Confirm dialog show/hide
|
|
|
|
- Sidebar filter toggle per domain
|
|
|
|
-----------------------------------------------------------------------
|
|
**10. Infrastructure Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**10.1 Server**
|
|
|
|
---------------- ------------------------------------------------------
|
|
**Host** defiant-01
|
|
|
|
**IP** 46.225.166.142
|
|
|
|
**OS** Ubuntu 24.04 LTS
|
|
|
|
**CPU / RAM** As provisioned by hosting provider
|
|
|
|
**Docker** Docker Engine + docker-compose v2
|
|
|
|
**DNS A record** lifeos.invixiom.com -\> 46.225.166.142
|
|
|
|
**DNS A record** lifeos-dev.invixiom.com -\> 46.225.166.142
|
|
---------------- ------------------------------------------------------
|
|
|
|
**10.2 Docker Compose Configuration**
|
|
|
|
> version: \'3.9\'
|
|
>
|
|
> services:
|
|
>
|
|
> lifeos-db:
|
|
>
|
|
> image: postgres:16-alpine
|
|
>
|
|
> container_name: lifeos-db
|
|
>
|
|
> restart: unless-stopped
|
|
>
|
|
> environment:
|
|
>
|
|
> POSTGRES_USER: lifeos_dev
|
|
>
|
|
> POSTGRES_PASSWORD: \${DB_PASSWORD}
|
|
>
|
|
> volumes:
|
|
>
|
|
> \- pg_data:/var/lib/postgresql/data
|
|
>
|
|
> networks: \[lifeos_network\]
|
|
>
|
|
> lifeos-prod:
|
|
>
|
|
> build: .
|
|
>
|
|
> container_name: lifeos-prod
|
|
>
|
|
> restart: unless-stopped
|
|
>
|
|
> environment:
|
|
>
|
|
> DATABASE_URL:
|
|
> postgresql+asyncpg://lifeos_dev:\${DB_PASSWORD}@lifeos-db/lifeos_prod
|
|
>
|
|
> FILE_STORAGE_PATH: /opt/lifeos/files/prod
|
|
>
|
|
> ENVIRONMENT: production
|
|
>
|
|
> MCP_API_KEY: \${MCP_API_KEY}
|
|
>
|
|
> volumes:
|
|
>
|
|
> \- /opt/lifeos/files/prod:/opt/lifeos/files/prod
|
|
>
|
|
> networks: \[lifeos_network\]
|
|
>
|
|
> depends_on: \[lifeos-db\]
|
|
>
|
|
> lifeos-dev:
|
|
>
|
|
> build: .
|
|
>
|
|
> container_name: lifeos-dev
|
|
>
|
|
> restart: unless-stopped
|
|
>
|
|
> environment:
|
|
>
|
|
> DATABASE_URL:
|
|
> postgresql+asyncpg://lifeos_dev:\${DB_PASSWORD}@lifeos-db/lifeos_dev
|
|
>
|
|
> FILE_STORAGE_PATH: /opt/lifeos/files/dev
|
|
>
|
|
> ENVIRONMENT: development
|
|
>
|
|
> volumes:
|
|
>
|
|
> \- /opt/lifeos/files/dev:/opt/lifeos/files/dev
|
|
>
|
|
> \- ./:/app \# hot reload in dev
|
|
>
|
|
> networks: \[lifeos_network\]
|
|
>
|
|
> depends_on: \[lifeos-db\]
|
|
>
|
|
> \# Phase 2:
|
|
>
|
|
> \# lifeos-mcp:
|
|
>
|
|
> \# build: ./mcp
|
|
>
|
|
> \# container_name: lifeos-mcp
|
|
>
|
|
> \# environment:
|
|
>
|
|
> \# LIFEOS_API_URL: http://lifeos-prod:8002
|
|
>
|
|
> \# MCP_API_KEY: \${MCP_API_KEY}
|
|
>
|
|
> \# networks: \[lifeos_network\]
|
|
>
|
|
> volumes:
|
|
>
|
|
> pg_data:
|
|
>
|
|
> networks:
|
|
>
|
|
> lifeos_network:
|
|
>
|
|
> external: true
|
|
|
|
**10.3 Nginx Configuration**
|
|
|
|
> \# /etc/nginx/sites-available/lifeos
|
|
>
|
|
> \# HTTP -\> HTTPS redirect
|
|
>
|
|
> server {
|
|
>
|
|
> listen 80;
|
|
>
|
|
> server_name lifeos.invixiom.com lifeos-dev.invixiom.com;
|
|
>
|
|
> return 301 https://\$host\$request_uri;
|
|
>
|
|
> }
|
|
>
|
|
> \# Production
|
|
>
|
|
> server {
|
|
>
|
|
> listen 443 ssl;
|
|
>
|
|
> server_name lifeos.invixiom.com;
|
|
>
|
|
> ssl_certificate
|
|
> /etc/letsencrypt/live/lifeos.invixiom.com/fullchain.pem;
|
|
>
|
|
> ssl_certificate_key
|
|
> /etc/letsencrypt/live/lifeos.invixiom.com/privkey.pem;
|
|
>
|
|
> client_max_body_size 100M;
|
|
>
|
|
> location /static/ { alias /opt/lifeos/static/; }
|
|
>
|
|
> location /files/ {
|
|
>
|
|
> alias /opt/lifeos/files/prod/;
|
|
>
|
|
> internal; \# served only via X-Accel-Redirect from FastAPI
|
|
>
|
|
> }
|
|
>
|
|
> \# Phase 2: AI gateway
|
|
>
|
|
> \# location /ai/ { proxy_pass http://lifeos-mcp:8004/; }
|
|
>
|
|
> location / {
|
|
>
|
|
> proxy_pass http://lifeos-prod:8002;
|
|
>
|
|
> proxy_set_header Host \$host;
|
|
>
|
|
> proxy_set_header X-Real-IP \$remote_addr;
|
|
>
|
|
> }
|
|
>
|
|
> }
|
|
>
|
|
> \# Development (same structure, port 8003, lifeos-dev)
|
|
|
|
**10.4 Database Management**
|
|
|
|
-----------------------------------------------------------------------
|
|
**Backups**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
> \# Daily automated backup - cron job
|
|
>
|
|
> 0 3 \* \* \* docker exec lifeos-db pg_dump -U lifeos_dev lifeos_prod
|
|
> \| \\
|
|
>
|
|
> gzip \> /opt/lifeos/backups/prod\_\$(date +%Y%m%d).sql.gz
|
|
>
|
|
> \# Retention: 30 days
|
|
>
|
|
> find /opt/lifeos/backups -name \'prod\_\*.sql.gz\' -mtime +30 -delete
|
|
|
|
-----------------------------------------------------------------------
|
|
**Migrations**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
- Schema changes applied via numbered SQL migration files:
|
|
/opt/lifeos/migrations/
|
|
|
|
- Applied manually via psql inside lifeos-db container
|
|
|
|
- Migration log table tracks applied migrations
|
|
|
|
- Always apply to lifeos_dev first, verify, then apply to lifeos_prod
|
|
|
|
**10.5 Directory Structure on defiant-01**
|
|
|
|
> /opt/lifeos/
|
|
>
|
|
> backups/ Daily pg_dump archives (30-day retention)
|
|
>
|
|
> files/
|
|
>
|
|
> prod/ Production file uploads
|
|
>
|
|
> dev/ Development file uploads
|
|
>
|
|
> migrations/ Numbered SQL migration files
|
|
>
|
|
> static/ Shared static assets (CSS, JS)
|
|
>
|
|
> lifeos-setup.sh Repeatable server setup script
|
|
>
|
|
> .env Environment variables (never in git)
|
|
>
|
|
> docker-compose.yml Container definitions
|
|
>
|
|
> /var/log/nginx/
|
|
>
|
|
> lifeos_access.log 7-day retention
|
|
>
|
|
> lifeos_error.log
|
|
|
|
-----------------------------------------------------------------------
|
|
**11. Search Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**11.1 Implementation**
|
|
|
|
PostgreSQL native full-text search via tsvector/tsquery. No external
|
|
search service required. Fast at single-user scale.
|
|
|
|
> \-- Every searchable table gets:
|
|
>
|
|
> search_vector TSVECTOR
|
|
>
|
|
> \-- GIN index for fast queries:
|
|
>
|
|
> CREATE INDEX idx_tasks_search ON tasks USING GIN(search_vector);
|
|
>
|
|
> \-- Trigger maintains search_vector on insert/update:
|
|
>
|
|
> CREATE TRIGGER tasks_search_update
|
|
>
|
|
> BEFORE INSERT OR UPDATE ON tasks
|
|
>
|
|
> FOR EACH ROW EXECUTE FUNCTION
|
|
>
|
|
> tsvector_update_trigger(search_vector, \'pg_catalog.english\',
|
|
>
|
|
> \'title\', \'description\', \'tags\');
|
|
|
|
**11.2 Global Search Behavior**
|
|
|
|
- Triggered by Cmd/K from anywhere, or search icon in topbar
|
|
|
|
- 200ms debounce, instant results as you type
|
|
|
|
- Searches all entities in parallel async queries
|
|
|
|
- Results grouped by entity type, most relevant section first
|
|
|
|
- Every result shows full context path: Title -\> Project -\> Domain
|
|
|
|
- Recent searches shown before typing (last 10, localStorage)
|
|
|
|
- Filter within results by entity type, domain, date range, status
|
|
|
|
**11.3 Scoped Search**
|
|
|
|
- Default to current project/domain scope when inside a context
|
|
|
|
- One click or Cmd+Shift+K to expand to global scope
|
|
|
|
- Scope indicator shown in search bar placeholder text
|
|
|
|
**11.4 Searchable Entities**
|
|
|
|
tasks, projects, notes, lists, list_items, contacts, appointments,
|
|
meetings, decisions, processes, weblinks, files, capture, links,
|
|
releases, milestones
|
|
|
|
-----------------------------------------------------------------------
|
|
**12. Time Management Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**12.1 Components**
|
|
|
|
---------------- ---------------------- -------------------------------
|
|
**Component** **Purpose** **Data source**
|
|
|
|
Time estimates How long a task should User input at task create/edit
|
|
take
|
|
(estimated_minutes on
|
|
tasks)
|
|
|
|
Time tracking How long a task Start/stop timer per task
|
|
actually took
|
|
(time_entries table)
|
|
|
|
Time budgets Weekly hour targets User configures in Admin
|
|
per domain
|
|
(time_budgets table)
|
|
|
|
Time blocks Reserved calendar User creates on Calendar view
|
|
slots (time_blocks
|
|
table)
|
|
|
|
Eisenhower Importance vs urgency Derived from priority + due
|
|
Matrix view of current tasks date
|
|
|
|
Availability Open time after blocks Derived from calendar + blocks
|
|
view and appointments
|
|
|
|
Dashboard widget Today: Xh estimated vs Derived on load, cached 5min
|
|
Xh available
|
|
|
|
Weekly metrics Tasks done, hours Derived, aggregated on load
|
|
logged, meetings,
|
|
decisions
|
|
---------------- ---------------------- -------------------------------
|
|
|
|
**12.2 Timer Flow**
|
|
|
|
> User clicks timer button on task row
|
|
>
|
|
> -\> POST /time/start {task_id}
|
|
>
|
|
> -\> Creates time_entries row: start_at=now(), end_at=null
|
|
>
|
|
> -\> Returns entry_id
|
|
>
|
|
> -\> JS updates topbar timer pill with running indicator
|
|
>
|
|
> User clicks stop in topbar pill
|
|
>
|
|
> -\> POST /time/stop {entry_id}
|
|
>
|
|
> -\> Sets end_at=now(), calculates duration_minutes
|
|
>
|
|
> -\> Returns updated entry
|
|
>
|
|
> -\> Topbar pill clears
|
|
>
|
|
> -\> Task row shows updated total logged time
|
|
|
|
Only one timer can run at a time. Starting a new timer auto-stops any
|
|
running timer.
|
|
|
|
**12.3 Overcommitment Surfacing**
|
|
|
|
> Dashboard load:
|
|
>
|
|
> 1\. Get today\'s focus task list with estimated_minutes for each
|
|
>
|
|
> 2\. Sum estimated_minutes for open tasks -\> today_estimate
|
|
>
|
|
> 3\. Get time_blocks for today -\> available_hours
|
|
>
|
|
> 4\. Get time_budgets for each domain -\> weekly budget
|
|
>
|
|
> 5\. Sum estimated_minutes for all open tasks this week -\>
|
|
> week_estimate
|
|
>
|
|
> 6\. Compare: if week_estimate \> weekly_budget -\> show overcommitment
|
|
> warning
|
|
|
|
**12.4 Eisenhower Matrix Logic**
|
|
|
|
> For each open task:
|
|
>
|
|
> importance = priority (1=critical/2=high -\> Important)
|
|
>
|
|
> urgency = due_date proximity:
|
|
>
|
|
> overdue or due today/tomorrow -\> Urgent
|
|
>
|
|
> due within 7 days -\> Urgent
|
|
>
|
|
> due \> 7 days or no date -\> Not Urgent
|
|
>
|
|
> Quadrant assignment:
|
|
>
|
|
> Important + Urgent -\> Do First (red)
|
|
>
|
|
> Important + Not Urgent -\> Schedule (blue)
|
|
>
|
|
> Not Important + Urgent -\> Delegate (amber)
|
|
>
|
|
> Not Important + Not Urgent -\> Eliminate/Someday (grey)
|
|
|
|
Matrix is a derived view - no new data, just a different lens on
|
|
existing task fields. Rendered as a 2x2 grid with task counts per
|
|
quadrant. Clicking a quadrant opens the task list filtered to that
|
|
quadrant.
|
|
|
|
-----------------------------------------------------------------------
|
|
**13. AI and MCP Architecture (Phase 2)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**13.1 Design Principle**
|
|
|
|
One tool implementation. Two transport formats. Any AI model. The MCP
|
|
server is a thin transport adapter over the shared tool core. Adding a
|
|
new model provider requires only a config entry.
|
|
|
|
**13.2 Architecture**
|
|
|
|
> ┌───────────────────────────────────────────────────────┐
|
|
>
|
|
> │ AI CLIENTS │
|
|
>
|
|
> │ Claude (MCP) GPT-4o (func) Mistral Ollama │
|
|
>
|
|
> └──────┬──────────────┬────────────────┬────────────────┘
|
|
>
|
|
> │ │ │
|
|
>
|
|
> MCP transport OpenAI format OpenAI format
|
|
>
|
|
> (stdio/SSE) (function call) (function call)
|
|
>
|
|
> │ │ │
|
|
>
|
|
> └──────────────┴────────────────┘
|
|
>
|
|
> │
|
|
>
|
|
> ┌────────────▼────────────┐
|
|
>
|
|
> │ lifeos-mcp:8004 │
|
|
>
|
|
> │ MCP Server Container │
|
|
>
|
|
> │ │
|
|
>
|
|
> │ /mcp (MCP transport) │
|
|
>
|
|
> │ /tools/openai (OAI fmt) │
|
|
>
|
|
> └────────────┬─────────────┘
|
|
>
|
|
> │ HTTP (Docker internal)
|
|
>
|
|
> ▼
|
|
>
|
|
> ┌────────────────────────┐
|
|
>
|
|
> │ Tool Core Layer │
|
|
>
|
|
> │ tools/tasks.py │
|
|
>
|
|
> │ tools/projects.py │
|
|
>
|
|
> │ tools/meetings.py │
|
|
>
|
|
> │ tools/search.py │
|
|
>
|
|
> │ tools/meta.py │
|
|
>
|
|
> │ \... (all entities) │
|
|
>
|
|
> └────────────┬────────────┘
|
|
>
|
|
> │ HTTP + API key
|
|
>
|
|
> ▼
|
|
>
|
|
> ┌────────────────────────┐
|
|
>
|
|
> │ lifeos-prod FastAPI │
|
|
>
|
|
> └────────────────────────┘
|
|
|
|
**13.3 Tool Inventory (46 tools)**
|
|
|
|
--------------- ---------------------------------------- ---------------
|
|
**Category** **Tools** **Count**
|
|
|
|
Context/Meta get_context (domains+areas+projects), 2
|
|
get_dashboard_summary
|
|
|
|
Tasks create, list, get, update, complete, 9
|
|
delete, add_to_focus, get_blocked,
|
|
list_dependencies
|
|
|
|
Projects create, list, get, update, get_progress, 6
|
|
list_tasks
|
|
|
|
Meetings create, list, get, add_note, 6
|
|
create_action_item, list_decisions
|
|
|
|
Decisions create, list, get, update, 5
|
|
link_to_project
|
|
|
|
Processes list, get, start_run, complete_step, 5
|
|
get_run_status
|
|
|
|
Notes create, list, get, update, search_notes 5
|
|
|
|
Contacts create, list, get, search_contacts 4
|
|
|
|
Capture create, list_unprocessed, process_item 3
|
|
|
|
Search search (global, all entities) 1
|
|
--------------- ---------------------------------------- ---------------
|
|
|
|
**13.4 Model Registry Configuration**
|
|
|
|
> \# config/ai_models.yaml (editable from Admin UI)
|
|
>
|
|
> models:
|
|
>
|
|
> personal:
|
|
>
|
|
> provider: anthropic
|
|
>
|
|
> model: claude-opus-4-6
|
|
>
|
|
> interface: mcp
|
|
>
|
|
> api_key_env: ANTHROPIC_API_KEY
|
|
>
|
|
> work:
|
|
>
|
|
> provider: openai
|
|
>
|
|
> model: gpt-4o
|
|
>
|
|
> interface: openai_functions
|
|
>
|
|
> api_key_env: OPENAI_API_KEY_WORK
|
|
>
|
|
> local:
|
|
>
|
|
> provider: ollama
|
|
>
|
|
> model: llama3
|
|
>
|
|
> interface: openai_functions
|
|
>
|
|
> base_url: http://localhost:11434
|
|
|
|
**13.5 Claude Desktop Connection**
|
|
|
|
> \# \~/Library/Application Support/Claude/claude_desktop_config.json
|
|
>
|
|
> {
|
|
>
|
|
> \"mcpServers\": {
|
|
>
|
|
> \"lifeos\": {
|
|
>
|
|
> \"command\": \"ssh\",
|
|
>
|
|
> \"args\": \[\"root@46.225.166.142\",
|
|
>
|
|
> \"docker exec -i lifeos-mcp python mcp_server.py\"\],
|
|
>
|
|
> \"env\": { \"MCP_API_KEY\": \"your-secret-key\" }
|
|
>
|
|
> }
|
|
>
|
|
> }
|
|
>
|
|
> }
|
|
|
|
-----------------------------------------------------------------------
|
|
**14. Security Architecture**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
Single-user, self-hosted system. Security requirements are pragmatic,
|
|
not enterprise-grade. The primary threats are unauthorized external
|
|
access and accidental data loss.
|
|
|
|
------------- --------------------------- ------------------------------
|
|
**Layer** **Mechanism** **Notes**
|
|
|
|
Transport HTTPS enforced via Nginx + HTTP redirects to HTTPS
|
|
Let\'s Encrypt
|
|
|
|
Application No authentication in Phase Phase 3: basic auth or simple
|
|
access 1 (single user, private session login
|
|
server)
|
|
|
|
MCP/AI access Static API key (X-MCP-Key Rotate via .env, never in git
|
|
header) required for all
|
|
MCP calls
|
|
|
|
File access Files served via internal X-Accel-Redirect pattern
|
|
Nginx path, not public URL prevents directory traversal
|
|
|
|
Database PostgreSQL on internal Not exposed to public internet
|
|
Docker network only
|
|
|
|
Secrets All in .env file, never .gitignore enforced
|
|
committed
|
|
|
|
Data safety Logical deletes, no 30-day backup retention
|
|
destructive ops without
|
|
admin confirmation
|
|
|
|
Dependency SQLAlchemy sessions scoped No shared mutable state
|
|
injection per request
|
|
------------- --------------------------- ------------------------------
|
|
|
|
+-----------------------------------------------------------------------+
|
|
| **Phase 3 Authentication** |
|
|
| |
|
|
| If the application is ever exposed beyond the private server or |
|
|
| accessed by multiple users, add: HTTP basic auth as immediate |
|
|
| stopgap, then full session-based auth with Supabase Auth or a simple |
|
|
| JWT implementation. Row Level Security would need to be added to the |
|
|
| PostgreSQL schema at that point. |
|
|
+-----------------------------------------------------------------------+
|
|
|
|
-----------------------------------------------------------------------
|
|
**15. Phase Build Plan**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
--------- ---------------------------------------------------------------
|
|
**PHASE **Full Working Application**
|
|
1**
|
|
|
|
--------- ---------------------------------------------------------------
|
|
|
|
Everything a user needs to manage their professional and personal life
|
|
daily. Deployed to DEV, tested, then promoted to PROD with migrated
|
|
data.
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 1 - Foundation (1-2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
1. Apply R1 PostgreSQL schema to lifeos_dev
|
|
|
|
2. Run data migration script: R0 -\> R1 field mapping
|
|
|
|
3. Verify migrated data: 3 domains, 10 areas, 18 projects, 73 tasks
|
|
|
|
4. Stand up Docker stack: lifeos-db, lifeos-prod, lifeos-dev
|
|
|
|
5. Configure Nginx for both domains
|
|
|
|
6. Obtain SSL certificates via Certbot
|
|
|
|
7. Verify HTTPS access to both domains
|
|
|
|
8. Build: core/database.py, core/base_repository.py,
|
|
core/generic_router.py
|
|
|
|
9. Build: config/ YAML files (entities.yaml, menu.yaml)
|
|
|
|
10. Build: base.html shell with sidebar, topbar, theme classes
|
|
|
|
11. Build: \_list.html, \_form.html, \_empty.html generic templates
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 2 - Config-Driven Entities (1 day)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
12. Wire all 12 config-driven entities through generic_router
|
|
|
|
13. Domains, areas, context_types, weblinks, weblink_folders,
|
|
note_folders, time_budgets, task_templates, task_template_items,
|
|
milestones, release_domains, release_projects
|
|
|
|
14. Verify CRUD for all 12 entities
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 3 - Core Task and Project Management (3-4 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
15. Tasks: full CRUD, subtasks, priority, status, context, tags,
|
|
estimates, energy, waiting_for
|
|
|
|
16. Projects: CRUD, progress calculation, status management
|
|
|
|
17. Daily focus: date-scoped list, drag reorder, timer per task
|
|
|
|
18. Dependencies: DAG implementation, cycle detection, status cascade
|
|
|
|
19. Task templates: instantiation with subtask generation
|
|
|
|
20. Bulk actions: mark done, move, delete, add to focus
|
|
|
|
21. Overdue visual treatment, relative date language system
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 4 - Knowledge and Content (2-3 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
22. Notes: rich text editor, folders, M2M projects, wiki-linking \[\[
|
|
|
|
23. Decisions: CRUD, project/contact links, supersession chain
|
|
|
|
24. Files: upload, download, inline preview (images + PDFs)
|
|
|
|
25. Lists and list items: CRUD, checklist completion
|
|
|
|
26. Links and weblinks: CRUD, folder organization
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 5 - Meetings, Contacts, CRM (2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
27. Meetings: agenda, transcript, notes, action items -\> tasks
|
|
|
|
28. Contacts: CRUD, associations with roles
|
|
|
|
29. Appointments: CRUD, calendar integration
|
|
|
|
30. Follow-up reminders: per-contact, dashboard surfacing
|
|
|
|
31. Meeting series via parent_id
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 6 - Processes and Releases (2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
32. Processes: workflow vs checklist type, step management
|
|
|
|
33. Process runs: template snapshot, task generation, step completion
|
|
|
|
34. Releases: system-level CRUD, M2M project associations
|
|
|
|
35. Release detail: aggregate progress across projects, milestone
|
|
display
|
|
|
|
36. Task release_id assignment, backlog view
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 7 - Time Management (2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
37. Time tracking: start/stop timer, topbar pill, time_entries
|
|
|
|
38. Time blocks: create on calendar view, context/energy fields
|
|
|
|
39. Time budgets: domain weekly targets, overcommitment surfacing
|
|
|
|
40. Eisenhower matrix view
|
|
|
|
41. Dashboard: today estimate vs available, weekly metrics widget
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 8 - Search and Capture (1-2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
42. Global search: tsvector setup on all tables, Cmd/K modal
|
|
|
|
43. Scoped search within project views
|
|
|
|
44. Capture: multi-line paste parse, context pre-fill, convert to any
|
|
type
|
|
|
|
45. Capture bulk undo via import_batch_id
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 9 - UX Polish and Admin (1-2 days)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
46. Admin Trash: all soft-deleted entities, restore, permanent delete
|
|
|
|
47. Admin context types manager
|
|
|
|
48. Empty states on all list views
|
|
|
|
49. Skeleton loading screens
|
|
|
|
50. Toast notification system
|
|
|
|
51. Confirmation dialogs for destructive actions
|
|
|
|
52. CSV export: tasks, projects, contacts, decisions
|
|
|
|
53. Dashboard: focus list, deadlines, calendar, metrics, reminders
|
|
widgets
|
|
|
|
54. Calendar view: appointments + meetings + task due dates
|
|
|
|
-----------------------------------------------------------------------
|
|
**Step 10 - Promotion to Production**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
55. Apply schema to lifeos_prod
|
|
|
|
56. Run data migration on lifeos_prod
|
|
|
|
57. Smoke test all views on production data
|
|
|
|
58. Configure automated daily backup cron job
|
|
|
|
59. Document final deployed state
|
|
|
|
--------- ---------------------------------------------------------------
|
|
**PHASE **DAG Visualization and MCP/AI Gateway**
|
|
2**
|
|
|
|
--------- ---------------------------------------------------------------
|
|
|
|
- DAG node graph visualization on project view (tasks as nodes,
|
|
dependencies as edges)
|
|
|
|
- Critical path calculation and highlighting
|
|
|
|
- MCP server container: Python MCP server with shared tool core
|
|
|
|
- OpenAI-compatible /tools/openai endpoint on same container
|
|
|
|
- Model registry YAML configurable from Admin UI
|
|
|
|
- API key authentication for MCP
|
|
|
|
- Nginx routing for /ai/ path
|
|
|
|
- Claude Desktop connection config
|
|
|
|
- Note version history (note_version_history table)
|
|
|
|
- Pipeline / deal stages for CRM contacts
|
|
|
|
- Browser extension design and scoping
|
|
|
|
--------- ---------------------------------------------------------------
|
|
**PHASE **Polish and Advanced Features**
|
|
3**
|
|
|
|
--------- ---------------------------------------------------------------
|
|
|
|
- AI-assisted import: unstructured paste -\> LLM -\> structured
|
|
preview -\> confirm
|
|
|
|
- Dark/light theme switcher in UI (data-theme toggle, localStorage,
|
|
Phase 1 has CSS ready)
|
|
|
|
- Mobile swipe actions on task rows: complete, delete, add to focus
|
|
|
|
- Export: JSON (full data dump), PDF (reports), Markdown (notes)
|
|
|
|
- Full keyboard navigation: tab order, arrow keys, shortcuts (N, D, F,
|
|
Enter)
|
|
|
|
- Browser extension for weblink capture
|
|
|
|
- Habit tracking subsystem
|
|
|
|
- Goals/OKRs hierarchy above domains
|
|
|
|
- External calendar sync (Google Calendar / Outlook) - OAuth, webhooks
|
|
|
|
- Pre/post meeting AI summaries (requires Phase 2 MCP)
|
|
|
|
- Basic application authentication (session-based login)
|
|
|
|
-----------------------------------------------------------------------
|
|
**16. Migration Plan (R0 to R1)**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
**16.1 Current State**
|
|
|
|
---------------- ------------------------------------------------------
|
|
**R0 data lifeos_prod on defiant-01 PostgreSQL container
|
|
location**
|
|
|
|
**Migrated 3 domains, 10 areas, 18 projects, 73 tasks, 2 notes, 5
|
|
records** links, 5 daily_focus, 80 capture, 6 context_types
|
|
|
|
**Files** Empty (Supabase Storage URLs obsolete - file uploads
|
|
start fresh in R1)
|
|
|
|
**R0 Supabase client, Render hosting - decommissioned after
|
|
application** R1 promotion
|
|
---------------- ------------------------------------------------------
|
|
|
|
**16.2 Key Transformations Required**
|
|
|
|
- notes.content_format: update all R0 \'markdown\' values to \'rich\'
|
|
|
|
- All tables: add is_deleted=false, deleted_at=null, sort_order
|
|
sequential by created_at
|
|
|
|
- tasks: add release_id=null, estimated_minutes=null,
|
|
energy_required=null, waiting_for_contact_id=null
|
|
|
|
- notes: add folder_id=null, is_meeting_note=false, meeting_id=null,
|
|
title NOT NULL (fill empty titles with \'Untitled Note\')
|
|
|
|
- capture: add converted_to_type=null, converted_to_id=null,
|
|
import_batch_id=null
|
|
|
|
- context_types: add sort_order, is_deleted=false
|
|
|
|
**16.3 Migration Script Approach**
|
|
|
|
> \# migration/r0_to_r1.py
|
|
>
|
|
> \# 1. Connect to lifeos_prod (already populated with R0 data)
|
|
>
|
|
> \# 2. ALTER TABLE statements add new R1 columns
|
|
>
|
|
> \# 3. UPDATE statements set default values for new columns
|
|
>
|
|
> \# 4. Create all new R1 tables (empty)
|
|
>
|
|
> \# 5. Create indexes and tsvector triggers
|
|
>
|
|
> \# 6. Populate context_types with system defaults
|
|
>
|
|
> \# 7. Create built-in Weekly Review process template
|
|
>
|
|
> \# 8. Verify row counts match expected
|
|
|
|
Migration runs against lifeos_dev first. Once verified, same script
|
|
applies to lifeos_prod. Total migration time expected under 5 minutes
|
|
for current data volume.
|
|
|
|
-----------------------------------------------------------------------
|
|
**17. Appendix: Complete Table Inventory**
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
---------------------- -------------- ---------------------------------------
|
|
**Table** **Category** **Key FKs / Notes**
|
|
|
|
domains Core hierarchy No parent
|
|
|
|
areas Core hierarchy domain_id
|
|
|
|
projects Core hierarchy domain_id, area_id (opt)
|
|
|
|
tasks Core hierarchy domain_id, area_id, project_id,
|
|
release_id, parent_id,
|
|
waiting_for_contact_id (all opt)
|
|
|
|
notes Core hierarchy domain_id, project_id, folder_id,
|
|
meeting_id (all opt)
|
|
|
|
note_folders Core hierarchy parent_id self-ref
|
|
|
|
lists Core hierarchy domain_id, area_id, project_id (all
|
|
opt)
|
|
|
|
list_items Core hierarchy list_id, parent_item_id self-ref
|
|
|
|
links Core hierarchy domain_id, project_id
|
|
|
|
files Core hierarchy Associations via file_mappings junction
|
|
|
|
contacts System level No parent
|
|
|
|
appointments System level Associations via contact_appointments
|
|
|
|
meetings System level parent_id self-ref for series
|
|
|
|
decisions System level meeting_id (opt), superseded_by_id
|
|
self-ref
|
|
|
|
releases System level M2M via release_projects,
|
|
release_domains
|
|
|
|
milestones System level release_id (opt), project_id (opt)
|
|
|
|
processes System level process_type: workflow\|checklist
|
|
|
|
process_steps System level process_id
|
|
|
|
process_runs System level process_id, project_id (opt),
|
|
contact_id (opt)
|
|
|
|
process_run_steps System level run_id - content immutable after run
|
|
start
|
|
|
|
daily_focus System level task_id, focus_date
|
|
|
|
capture System level Polymorphic converted_to_type/id
|
|
|
|
task_templates System level Instantiated to create tasks+subtasks
|
|
|
|
task_template_items System level template_id
|
|
|
|
time_entries Time mgmt task_id - start/stop timer records
|
|
|
|
time_blocks Time mgmt task_id (opt) - calendar slots
|
|
|
|
time_budgets Time mgmt domain_id - weekly hours target
|
|
|
|
weblink_folders System level parent_id self-ref
|
|
|
|
weblinks System level M2M via folder_weblinks
|
|
|
|
context_types Lookup SERIAL pk, is_system flag
|
|
|
|
reminders System level Polymorphic entity_type/entity_id
|
|
|
|
dependencies Universal Polymorphic blocker+dependent, 4 types
|
|
junction
|
|
|
|
note_projects Junction note_id, project_id, is_primary
|
|
|
|
note_links Junction source_note_id, target_note_id - wiki
|
|
graph
|
|
|
|
file_mappings Junction file_id, context_type, context_id
|
|
|
|
release_projects Junction release_id, project_id
|
|
|
|
release_domains Junction release_id, domain_id
|
|
|
|
contact_tasks Junction contact_id, task_id, role
|
|
|
|
contact_projects Junction contact_id, project_id, role
|
|
|
|
contact_lists Junction contact_id, list_id, role
|
|
|
|
contact_list_items Junction contact_id, list_item_id, role
|
|
|
|
contact_appointments Junction contact_id, appointment_id, role
|
|
|
|
contact_meetings Junction contact_id, meeting_id, role
|
|
|
|
decision_projects Junction decision_id, project_id
|
|
|
|
decision_contacts Junction decision_id, contact_id, role
|
|
|
|
meeting_tasks Junction meeting_id, task_id, source
|
|
|
|
process_run_tasks Junction run_step_id, task_id
|
|
|
|
folder_weblinks Junction folder_id, weblink_id
|
|
|
|
note_version_history Phase 2 note_id, body snapshot, version_num
|
|
|
|
pipelines Phase 2 CRM deal stage tracking
|
|
---------------------- -------------- ---------------------------------------
|
|
|
|
*Life OS Architecture Design Document \| Version 2.0 \| February 2026 \|
|
|
Approved for Build*
|