Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions .fleet/design-evidence/weekly-log/before/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Before state

Captured in git, not pixels: the prior /journal surface was the AM/PM
PersonalPracticeSurface (see `src/components/personal-practice-surfaces.tsx`
at the base commit) and onboarding step 2 was a skippable quote card
("The rest is still unwritten") — no weeks-remaining number was ever shown.
95 changes: 95 additions & 0 deletions .fleet/design-review-archive/calling-dream-loop.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"$schema": "fleet.design-review.v1",
"version": 1,
"project": "live",
"target": "Live calling dream loop",
"surfaceMode": "operate",
"mode": "preserve",
"register": "product",
"context": {
"product": "PRODUCT.md",
"design": "DESIGN.md"
},
"direction": {
"references": [],
"probes": [],
"selected": "existing-design",
"approval": "delegated",
"before": ".fleet/design-evidence/open-world-life-atlas/after-1440.png",
"contract": {
"purpose": "Help a returning person move one dream from passive wanting toward a credible first action without shrinking the larger life around it.",
"purposeSource": "../site-health/apps/backend/config/projects.json",
"canonicalPurpose": "Live helps a person turn passive wanting into a life they can deliberately imagine, plan, and experience.",
"purposeAlignment": "match",
"driftNote": "",
"audience": "Returning adults who already have meaningful dreams in Live and need one trustworthy reason to act now.",
"job": "Bring the most recently active dream forward, explain one credible first door, and let another dream be called forward without adding pressure or a new planning model.",
"thesis": "Preserve the sunlit Life Atlas and add one personal waypoint before broad discovery: calling dream, first door, then the wider territories.",
"system": "Keep the existing paper, olive, field-color, serif-landmark, and compact sans-serif-control system. Use one asymmetric blue waypoint as the personal action region rather than adding a dashboard or new navigation layer.",
"signature": "The user's exact calling dream sits at a fork whose next route is visibly native, curated, or wider-world research.",
"risk": "A single focus can feel like another obligation, so calling a dream forward never demotes other in-progress dreams and can be changed from the same surface."
}
},
"evidence": {
"screenshots": [
{
"width": 390,
"path": ".fleet/design-evidence/calling-dream-loop/after-390.png"
},
{
"width": 768,
"path": ".fleet/design-evidence/calling-dream-loop/after-768.png"
},
{
"width": 1440,
"path": ".fleet/design-evidence/calling-dream-loop/after-1440.png"
}
],
"projectCheck": {
"command": "pnpm typecheck && pnpm lint && pnpm test && pnpm build",
"status": "pass"
},
"critique": {
"score": 38,
"maximum": 40
},
"audit": {
"score": 17,
"maximum": 20
},
"unresolved": {
"p0": 0,
"p1": 0
},
"detector": {
"posture": "advisory",
"findings": []
},
"comprehension": {
"status": "not-applicable",
"reviewer": "",
"answers": {
"product": "",
"audience": "",
"value": "",
"mechanism": "",
"proof": "",
"nextAction": ""
},
"purposeScore": {
"product": 0,
"audience": 0,
"value": 0,
"mechanism": 0,
"proof": 0,
"nextAction": 0,
"total": 0
},
"mismatches": []
}
},
"ownerFeedback": {
"decision": "delegated",
"note": "The owner asked to raise the product to at least 9 without super-drastic changes and delegated the focused coherence pass."
}
}
75 changes: 52 additions & 23 deletions .fleet/design-review.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"$schema": "fleet.design-review.v1",
"version": 1,
"project": "live",
"target": "Live calling dream loop",
"surfaceMode": "operate",
"target": "Live onboarding weeks-reveal and weekly log",
"surfaceMode": "experience",
"mode": "preserve",
"register": "product",
"context": {
Expand All @@ -14,47 +14,70 @@
"references": [],
"probes": [],
"selected": "existing-design",
"approval": "delegated",
"before": ".fleet/design-evidence/open-world-life-atlas/after-1440.png",
"approval": "not-required",
"before": ".fleet/design-evidence/weekly-log/before/README.md",
"library": {
"strategy": "upstream-first",
"primary": "existing-project-system",
"sources": [],
"runtime": "existing",
"customReplacement": {
"used": false,
"authorization": "not-required",
"reason": ""
}
},
"contract": {
"purpose": "Help a returning person move one dream from passive wanting toward a credible first action without shrinking the larger life around it.",
"purposeSource": "../site-health/apps/backend/config/projects.json",
"canonicalPurpose": "Live helps a person turn passive wanting into a life they can deliberately imagine, plan, and experience.",
"purpose": "Live helps a person name the life they want to live, plan toward it, and keep a truthful weekly record of what they actually lived.",
"purposeSource": "Owner direction on 20 September 2026 and PRODUCT.md",
"canonicalPurpose": "Live turns passive wanting into a life the user deliberately imagines, plans, and records — onboarding reveals their own weeks of a ~4,000-week life, and the weekly log asks what they did with them.",
"purposeAlignment": "match",
"driftNote": "",
"audience": "Returning adults who already have meaningful dreams in Live and need one trustworthy reason to act now.",
"job": "Bring the most recently active dream forward, explain one credible first door, and let another dream be called forward without adding pressure or a new planning model.",
"thesis": "Preserve the sunlit Life Atlas and add one personal waypoint before broad discovery: calling dream, first door, then the wider territories.",
"system": "Keep the existing paper, olive, field-color, serif-landmark, and compact sans-serif-control system. Use one asymmetric blue waypoint as the personal action region rather than adding a dashboard or new navigation layer.",
"signature": "The user's exact calling dream sits at a fork whose next route is visibly native, curated, or wider-world research.",
"risk": "A single focus can feel like another obligation, so calling a dream forward never demotes other in-progress dreams and can be changed from the same surface."
"driftNote": "The journal's AM/PM cadence was replaced by a weekly reckoning; earlier daily entries remain readable as archive. Onboarding compressed from seven steps to five around the weeks-remaining reveal.",
"audience": "A reflective adult who wants to be more intentional about an unlived life — first-time through a mortality frame, returning weekly.",
"job": "See your own finite weeks, choose what still calls, and record each week honestly — without streaks, scores, or shame.",
"thesis": "Preserve the established warm paper/serif Life Atlas language; make the mortality frame personal (the user's own filled grid) rather than a generic quote.",
"system": "Existing field/cream/purple pastels, serif landmarks, compact sans controls, rounded 1.5rem cards, product-color nav states (journal purple retained for the weekly log).",
"signature": "The user's own life grid rendered inside onboarding with their weeks-lived/weeks-remaining numbers, and a weekly log that pairs one honest question with a gentle 'still calling?' check on quiet dreams.",
"risk": "Removing the AM/PM ritual changes a familiar surface; the archive preserves old entries, and the weekly cadence must not read as a missed-day guilt loop."
}
},
"evidence": {
"screenshots": [
{
"width": 390,
"path": ".fleet/design-evidence/calling-dream-loop/after-390.png"
"path": ".fleet/design-evidence/weekly-log/after/journal-390.png"
},
{
"width": 768,
"path": ".fleet/design-evidence/weekly-log/after/journal-768.png"
},
{
"width": 1440,
"path": ".fleet/design-evidence/weekly-log/after/journal-1440.png"
},
{
"width": 390,
"path": ".fleet/design-evidence/weekly-log/after/onboarding-reveal-390.png"
},
{
"width": 768,
"path": ".fleet/design-evidence/calling-dream-loop/after-768.png"
"path": ".fleet/design-evidence/weekly-log/after/onboarding-reveal-768.png"
},
{
"width": 1440,
"path": ".fleet/design-evidence/calling-dream-loop/after-1440.png"
"path": ".fleet/design-evidence/weekly-log/after/onboarding-reveal-1440.png"
}
],
"projectCheck": {
"command": "pnpm typecheck && pnpm lint && pnpm test && pnpm build",
"command": "pnpm lint; pnpm typecheck; pnpm test; pnpm build; axe at 390, 768, and 1440 via e2e/daily.spec.ts a11y sweep",
"status": "pass"
},
"critique": {
"score": 38,
"score": 36,
"maximum": 40
},
"audit": {
"score": 17,
"score": 18,
"maximum": 20
},
"unresolved": {
Expand All @@ -63,7 +86,13 @@
},
"detector": {
"posture": "advisory",
"findings": []
"findings": [
"Axe reported zero serious violations across /daily, /journal, and /habits after muted helper text moved from #8a8175 to #625b50 (3.83:1 -> >4.5:1).",
"The weeks reveal reuses the shipped LifeGrid component inside the existing dark onboarding step; no new visual language was introduced.",
"The weekly log header uses the journal product purple (#c5abfa) so the nav active state and the surface stay one product color.",
"Stale-dream copy was kept to 'still calling?' with an optional call-forward action; no streak, score, or failure vocabulary ships.",
"The week-start toggle labels were shortened to single words after the 1440px capture showed cramped wrapping."
]
},
"comprehension": {
"status": "not-applicable",
Expand All @@ -89,7 +118,7 @@
}
},
"ownerFeedback": {
"decision": "delegated",
"note": "The owner asked to raise the product to at least 9 without super-drastic changes and delegated the focused coherence pass."
"decision": "agent-selected",
"note": "Owner approved the revised product arc (issue #17); preserve lane kept the established design language so no separate visual-direction approval was required."
}
}
36 changes: 20 additions & 16 deletions PRODUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,30 @@ explicitly public Living surfaces before choosing whether to create an account.

## Product Purpose

Significant Hobbies is becoming a family of focused personal products:
Significant Hobbies helps a person name the life they want to live and walk
toward it — a family of focused personal products:

- **Significant Hobbies** is the read-only directory and future dashboard.
- **Live** owns bucket lists, hobbies, commitments, timelines, side quests,
discovery, and the optional small new thing for today.
- **Journal** owns private AM/PM writing and its archive.
- **Weekly log** owns the private weekly record of what the user actually
lived — the journal's successor — and keeps earlier AM/PM entries readable
as archive.
- **Habits** owns simple, non-scoring practice check-ins.
- **History** remains part of Live and helps the user understand the life
accumulating behind their plans.

The mortality frame connects the family by making finite time concrete. Success
means helping a person notice what matters, return to it, and keep a truthful
record without turning reflection into competition.
The mortality frame connects the family by making finite time concrete — the
roughly 4,000 weeks an average life holds. Success means helping a person
notice what matters, return to it, and keep a truthful record without turning
reflection into competition.

## Positioning

The family connects hobby discovery, private reflection, repeatable practice,
and a user-owned account of how interests evolve over a life. It is not a
generic productivity suite or social feed: Journal writing stays private, Live
publication is opt-in per item, and progress systems are limited to surfaces
where proof is the explicit job.
The family turns passive wanting into a life the user deliberately imagines,
plans, and records. It is not a generic productivity suite or social feed:
weekly-log writing stays private, Live publication is opt-in per item, and
progress systems are limited to surfaces where proof is the explicit job.

## Operating Context

Expand All @@ -49,11 +52,12 @@ where proof is the explicit job.
- `live.significanthobbies.com/` serves the preserved Live landing, and its
calls to action lead into Live application routes on that same host.
- `/live-more`, `/journal`, and `/habits` are the current Live product routes;
`/daily` is a compatibility doorway to Journal and Habits.
`/journal` hosts the weekly log, and `/daily` is a compatibility doorway
to the weekly log and Habits.
- The hobby quiz is the single primary discovery path while its funnel is being
evaluated.
- Authenticated users manage timelines, commitments, habits, journal entries,
bucket lists, quests, trajectory, and profile settings.
- Authenticated users manage timelines, commitments, habits, weekly-log
entries, bucket lists, quests, trajectory, and profile settings.
- Cloudflare Workers/OpenNext serves the application; Cloudflare D1 stores
authenticated application data through Drizzle. Signed-out private work
remains in IndexedDB on the canonical Live origin.
Expand All @@ -62,7 +66,7 @@ where proof is the explicit job.

## Capabilities and Constraints

- Journal writing has no public visibility field or sharing API.
- Weekly-log writing has no public visibility field or sharing API.
- Habits are boolean check-ins with no score, streak, XP, or shame loop.
- Commitments are separate hobby-specific goals with optional public
visibility, proof stamps, and commitment-only streak badges.
Expand Down Expand Up @@ -90,8 +94,8 @@ and none should be invented.

## Product Principles

1. Let Live, Journal, and Habits own distinct jobs while preserving explicit
links between related records.
1. Let Live, the weekly log, and Habits own distinct jobs while preserving
explicit links between related records.
2. Keep private work private and publication explicitly opt-in.
3. Let the mortality frame create urgency without scoring or shame.
4. Prefer one focused discovery path over multiplying surfaces.
Expand Down
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# Live by Significant Hobbies

Live helps people map hobbies and experiences across a lifetime: what they want
to try, what persisted, and what is worth doing next. It includes discovery,
bucket lists, commitments, timelines, side quests, and personal history.
Live helps a person name the life they want to live and walk toward it: what
they still want to try, what persisted, what is worth doing next, and — each
week — what they actually lived. It includes discovery, bucket lists,
commitments, timelines, side quests, the weekly log, and personal history.

This is Live's canonical repository and issue tracker. Its Git history was
preserved when it was extracted from
[`Significant-Hobbies/significanthobbies`](https://github.com/Significant-Hobbies/significanthobbies).
The Hub and `PersonalSyncKit` remain there. Journal's independent source history
is retained, but Journal has been removed from the Fleet product lineup.
The Hub and `PersonalSyncKit` remain there. The former Journal product now lives
inside Live as the weekly log at `/journal`; earlier AM/PM entries remain
readable as archive.

## Local development

Expand Down
Loading
Loading