Last updated: August 20, 2026
This repository is an independently modernized fork of the RealWorld Conduit example app — a Medium-style publishing platform (CRUD, JWT auth, pagination) built with React 19 / Vite + SWC / Express 5 / Sequelize / PostgreSQL. It's not affiliated with the RealWorld project or the original repo author.
Rather than copying the source app over wholesale, this fork is being rebuilt one file at a time: each file is re-added deliberately, with dependencies and patterns brought up to their current latest versions along the way, and every real bug fixed via a real failing test — not read twice and assumed fine.
At a glance: 214/214 backend tests passing, 6/6 frontend tests passing, 0 open CodeQL alerts, 27 real bugs found and fixed — see the Quality/CodeQL badges above for live CI status. Known gap: the frontend's 20 files built so far have zero behavioral test coverage yet (typecheck+lint+/simplify only) — tracked openly as issue #71, not hidden.
- System Architecture — the dev-proxy → Express → Postgres request path, and where the (in-progress) frontend fits
- Auth & Request Flow — how
verifyToken's soft-auth-by-default pattern actually works, and the real bug it's responsible for - Data Model — the 4 models and 6 associations, and the two real FK bugs migrations now catch
- Testing Strategy — the four test layers this repo runs, real in-memory SQLite instead of hand-stubbed mocks
The rest of the wiki goes deeper per backend module.
todo.md— the primary, detailed record: a phase-by-phase written log of everything done and everything still open, with dates and the reasoning behind each decision. This is the source of truth.- GitHub Project board — a Scrum-style Backlog/Planned/In Progress/Verification & QA/Done view of the same work, for a quick at-a-glance status without reading the full log. Kept in sync with
todo.md.
RealWorld's Conduit is a well-known "same app, N stacks" demo, useful precisely because it's common ground — but reference implementations age: pinned dependencies, no TypeScript, no CI, no tests, a schema that only worked because sequelize.sync({ alter: true }) quietly patched it at boot. The point of this repo is doing the unglamorous work of actually modernizing one, file by file, with the reasoning for every real decision written down as it happened.
backend/ Express 5 + Sequelize 6 + PostgreSQL, 100% TypeScript ✅ done
frontend/config package.json, tsconfig, vite.config, index.html ✅ done
frontend/helpers dateFormatter, errorHandler ✅ done
frontend/types Profile, Article, Comment, User, AuthState, + more ✅ done
frontend/services all 16 planned API service modules ✅ done
frontend/context AuthContext, FeedContext ✅ done
frontend/components 2 of ~24 (FormFieldset, ArticleTags) 🚧 in progress
frontend/routes ~10 route pages ⏳ not started
frontend/App+main entry point — last, once everything above exists ⏳ not started
See todo.md for the full file-by-file build-out plan.
Steps 1–4 (env, database, migrations, seed data) work today against the backend alone. Step 5 (
yarn dev) won't render anything yet — the frontend workspace exists, but its entry point (main.tsx) and every route/component that depends on it are still being built.
yarn install- Create a
.envfile inbackend/perbackend/.env.example. - Create the database:
yarn sqlz db:create
- Run the migrations — the backend no longer auto-syncs the schema at boot, so this step is required:
yarn sqlz db:migrate
- (Optional) seed it with dummy data:
yarn sqlz db:seed:all
- Start the dev servers:
yarn dev
MIT — see LICENSE. Original work Copyright (c) 2021 RealWorld.