A 24-hour URL for self-contained HTML prototypes, with the design rationale baked in. Prototypes should be websites someone clicks, not files they have to download — I publish one HTML file plus a cleaned scratchpad markdown, and the service returns an unguessable link that hosts an interactive viewer for 24 hours, then deletes itself. No accounts. The URL is the only identifier; a paired delete URL is the only ownership credential.
- Sharing an HTML prototype today is annoying. Build the file, attach it in Slack, the recipient downloads it, hunts for it in Downloads, opens it locally — the browser sometimes blocks it, the relative paths sometimes break, the asset doesn't load. ikohi turns it into a URL: paste the link, the recipient clicks, it opens like any website.
- The 24h expiry digitises "got a minute?" — if the recipient can engage in the window, the conversation happens now; if they can't, "the link dies so the conversation can live". The TTL is the coordination signal, not a storage constraint.
- The rationale travels with the prototype. A scratchpad is a running markdown log that records the small decisions you make while directing an AI agent — why this is a popup not a tooltip, why the button reads "next" not "continue". Long Claude Code sessions are too dense for summaries to capture those choices; the scratchpad keeps them at the granularity they were made. ikohi ships the cleaned scratchpad alongside the prototype, so a reviewer sees both the destination and the reasoning behind every small call — with no separate design doc.
The sender flow is one Claude Code skill, /iskra, with two triggers. At the start of a build session I say "iskra" — the skill bootstraps a scratchpad and starts recording rationale as a side effect of building. When the prototype is ready I say "publish this" — the skill cleans the scratchpad, posts both files as multipart to POST /upload, and prints back { id, url, deleteUrl, expiresAt } plus opens the viewer. The recipient (also on Claude Code) pastes the share URL; their agent WebFetches /[id]/raw, edits locally, re-publishes as a new share. Shares are immutable; iteration is a chain of uploads. Expired shares return 410.
sender CC ──"iskra"──► scratchpad recording starts
│
▼
──"publish this"──► POST /upload ──► R2 + KV
│
▼
{ id, url, deleteUrl, expiresAt }
│
▼
recipient CC ──WebFetch /[id]/raw──► local edit ──► new /iskra session
Cloudflare Workers + R2 + KV. nanoid IDs. Viewer iframes the prototype with sandbox. Endpoints: POST /upload, GET /[id], GET /[id]/raw, GET /[id]/scratchpad, POST /[id]/delete?key=.... TTL: 24h, hard.
Sender entry point in v1 is the Claude Code skill /iskra. Trigger phrases: "iskra" at session start (begins scratchpad recording), "publish this" when the prototype is ready (uploads + returns the share URL). No web drop-zone. Install: TODO.
Recipient surface is the built-in WebFetch against /[id]/raw — no install, any Claude Code session works. Non-Claude-Code users are out of scope for v1.
- v0 —
POST /uploadaccepts multipart HTML + markdown, writes R2 + KV. Viewer renders the HTML full-bleed in a sandboxed iframe with expiry countdown and Download HTML. Sidebar drawer renders the scratchpad as markdown./iskraworks end-to-end. - v0.5 — Delete endpoint wired up. Sandbox hardening. Rate limit on
/upload. Cost telemetry against the ≤ $40 launch-budget challenge. - v1 — Launch Thursday, June 4, 2026. An "ephemeral mutual-attention primitive" for me and a few close collaborators on Claude Code. No auth, no billing, no moderation. Where this goes next: element-bound rationale (scratchpad sections pointing at specific DOM nodes), more artifact types, then the same primitive embedded inside Slack / Discord / Notion / Figma / email.
MIT