Decisions

The full decision log is at /decisions/log/. Its canonical home in the repository is project-memory/DECISIONS.md; that page is generated from it, so the two cannot drift.

This file is a pointer, deliberately. Keeping two decision logs guarantees they will disagree, and a decision log that cannot be trusted is worse than none. See decision D-010.

Record new architectural and product decisions there, numbered and dated.

Decisions at a glance

# Decision
D-001 Local-first and privacy-first
D-002 AI-provider agnostic; providers are importer adapters
D-003 React + TypeScript + Vite, Python + FastAPI, SQLite
D-004 Human-readable user data; SQLite holds metadata only
D-005 Monorepo: apps/web and apps/api
D-006 Docker is the primary supported backend path
D-007 Python 3.11 minimum
D-008 Plain CSS with custom properties; no UI framework
D-009 In-process event bus in V1; no message broker
D-010 project-memory/ is the single project-memory system
D-011 Cloud disabled by default, never silently enabled
D-012 MIT License — superseded by D-016
D-013 AGENTS.md is the canonical cross-agent instruction file
D-014 Light mode default; dark mode toggle — superseded by D-029
D-015 Default branch main; per-repository git identity
D-016 PolyForm Noncommercial 1.0.0; commercial licences sold separately — superseded by D-046
D-017 Repository stays local until there is a product worth showing — superseded by D-032
D-018 Verification is developer-controlled; required at milestone boundaries
D-019 Docker containers are disposable and never left running
D-020 A conversation is served and rendered as one Markdown file
D-021 Markdown rendered with react-markdown; raw HTML stays off
D-022 Search matches all words, last word as a prefix
D-023 A watched inbox folder, owned by default and configurable
D-024 The fast path is a user-run script; no credential enters the app
D-025 Tags live in metadata.json; an import never removes them
D-026 Projects deferred; tags first
D-027 Importers detect by shape, not by filename
D-028 StorageProvider waits for Milestone 6
D-029 Appearance is two choices: a palette, and light / dark / system
D-030 Import is a dialog; the header navigates within the one page
D-031 The page carries Support, Contribute and a real footer
D-032 Published publicly on GitHub; Pages for docs; no hosted application — publication half superseded by D-046
D-033 The website shares the application’s palettes, through one Jekyll layout
D-034 The appearance controls carry no visible group labels — superseded by D-037
D-035 The blog is part of the Jekyll site, and nothing publishes itself
D-036 Clean lowercase routes for every page, set per page — project-memory links amended by D-043
D-037 One header row; appearance is two menus; navigation folds
D-038 Money is taken by a merchant of record, through plain links
D-039 Project memory lives at the repository root, not under docs/
D-040 Full-width bands, a centred footer, and a site URL that works locally
D-041 Band elements use padding-block, never the padding shorthand
D-042 Exports are sharded; resolve them from the export’s own manifest
D-043 The repository’s canonical documents are generated as site pages
D-044 The published contact address is mindarchive@narainsagar.com
D-045 The brand goes back to the top, and so does a floating link
D-046 Proprietary, all rights reserved; published from an allowlist into a separate clean repository
D-047 Four names on one apex; Git and SSH setup gets its own page
D-048 The publication allowlist, and what it refuses to publish