RSS aggregator (MVP). TypeScript monorepo.
- Frontend: TanStack Start, TanStack Query, Zustand, Tailwind CSS, Shadcn/ui
- Backend: Node.js, Fastify, Mongoose
- Database: MongoDB
SiftVault/
├── client/ # TanStack Start frontend
└── server/ # Fastify + Mongoose API
Managed with npm workspaces. Tasks are run through the root Makefile.
Requires Node >=24 (see .nvmrc) and a running MongoDB instance.
cp server/.env.example server/.env # fill in MONGODB_URI, JWT secrets, etc.
make install # install all workspace dependencies
make dev-client # start the frontend at http://localhost:3000
make dev-server # start the backend at http://localhost:3001
make dev # start both frontend and backend
make build # build both frontend and backend
make test # run tests across all workspaces
make lint # run ESLint across all workspacesAPI docs (Swagger UI) are served at http://localhost:3001/docs in development.
ESLint is configured for both workspaces on the Airbnb style guide (eslint-config-airbnb / eslint-config-airbnb-typescript), with semicolons enforced. Run make lint to check both, or npm run lint -w @siftvault/client / -w @siftvault/server individually.
A Husky pre-commit hook runs npm test and npm run lint to block commits that don't pass tests or linting.
Run make help to list available commands.
- Auth: user registration & login (JWT access/refresh tokens in cookies)
- Subscriptions: add/remove RSS feeds
- Parsing: fetch feed items (title, link, source, image, sanitized HTML content)
- Home page: shows latest items from subscribed feeds, with inline "read here" expand
- Sifted items: save/remove feed items per user, view them on the
/siftedpage - PWA: installable app with manifest, generated icons, and offline support via a service worker
- Responsive, mobile-friendly UI
Not yet implemented: per-item read-status tracking.