Guided tour
Walk through it in order — about 10 minutes, one module per step. No third-party keys required at any point.
Payments go through the local demo checkout: nothing is actually charged, but it emits a webhook with a real HMAC signature that runs through exactly the same verification → normalisation → fulfilment core as Stripe. The only difference is who initiates the payment.
Demo accounts
The passwords are public — these accounts are for demo environments only
admin@example.com/admin1234Admin, can access the dashboarddemo@example.com/demo1234Regular userDon't have these accounts? Run pnpm demo:seed once — it is idempotent, so re-running creates no duplicates.
- 1Look at pricing and plans
Prices come from config/plans.ts — the pricing page and server-side validation read the same config, so you can never show one price and charge another.
- 2Sign up and verify your email
No mail channel configured: the verification email is printed to the terminal running the server, and the link is clickable.
- 3Open a subscribers-only article
Without a subscription you only see the title and the subscribe prompt — the body (and its meta description) is never sent.
- 4Subscribe to a paid plan
Opens the local demo checkout: clicking “simulate payment” emits a webhook with a real HMAC signature, through the exact same fulfilment path as Stripe.
- 5Watch the credits move
Subscription credits go into the “subscription bucket” (resets each period); the signup bonus goes into the “permanent bucket”. The ledger is append-only — every entry traces back to its source.
- 6Go back and leave a comment
The body is visible now. A first comment lands in the moderation queue — that is one of four anti-spam layers, not an error.
- 7Moderate it from the dashboard
Signed in as an admin you can approve / mark as spam / delete; once approved the comment is immediately visible to everyone on the article.
- 8Try the admin actions
Change roles, ban users, grant credits by hand. All three write to an append-only audit log — including who changed whom, and when.
Can't see the dashboard?
With no admin account yet, promote yourself with one command
pnpm user:promote your@email.com
This is the only way to create the first admin (the “make admin” button itself requires an admin). Command-line actions are audit-logged too.
Want to check it hasn't been broken?
pnpm verifyTypes + lint + tests + buildpnpm smoke --fullRuns the whole chain over real HTTP (signup → subscribe → paywall → comment → admin)The detailed walkthrough lives in docs/DEMO.md in the repo.