Misli #
Misli is an English-first personal workspace for capturing thoughts, planning across time horizons, habits, daily reflection, notes with media, and a library of watched ideas. The interface follows the Timestripe-inspired prototype: a stable two-level shell, compact task rows, time-based planning surfaces, and focused editors instead of a dashboard.
Run the server #
The current backend is a Rust/Axum service. It serves the frontend and the first persistence vertical slice, so no Docker, database server, or other external service is required.
From the repository root:
npm ci --prefix src/frontend
npm run build --prefix src/frontend
cargo run --manifest-path src/backend/Cargo.toml
Open http://127.0.0.1:4180.
The server creates data/attachments/ and the SQLite database on first start. Runtime data is intentionally ignored by Git. Configuration can be supplied through environment variables (or a local .env file):
| Variable | Default | Purpose |
|---|---|---|
MISLI_BIND |
127.0.0.1:4180 |
HTTP listen address |
MISLI_DATABASE_URL |
sqlite://data/misli.db?mode=rwc |
SQLite connection URL |
MISLI_DATA_DIR |
data |
Attachment storage root |
MISLI_FRONTEND_DIR |
src/frontend/dist |
Compiled static frontend directory |
MISLI_MAX_UPLOAD_BYTES |
52428800 |
Maximum attachment size |
MISLI_ALLOW_NETWORK |
false |
Permit non-loopback bind only when intentional |
API foundation #
GET /api/health— liveness response;GET /api/v1/state— current state snapshot and revision;PUT /api/v1/state— save a snapshot withbaseRevisionoptimistic concurrency;GET /api/v1/sync?after=<cursor>— initial snapshot plus the operation journal, or operations after a cursor;POST /api/v1/sync— idempotent per-entity/per-field operation push with structured conflicts;POST /api/v1/attachments— multipart attachment upload;GET /api/v1/attachments/:id— streamed attachment download;DELETE /api/v1/attachments/:id— attachment deletion.
The workspace remains a typed aggregate in SQLite, but synchronization is driven by the durable sync_operations journal and sync_heads per-field heads. The frontend keeps its local aggregate, cursor, pending operations, and unresolved conflicts in local storage; it replays pending operations over a server snapshot before rendering. Re-sending an accepted operation is idempotent by operationId, independent fields merge, and a stale write to the same field returns a structured conflict without discarding the local operation. PUT /api/v1/state remains the guarded bootstrap and compatibility path; ordinary client mutations use /api/v1/sync. Attachment metadata lives in SQLite while binary content lives under data/attachments/. The server defaults to loopback-only binding and rejects a non-loopback bind unless MISLI_ALLOW_NETWORK=true is set deliberately; there is still no multi-user authentication in this personal-first prototype.
The frontend source is TypeScript. npm run build --prefix src/frontend emits the browser-compatible JavaScript bundle into src/frontend/dist/; the runtime keeps the existing .js URLs and cache-version query parameters.
The production cutover uses a new local-storage namespace (misli.workspace.v1), so data left by the prototype namespace is not imported into the first personal workspace.
Product areas #
- Today and Inbox;
- connected Horizons plus Day / Week / Month / Year / Life boards;
- recurring tasks and subgoals;
- weekly habit tracking;
- Daily Review with mood, progress, highlight, and summary;
- notes with local photo, video, and file attachments;
- Watched library with links and reflections;
- Life direction with immutable version history;
- global search;
- backup and restore tools.
Color themes are available in Data → Appearance. The theme is remembered on the current device. See theme maintenance for the shared palette registry and instructions for adding themes.
Every visible navigation option opens a real screen. Use New or ⌘K to route into the existing Task, Note, Habit, Watched, or Inbox editors without duplicating their fields. Use ⌘F for search and T to return to Today when you are not editing text.
Tasks in Today, Plan, Horizons, and Life share manual ordering. Drag the handle to reorder a list or drop onto another period, including a collapsed period or the Plan timeline. With the handle focused, Up/Down changes order and Left/Right moves between visible period cards. On touch screens, use the handle so ordinary page scrolling stays available. Explicitly reordering a task returns Today to manual sorting.
Expand Subtasks & links (or the subtask count) to complete and add subtasks
without opening the editor. Parent goal connects a task to a specific task in a
larger horizon; the parent exposes its linked tasks in the same panel. Moving a
linked task to an incompatible horizon requires unlinking it first. Reordering a
recurring occurrence preserves the series start and completion history; moving
the entire series requires confirmation. Timed blocks retain their explicit
dates, as they do when the task's planning date is changed in its editor.
For the detailed private VPS setup, see docs/DEPLOY_PRIVATE.md.
Production deployment #
Production runs on the VPS in /opt/services/misli from the Tangled
master branch. The service is available only through Tailscale at
https://olfrenn.tail641a4e.ts.net; port 4180 must remain private.
After a local change has been tested, committed, and pushed to Tangled, update the VPS with:
ssh root@100.95.59.50
z misli
git pull --ff-only
docker compose up -d --build
docker compose ps
Source structure #
src/backend/src/— Axum application, configuration, SQLite repository, typed models, and routes;src/backend/migrations/— embedded SQLx migrations;src/frontend/src/state.tsandsrc/frontend/src/state/— state model, migration, selectors, and task/habit completion;src/frontend/src/storage.tsandsrc/frontend/src/storage/— offline IndexedDB cache with server attachment fallback;src/frontend/src/views/— independent product-area renderers;src/frontend/src/editors/— focused task and free-time editor modules;src/frontend/src/modal.tsandsrc/frontend/src/archive-editors.ts— editor composition and archive-specific editors;src/frontend/src/actions.tsandsrc/frontend/src/actions/— mutations, forms, import/export;src/frontend/src/router.ts— routes and shell state;src/frontend/src/app.ts— event wiring;src/frontend/src/types/— shared domain, API, event, and DOM contracts;src/frontend/scripts/build.mjs— deterministic TypeScript-to-browser build;src/frontend/styles/— tokens, shell, components, product views, editors, and responsive rules;docs/DESIGN_NOTES.md— Timestripe and visual-system research notes.