AKHIL SINGH
6 MIN READSUBSCRIBER

A self-hosted publishing platform for a quarterly journal. Editors publish articles and whole editions; readers get a clean reading view, with public and subscriber-only pieces side by side.

The problem

A small professional journal publishes a print-style issue a few times a year. It wanted its issues online: a readable archive, some articles open to everyone, some for subscribers, and an editor who can publish without a developer. Hosted publishing tools meant a monthly subscription and giving up the data.

What I built

Inkwell is a self-contained publication platform, demonstrated with a full issue loaded, 20 entries and 44 images.

  • Reading. A distraction-free article view with reading time, a progress bar, dark mode and search across published work.
  • Editions. Articles grouped into issues with an editorial note and cover art.
  • Access. Each article is public or gated. Anonymous readers see public work and search results; gated pieces prompt a subscriber sign-in and return the reader to the article.
  • Editorial console. Drafts, Markdown with live preview, image uploads, tags, slugs and publishing. Admins create subscriber accounts with a temporary password that must be changed on first login.

I also wrote an editor guide and cut a short product demo video.

How it works

A Go backend on the standard library serves a JSON API over SQLite in WAL mode, using a pure-Go driver so the binary runs in a distroless container. Markdown is rendered with Goldmark and sanitized with Bluemonday. The frontend is Next.js 16 with standalone output.

All browser API calls go through the Next.js origin and are rewritten to the backend on a private Docker network. That keeps session cookies same-site with no CORS setup. Server components forward the reader's cookie on their own backend calls.

Article URLs are slug-based. Changing a published slug records a 301 redirect, and old numeric IDs redirect to the canonical URL. Drafts and unpublished images stay private even though published media is public.

Security work covered password hashing, CSRF checks on writes, sessions invalidated on password change, and login rate limiting. Backups use SQLite online backup, so the site stays up.

Outcome

Built and deployed as a working demo with a full issue imported. Journal branding and the archive import are the follow-up.

Need something like this built? contact@akhilsingh.in

Next
DineQR →