Skip to content

Developing

You need Rust (1.88 or newer) and Node 22 or newer.

make dev-server   # Rust API on :3000 (data in ./data)
make dev-web      # Vite on :5173 with hot reload, proxying /api to :3000
make test         # Rust tests + Svelte type check
make check        # fmt + clippy + svelte-check
make types        # regenerate TypeScript types from Rust

Layout

crates/domain   pure logic (day boundaries, recurrence, rollover, planner…), unit-tested
crates/server   Axum HTTP API, auth, SSE, background jobs, embedded web app
crates/desktop  Linux desktop app (Tauri 2; its own Cargo workspace and lock file)
migrations      SQLite schema
web             Svelte 5 + Vite single-page app
packaging       .desktop file, .deb and tarball scripts, AUR PKGBUILDs
docs            this site, plus the spec, work plan and decisions

Desktop app

The desktop app needs webkit2gtk-4.1 and libayatana-appindicator (Debian/Ubuntu: libwebkit2gtk-4.1-dev libayatana-appindicator3-dev). make desktop builds it into crates/desktop/target/release/streamline-desktop; cargo test --manifest-path crates/desktop/Cargo.toml runs its tests (offline sync against a real in-process server).

Two lock files

crates/desktop has its own Cargo.lock. After changing the server's dependencies, refresh it (cargo metadata --manifest-path crates/desktop/Cargo.toml --format-version 1) and commit it: CI builds the desktop app with --locked.

Documentation

This site is built with MkDocs and Material:

python3 -m venv .venv && .venv/bin/pip install -r docs/requirements.txt
.venv/bin/mkdocs serve      # http://127.0.0.1:8000, reloads on change
.venv/bin/mkdocs build --strict

The site is published to GitHub Pages from main by the Docs workflow.

Where decisions live

  • Specification: what Streamline should do.
  • Work plan: phases and chunks, ticked off as they land.
  • Decisions: answers to open questions and deviations from the spec.