# Progress

## M0: Design + scaffold

- Scaffold, lint/format/test scripts, .env.example, /healthz test.
- DESIGN.md written and approved by owner request to build.
- Status: DONE

## M1: Fetch, parse, normalize

- Implemented SSRF guard, fetcher, parser (RSS/Atom/JSON), normalizer, discovery, CLI.
- Tests for fixtures, malformed XML, 304, redirects, oversized body, SSRF.
- Status: DONE

## M2: Storage, dedupe, poller

- SQLite migrations and repositories; ingest pipeline with dedup; poller with backoff/per-host/global limits.
- Integration test for dedupe, 304, failing feed isolation.
- Status: DONE

## M3: API

- Auth/sessions, subscriptions, items pagination, read/unread single+bulk, unread counts.
- API tests for auth, validation, pagination stability, per-user isolation.
- Status: DONE

## M4: React UI

- Login, subscription manager, item list infinite scroll, optimistic read toggle with rollback, unread badge, loading/empty/error states.
- Component tests for list, toggle, rollback.
- Status: DONE

## M5: Live updates

- SSE per user with subscription filtering; client merges new items without losing scroll.
- Test for per-user event isolation.
- Status: DONE

## M6: Hardening + ship

- Rate limits, helmet, CSRF tokens, retention cleanup, Dockerfile + docker-compose, README.
- docker compose build/run verified.
- Status: DONE

## M7: TypeScript migration

- Full migration of server (Express + SQLite + poller) and client (React + Vite) to TypeScript.
- Shared types for DB rows, feed parsing, and API DTOs.
- Typed repositories, services, feed pipeline, middleware, routes, and scheduler.
- Strict mode enabled in both workspaces; all type checks pass.
- Client components migrated to TSX with typed props, hooks, and API layer.
- `npm run typecheck` (tsc -b) passes; `npm run check` (lint + format + tests) passes.
- Status: DONE
