Presence infrastructure for the energetic logger who doesn’t look back.
A personal data platform that watches the streams you’re already generating — journal entries, purchases, watch history, nutrition logs, device data — extracts them into a structured ontology of your life, and surfaces patterns you’d never have the time or patience to find yourself.
The product isn’t the journal. It isn’t the charts. It’s the ontology — the formal taxonomy of you that emerges from how you actually live, not what you were told to track.
Most self-tracking tools ask you to swim upstream against your own momentum: compose entries, tag them, review them, act on them. Most people don’t. They capture voraciously and never look back.
Understood inverts that. You capture however feels natural. The inference layer does the structuring, the connecting, and the surfacing. Your job is to live; the system’s job is to watch and notice.
Core principles:
The enemy the product fights: the tragedy of the unlived life — potential that slips through the cracks of an unexamined day.
Understood is not four apps. It’s four capture surfaces + one inference layer.
1. Capture — Multiple streams feed in:
2. Extraction — Claude processes raw text and metadata into structured extractions. Each extraction carries a category, key-value data, and a confidence score (1.0 = explicit, 0.7 = strongly implied, 0.4 = loosely inferred). A single entry can produce zero or many extractions. No manual tagging.
3. Ontology — Extracted labels are collapsed into a two-level hierarchy: 14 parent categories, 38 child labels, 0 unmapped. Parents include Social, Work, Health, Ambition, Exercise, Nutrition, Purchase, Affect, Belief, Insight, Learning, Sleep, Entertainment, Finance. The ontology is the product. It’s the formal structure of the user’s life — stable, legible, portable, owned.
4. Correlation — A cross-domain engine analyzes how the 14 categories move together over time. Co-movement, inverse movement, leading indicators (e.g., Exercise preceding Ambition by 1–2 weeks), anomaly weeks, and domain bridging. Claude interprets the math and generates natural-language insights.
5. Surfacing — Short, numerically grounded behavioral observations delivered without requiring the user to go looking. Not dashboards.
A pattern observation (“you stress-eat on Tuesdays”) is a moment. The ontology is a foundation — a structured self-model built from months of living that the user owns. Competitors can generate observations. The ontology is defensible because it’s earned.
Complete
On deck
npm install
.env.local:
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
ANTHROPIC_API_KEY=your_anthropic_api_key
CRON_SECRET=your_cron_secret
npm run dev
npm run dev — development servernpm run build — production buildnpm run start — production servernpm run lint — ESLintnpm run test:e2e — Playwright specsUnderstood uses five primary tables. All tables have RLS enabled with user-scoped policies.
-- Journal capture surface
CREATE TABLE entries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) NOT NULL,
headline TEXT NOT NULL,
category TEXT NOT NULL,
subheading TEXT,
content TEXT NOT NULL,
mood TEXT,
versions JSONB,
generating_versions BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Structured extractions from all capture streams
CREATE TABLE extractions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) NOT NULL,
source_type TEXT NOT NULL, -- 'journal' | 'amazon' | 'youtube' | 'mfp' | 'apple'
source_id TEXT,
category TEXT NOT NULL, -- original child label
parent_category TEXT, -- Level 1 ontology parent
data JSONB,
confidence REAL, -- 1.0 | 0.7 | 0.4
occurred_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- The ontology — the actual product
CREATE TABLE ontology_categories (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
parent_name TEXT NOT NULL,
child_label TEXT NOT NULL,
description TEXT,
version INTEGER DEFAULT 1,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Correlation engine output
CREATE TABLE correlations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) NOT NULL,
category_a TEXT NOT NULL,
category_b TEXT NOT NULL,
correlation_type TEXT, -- 'co_movement' | 'inverse' | 'lagged' | 'anomaly'
coefficient REAL,
lag_weeks INTEGER,
window_start DATE,
window_end DATE,
interpretation TEXT, -- Claude-generated
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Behavioral signatures — recurring multi-category patterns
CREATE TABLE behavioral_signatures (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) NOT NULL,
name TEXT,
categories TEXT[],
description TEXT,
interpretation TEXT,
detected_at TIMESTAMPTZ DEFAULT NOW()
);
Full migrations live in /supabase/migrations.
├── app/
│ ├── api/ # extract, correlate, interpret
│ ├── actions/ # Server Actions
│ ├── extractions/ # bubble map + ontology views
│ ├── correlations/ # cross-domain patterns
│ ├── login/
│ ├── layout.tsx
│ └── page.tsx
├── components/ # self-contained UI (shadcn philosophy)
├── lib/
│ ├── supabase/
│ ├── extraction/ # prompt templates + parsers
│ ├── ontology/ # hierarchy operations
│ ├── correlation/ # Pearson, stddev, lagged correlation (JS, not API)
│ └── utils.ts
├── types/
├── tests/ # Playwright specs
└── styles/ # Vanity Fair design tokens
Understood follows a Vanity Fair editorial aesthetic — not a productivity-tool aesthetic.
See VISUAL-DESIGN-FRAMEWORK.md for the full spec.
The visual choice reinforces the positioning: this isn’t a tracker, it’s a record. It treats the user’s life the way a magazine treats its subject.
Configured for Vercel.
vercel.json configures Cron jobs for scheduled extraction runs and correlation refreshes. Redeploy after changing env vars.
Near-term
Medium-term
Long-term
MIT