protocontent · roadmap

Next Steps

What's shipped, what to do next — prioritized by what unblocks others, what's needed before outside users, and what widens the category. Honest about the debt.

✓ Live · deployed on Cloudflare Stack · Workers · R2 · D1 · Durable Objects Updated · Jun 6, 2026

Where we are

The v1 loop is built, deployed, and verified live end-to-end.

Worker deployed; *.protocontent.app content routing
publish / list / history / keep / unpublish
Per-thread spaces, version history
Live WebSocket push (Durable Objects)
CSP + noindex + nosniff on served content
npx bridge → real publish verified
Shipped · autopilot hardening pass

Hardening — done & deployed

Built, merged, and verified live this pass (PRs 1–7 on GitHub).

PSL-free isolation — CSP sandbox opaque origin
High-entropy private space ids (~110 bits, cached)
Token-gated private session index (?k=)
Size caps + KV rate limiting
Moderation kill switch + abuse reports
.protocontent/ gitignore convention
Claim & manage dashboard
Cold-start fix (first publish ~340 ms)
Now · unblock & de-risk

Small, do these first

Cheap moves that either unblock distribution or close a real hole.

Publish the bridge to npm✓ shipped · v0.1.0

Done — live as protocontent@0.1.0 (the name was free), so npx protocontent works for anyone. Note: a client-side minimumReleaseAge npm policy can delay installs.

Audit space ownership on publish✓ audited · safe

Verified — no hole. ensureSpace rejects a publish to another project's space with 403; list/unpublish/keep are guarded by requireOwnedSpace. Confirmed live: a second project gets 403 on publish/list/unpublish while the owner keeps full access. (Artifact reads stay public by capability-URL design — see #5.)

3
Server-side size & rate capsS–Mabuse / cost

The bridge has client-side rails, but the Worker API has none. Add request/file size limits and basic per-token rate limits on /v1/publish and /v1/projects (anonymous mint is unauthenticated).

Before outside users · hardening

Required once it's not just you

The line between "personal tool" and "service other people put content on."

4
Dedicated content domain + PSL◑ domain shipped

Done: artifacts now serve on *.protocontent.app — a separate registrable domain from the .com control plane, so untrusted HTML can't share cookies with it. Legacy .com links 301→.app. Remaining: submit protocontent.app to the Public Suffix List for inter-artifact isolation (review takes weeks — do it before sensitive third-party content).

5
Token-private session pagesM

The session index currently shows everything to anyone with the (unguessable) subdomain. Add an optional private flag / token gate for the index — it's the one URL that exposes a whole thread at once.

6
Abuse handling & takedownMyou're a content host now

Phishing/malware scanning on upload, a report/takedown path, and a kill switch. Unavoidable once the link is public and anyone can mint a project.

7
Test performance & loadS–M

Measure publish/serve latency and load-test the live push + D1/R2 under concurrency before real traffic. The first run already paid off. A 2 KB→2 MB sweep ruled out payload (publish ~340→~730 ms, sub-linear). The real spike was a Durable Object cold start on the first publish to an idle space (~700 ms, because publish awaited the live-push notify). Fixed & shipped via ctx.waitUntil — cold penalty ~700 ms → ~130 ms. Warm publish p50 ~335 ms, serve ~165 ms, mint ~50 ms. Next: concurrent throughput, R2/D1 ceilings, a CI perf gate.

Widen · features

Make it cover more of what agents make

The general primitive is already MIME-agnostic — these are the views worth building.

8
Markdown renderingM

The one type that needs a server-side renderer (raw .md shows as plain text). Images & PDFs already serve natively.

9
Image / gallery view in the session pageS–M

Serving works; add thumbnails + a lightbox so a space full of screenshots reads as a gallery, not a file list.

10
Version diff UIM

history already tracks versions — add a visual diff between two versions of an artifact.

11
Project rollup pageM

A durable landing page listing all your spaces across threads — the "project" half of the model that exists in the schema but has no view yet.

12
Accounts, teams, OAuthL

Named projects, shared spaces, Workers OAuth provider — when you outgrow anonymous tokens.

Distribution · the real test

Find out if it's a thing

The build was the cheap part. This is what answers the actual question.

13
Build in publicS · ongoing

Show HN, an awesome-mcp-servers PR, MCP discussions, X — lead every post with a 30-second GIF of the phone-live-view moment.

14
Get it in front of the Claude Code teamS

Frame it as "the missing 'upload it' step from The Unreasonable Effectiveness of HTML." That single resonance is product validation and the hire signal at once.

The one metric that matters: publishes from more than one distinct agent (Claude Code and Cursor and Codex…). All-Claude usage means a vendor absorbs it; cross-agent usage means the neutral layer is real.
Known debt · be honest

What's thin right now

!The remote McpAgent fallback (URL-only agents) compiles but is untested live — only the bridge path is exercised.
!No CI / automated tests — everything was verified by hand. Add a smoke-test workflow before iterating fast.
!Anonymous-token model is zero-friction but unauthenticated — fine for now, but it's why caps (#3) and abuse handling (#6) matter.
!Install is a local path until the npm publish (#1) lands.