Unmarketed Labs
← Work
08

CASE STUDY — 2025

When the lights come on, they scatter.The infrastructure was built to keep the lights on.

CR News · Full Stack Build (Publication + Newsroom CMS) · Independent Journalism · 2025

Cockroach Republic News — crnews.in

YEAR

2025

delivery year

SCOPE

Full stack build

site + CMS, one codebase

PUBLICATION

crnews.in

Cockroach Republic News

BUILT FOR

Independent journalism

that won’t back down

THE CLIENT

Cockroach Republic News is an independent Indian digital newsroom. The name is a statement about survival. The editorial position is about power accountability: the stories powerful people would rather not see published. CR Desk — the internal CMS — was built alongside the public site, in a single Next.js application on Supabase and Vercel.

What CR News needed was not just a website. It needed infrastructure built for the kind of journalism it does: a system that could survive a legal notice without panicking, maintain an unalterable revision record without discipline from contributors, and stay online through the technical failure modes that knock small newsrooms offline.

THE CHALLENGE

Independent newsrooms are soft targets.

Legal pressure, credential leaks, single-contributor gatekeeping — the failure modes of independent journalism are well-documented and predictable. Most publishing platforms are designed for content creation. CR News needed a platform designed for content integrity. The CMS had to behave as though a hostile actor was already looking for a way in.

01

A legal notice is a test of the archive, not just the lawyer

When a legal notice arrives, the question is not just “is this story defensible?” — it’s “can you prove the story existed, in this form, at this time, without gaps?” CR News archives every published story to the Wayback Machine automatically on publish, and again on every update. The revision history is insert-only at the database level — no record can be overwritten, only appended to. A legal challenge against a CR News story meets a timestamped chain of evidence it cannot unravel.

INFRASTRUCTURE
02

A single editor cannot be the only lock on publication

The two-key publish gate is enforced by a database trigger, not by policy. Publishing a story requires a 6-of-6 charter checklist to be cleared, and the person who clears the gate can never be the story’s author. A single editor cannot publish their own work unilaterally — regardless of role, regardless of permissions. This is not a workflow rule. It is a constraint in the database that no interface can bypass.

DATA ARCHITECTURE
03

Evidence stays private until publication, then stays permanent

CR News has two storage systems: a public media bucket for published assets, and a private evidence locker for source materials and documents that should never appear on the public site. Access to the evidence locker requires the same MFA-mandatory authentication required for the desk — TOTP, AAL2-level, mandatory for every desk user with no opt-out. Source material is not stored in a folder on someone’s laptop. It is in a system designed to keep it there.

SECURITY
04

Authentication cannot be optional for contributors

The desk login requires TOTP multi-factor authentication. There is no bypass. There is no “remind me later.” Every contributor, every time. Sessions are revoked when the JWT secret rotates. The /desk route is never linked publicly — it does not appear in navigation, in sitemaps, or in any public-facing page. For a newsroom handling politically sensitive material, the authentication system is part of the editorial promise, not an inconvenience layered on top of it.

ACCESS CONTROL

WHAT WE BUILT — AND WHY IT’S BUILT THIS WAY

The decisions that define the system.

WHAT CR NEWS SHIPS

Next.js 16 public site (RSC-first, ISR) — story pages, corrections log, editorial standards

CR Desk — the newsroom CMS — in the same codebase, auth-gated at the route level

Two-key publish gate via database trigger (6/6 charter checklist; gate-clearer ≠ author)

Insert-only revision model — every edit is a new record; nothing is deleted

MFA-mandatory desk authentication (TOTP, AAL2)

Private evidence locker (separate from public media storage, same auth requirements)

Automatic Wayback Machine archiving on publish and update (GitHub Actions)

Nightly encrypted backups — pg_dump to S3-compatible storage, 30 daily + 12 monthly retained

Verdict badge system with an automated test enforcing it (verdict colors exist in exactly one component — RLS test blocks any attempt to use them elsewhere)

GitLab mirror — nightly push, insurance against GitHub availability

The two-key gate is a database trigger, not a policy

Policies can be ignored under pressure. A database trigger cannot. The publishing constraint — cleared checklist, different author and gate-clearer — is enforced at the data layer. No interface, no role, no workaround can bypass it. When the pressure to publish fast arrives, the system does not care.

Insert-only revisions, corrections are public and permanent

When CR News corrects a story, the correction is appended to the revision record, dated, and made public. The original version does not disappear. This is not just an editorial ethics position — it is the architecture. An insert-only constraint at the database level means no contributor, no matter their access level, can retroactively alter what was published. Accountability is structural.

The backup restore procedure is rehearsed quarterly

A RUNBOOK that has never been tested is not a RUNBOOK — it is a document. The restore procedure is rehearsed into a scratch Supabase environment on a quarterly schedule. Every step is documented from the perspective of someone reading it under pressure at 2am. If a step requires knowledge that isn’t in the document, the document is wrong.

THE OUTCOME

The rules are tested, not remembered.

Public site and CR Desk operational. Two-key publish gate verified. Revision system tested across multiple contributors. Wayback Machine archiving confirmed on first publish. Backup restore rehearsed before the publication went live.

The test suite enforces the brand rule about verdict colors (they appear in exactly one component) and runs the full RLS matrix on every CI push. The system does not rely on contributors remembering the rules. The rules are tested.

[Image coming soon]

crnews.in public homepage — clean newsroom aesthetic

[Image coming soon]

CR Desk story editor — auth-gated, clean writing surface

[Image coming soon]

Corrections log — dated, public, permanent

Client Quote — Pending

A verified testimonial from the CR News editor will appear here once sourced. No stand-in or fabricated quote is published on the live page.

HONEST REFLECTION

The audit trail records what was published and when. What it cannot enforce is the human decision to document the smaller editorial judgments — why a source was trusted, why a claim was included, why a story was held. The system is built to make formal corrections easy and permanent. The informal reasoning that led to each decision lives in the editor’s notes, not the database. That is the right boundary. It is also the one that requires the most editorial discipline to maintain.

Building something that needs to stay up under pressure?

Infrastructure, architecture, and the product itself.
We build the whole thing.

Start the conversation →