Lire is a personal feed reader PWA — a phone/tablet/desktop reader, served as a static SPA and backed by a Cloudflare Worker that serves a Lire API over NewsBlur, behind Cloudflare Access.
The app runs in mock mode by default, against recorded or synthetic NewsBlur fixtures: categories, unread counts, streams with paging, an article reader, mark read and mark-all-read, subscription add, move and unsubscribe, web feeds made from a page (variant picking, reanalyze), and a checklist card for a new account. Three layout tiers (phone, tablet, desktop) and a PWA shell. The UI is in English and French, following the browser unless the account menu picks one. A signed-out landing explains the app, and a Credits page lists the licences of its code and assets. The Worker exists: Cloudflare Access with an owner email pin guards it, a NewsBlur OAuth sign-in runs in the Worker, and the NewsBlur grant, kept per user in a Durable Object, authenticates the upstream calls.
Setting up a deployment needs a NewsBlur OAuth client (its id and secret) and the other GitHub secrets; see
docs/how-to/deploy.md. Recording your own fixtures needs
NEWSBLUR_USERNAME and NEWSBLUR_PASSWORD in .env.local.
yarn # install (Yarn 4)
yarn dev # SPA in mock mode, http://localhost:3000
yarn storybook # component stories, http://localhost:6006
yarn fixtures:record # optional: record your own feeds (needs .env.local, see .env.sample)fixtures/real/ is gitignored; without it the app uses the synthetic fixtures/seed/. See
docs/tutorials/getting-started.md for a walkthrough.
yarn test # client unit tests
yarn test:worker # Worker tests
yarn test:e2e # all Playwright projectsSee docs/how-to/run-the-tests.md for every tier and its setup.
The docs follow Diátaxis. docs/README.md maps every file.
- docs/tutorials/ - learning by doing
- docs/how-to/ - task recipes
- docs/reference/ - facts to look up
- docs/explanation/ - why it is built this way
- docs/adr/ - decision records
A public demo, on the committed seed fixtures with no recorded data, is served at https://demo.lire.krebs.tech.
yarn build:demo # build the demo bundle (mock mode, seed fixtures)
yarn check:demo # fail on any recorded profile value in the demo bundleCI deploys the demo on every push to main, creating the lire-demo Cloudflare Pages project
when it is missing.