Local-first RSS reading and digest workspace with a Next.js frontend, FastAPI backend, and SQLite-ready runtime defaults.
apps/
api/ FastAPI backend and startup diagnostics
web/ Next.js App Router frontend and web diagnostics
data/ Local SQLite database files
docs/ Architecture and local setup notes
scripts/ Bootstrap, dev, and health helper scripts
-
Install frontend and backend dependencies:
npm run bootstrap
-
Start both services:
npm run dev
-
Open the local runtime:
- Web app:
http://127.0.0.1:3000 - Web health:
http://127.0.0.1:3000/api/health - API health:
http://127.0.0.1:8000/health - API startup diagnostics:
http://127.0.0.1:8000/diagnostics/startup
- Web app:
- RSSmaster now supports local accounts and login on one trusted machine.
- Until the first account is created, the app behaves like the earlier open local-first workspace.
- The first created account claims the current shared library by copying
data/rssmaster.dbinto its own account database. - Later accounts get separate SQLite workspaces under
data/accounts/. - Session cookies are local-only and are shared between the web app on
3000and the API on8000. - In the open mode without accounts, create the first account from
Ustawienia -> Sesja operatora -> Utworz pierwsze konto.
npm run bootstrapinstalls Node dependencies, creates.venv, installs Python requirements, and seeds.envfrom.env.examplewhen needed.npm run devruns the FastAPI API and Next.js web app together.npm run buildverifies the Next.js application builds successfully.npm run checkbuilds the frontend, runs unit checks, and then runsnpm run check:contract.npm run check:contractruns the in-process API contract smoke inscripts/check_api.py. It proves contract and core workflow semantics, not a healthy live runtime.npm run check:storagevalidates the SQLite schema, required tables, critical indexes, and digest/delivery columns in an isolated temporary database.npm run check:archivebuilds an isolated digest EPUB and verifies archive metadata, SHA-256, history lookup, and delivery artifact readiness.npm run check:orchestrationruns an isolated scheduled workflow smoke: scheduled sync, digest build, and delivery dry-run with persistedjob_runs.npm run check:portsaudits the canonical local ports127.0.0.1:3000and127.0.0.1:8000and writesoutput/playwright/runtime-port-audit.json.npm run check:captureruns a browser smoke for the outside-app capture flow, including/captureprefills, bookmarklet readiness, manifest share target, and note persistence into the saved reader.npm run check:continuityruns a browser smoke for the manual continuity bundle flow, including export from/sourcesbackoffice, reader-context capture, bundle import, and restored route/progress in the saved reader.npm run qa:sourcesruns the/sourcesQA plan end-to-end: unit tests, build, health, API smoke, and browser smoke with automatic local boot when needed.npm run check:readerruns a browser smoke for the cleaned reading surface, including article media, formatting, and link absolutization.npm run check:reader:real-queueaudits an operator-local manifest of real queue items and writes sampled before/after evidence for extraction cleanup rollout.npm run qa:readerruns the cleaned reader QA plan end-to-end: web/API unit checks, build, runtime health, and browser smoke with automatic fallback-port discovery when needed.npm run qa:appaggregatescheck:contract,qa:sources,qa:reader,check:capture, andcheck:continuity, then writes a cross-app evidence summary tooutput/playwright/app-qa.json.npm run db:initcreates the SQLite schema if it does not exist and prints schema metadata.npm run healthpings the running local services and prints their health payloads.
contract green:npm run check:contract- proves the backend contract and core happy-path semantics in-process
- does not prove that a live web/API runtime is healthy on
3000/8000
fallback runtime green:npm run qa:sources,npm run qa:reader, ornpm run qa:app- proves the flows against a healthy local runtime, even if the harness had to reuse fallback ports such as
3100/8100 - does not prove a clean boot on the canonical default ports
- proves the flows against a healthy local runtime, even if the harness had to reuse fallback ports such as
canonical cold boot green:npm run qa:sources -- --cold-start- proves a real clean start on
127.0.0.1:3000and127.0.0.1:8000 - safely stops recognized RSSmaster runtimes from this repo on canonical and fallback ports before booting
- fails deliberately if an unknown or non-RSSmaster process still blocks a default port
- proves a real clean start on
The homepage now includes a live channel intake panel, a manual sync launcher, a dense keyboard-first reader shell, digest preview/build controls, and SMTP/Kindle delivery settings with dry-run/send actions. You can test direct feed URLs, homepage autodiscovery, repeated sync deduplication, extraction-backed reading, digest packaging, and local delivery flow from the browser once npm run dev is running.
For /sources specifically, the quickest confidence path is npm run qa:sources, and the detailed scenario matrix lives in docs/runbooks/sources-test-plan.md.
For the cleaned reader specifically, use npm run check:reader, and see docs/runbooks/reader-test-plan.md for the detailed scenario matrix and evidence paths.
If you want the full operator-grade gate for the reader, use npm run qa:reader.
If you are rolling out extraction cleanup on sampled real articles, use npm run check:reader:real-queue -- --phase before, then python scripts/reextract_items.py --manifest output/playwright/reader-real-queue-manifest.json --write, then npm run check:reader:real-queue -- --phase after.
For outside-app capture specifically, use npm run check:capture, and see docs/runbooks/capture-test-plan.md for the detailed scenario matrix and evidence paths.
For manual portability and cross-device continuity specifically, use npm run check:continuity, and see docs/runbooks/continuity-test-plan.md for the exported bundle semantics, restore expectations, and evidence paths.
For cross-app operator confidence, use npm run qa:app.
For manual screen-reader sign-off, use docs/runbooks/a11y-screen-reader-signoff.md together with docs/templates/a11y-screen-reader-evidence-template.md, then save the filled notes under output/playwright/a11y-screen-reader-signoff-YYYY-MM-DD.md.
CONTRIBUTING.mddefines the standard contribution and agent handoff workflow.docs/documentation-map.mddefines where requirements, execution, and technical decisions should live.docs/agent-workflow.mddefines how Codex and other agents should move from Linear issues to verified code.docs/quality-gates.mdmaps change classes to required verification commands.docs/rssmaster-domain-rules.mddefines local-first product invariants and backlog triage rules.docs/magazine-model.mddefines the V1 digest-backed magazine issue model and the V2 migration path.docs/ci-cd.mdexplains the GitHub Actions quality gate and the current no-deployment status.docs/observability.mdexplains optional Sentry setup for web/API error monitoring.docs/prd.mddefines the canonical MVP scope and user journey.docs/local-development.mdexplains clean-room setup and daily commands.docs/architecture.mddescribes the service boundaries for the MVP runtime.docs/api-contract.mddefines the canonical frontend-backend contract for core MVP workflows.docs/orchestration-contract.mddefines reusable job lifecycle and pipeline semantics.docs/storage-schema.mdexplains why each SQLite table exists and what depends on it.docs/adrs/README.mddefines where architecture decisions should be recorded in the repo.docs/release-checklist.mddefines what must be green before calling a local build release-ready.docs/runbooks/local-release-smoke.mdgives the fastest operator path for boot, smoke verification, and gap diagnosis.