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 | |
| D-013 | AGENTS.md is the canonical cross-agent instruction file |
| D-014 | |
| D-015 | Default branch main; per-repository git identity |
| D-016 | |
| D-017 | |
| 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 | |
| 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 |