This repository has no description
README.md

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 with baseRevision optimistic 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.ts and src/frontend/src/state/ — state model, migration, selectors, and task/habit completion;
  • src/frontend/src/storage.ts and src/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.ts and src/frontend/src/archive-editors.ts — editor composition and archive-specific editors;
  • src/frontend/src/actions.ts and src/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.