Let your agent scribl. Publish a page, share it like a doc, pull it back to build.
scribl turns a single-page HTML file into a private, shareable URL. Your
coding agent (or you) pushes a write-up — a plan, spec, report, or repo
breakdown — and gets back a link at https://scribl.ws/p/<slug>. Anyone you
invite can read and edit it inline in the browser, with live cursors. Then
your agent pulls the human-edited version back down before it builds.
That round-trip — agent writes → human edits & approves → agent builds the approved version — is the whole point.
Made by Denaro Labs, Inc. · OSS (MIT).
npm i -g scribl # or: pnpm add -g scriblNo global install needed if you'd rather not — every command works through
npx:
npx scribl@latest push ./plan.htmlscribl login # opens GitHub sign-in in your browserHeadless box with no browser? Use the device flow:
scribl login --device --label "ci-runner"Tokens are stored locally and can be revoked anytime from Settings → CLI tokens at scribl.ws.
# 1. publish — private to you by default
$ scribl push ./plan.html --title "Auth implementation plan"
✓ live at https://scribl.ws/p/aR7xK2 · private
# 2. let a teammate in (or open it up to anyone with the link)
$ scribl share aR7xK2 --email sam@acme.com --role editor
# …Sam opens the link and edits the plan in the browser…
# 3. pull the latest before you build
$ scribl pull aR7xK2 -o plan.html
✓ pulled v4 (edited 6m ago by sam@acme.com)You can also pipe HTML straight in, no temp file:
my-agent --render-plan | scribl push --title "Migration plan"| Command | What it does |
|---|---|
scribl push <file> |
Publish a page (or --update <id> to add a new version). Reads a file, --html, or stdin. Prints the URL. |
scribl pull <id|slug> |
Fetch the current HTML — -o <file> to write it, else stdout. --version <v> for a historical version. |
scribl ls |
List your pages. --owned / --shared to narrow. |
scribl share <id> |
Manage access (see below). |
scribl open <id|slug> |
Open the page in your browser. |
scribl rm <id> |
Delete a page (--yes to skip the prompt). |
scribl login / logout / whoami |
Manage CLI auth. |
Useful push flags: --title, --slug <custom-slug>, --update <id>.
Private by default. Invite individuals, or open the page to anyone with the link:
# invite a person as viewer or editor
scribl share <id> --email sam@acme.com --role editor
# anyone with the link can view…
scribl share <id> --link-access view
# …or edit (use --require-signin to disallow anonymous guests)
scribl share <id> --link-access edit --require-signin
# lock it back down, or revoke one person
scribl share <id> --link-access restricted
scribl share <id> --remove sam@acme.comscribl ships an agent Skill so your agent knows when and how to publish. Install it into your agent's skills directory:
scribl skill --installThen just ask:
› scribl a plan for adding auth to this project
› scribl a breakdown of this repo
› scribl a report of what changed this week
The agent renders the write-up as one HTML page, pushes it, and hands you the
link. Tip for agents: always pull before building from a plan you posted —
the human may have edited it.
Open any page link and you get a doc-style surface:
- Edit inline — a dual-mode editor over the HTML: visual blocks or raw code.
- Multiplayer — presence avatars, live cursors, and conflict-free concurrent editing (Liveblocks + Yjs CRDT).
- Doc-style sharing — private by default; invite by email as viewer/editor, or flip on anyone-with-the-link (view or edit).
Requires Node >= 20 and pnpm >= 9.
pnpm install
cp .env.example .env # fill in WorkOS / AWS / Postgres / Liveblocks values
pnpm dev # run everything via Turborepo
pnpm typecheck && pnpm lint && pnpm test && pnpm buildsingle/
├─ apps/
│ └─ web/ # TanStack Start app → Vercel
├─ packages/
│ ├─ cli/ # scribl → bin "scribl"
│ ├─ core/ # @scribl/core — Zod schemas, types, API + permission contract
│ ├─ skill/ # agent Skill bundle (SKILL.md + assets)
│ └─ config/ # @scribl/config — shared tsconfig, eslint, tailwind preset
└─ pnpm-workspace.yaml · turbo.json · package.json
@scribl/core is the contract: page schemas, the permission model (roles +
link-access enum), and request/response types shared by the CLI and web app so
they never drift.
| Area | Choice |
|---|---|
| Framework | TanStack Start (SSR + server fns) on Vercel |
| Routing | TanStack Router / Query / Table / Form |
| Auth | WorkOS AuthKit — GitHub sign-in & sessions (no organizations) |
| Storage | AWS S3 (SDK v3), versioned private keys |
| Realtime | Liveblocks + Yjs — presence, live cursors, CRDT co-editing |
| Editor | CodeMirror 6 (raw HTML) + a contenteditable block model |
| DB | Drizzle ORM + serverless Postgres |
| CLI | TypeScript, bundled with tsup → public npm |
| Monorepo | pnpm workspaces + Turborepo |
See PLAN.html for the authoritative architecture and
SPEC.md for implementation-level recon findings.
CI runs lint · typecheck · test · build on every PR (Node 20 & 22). The CLI is
published to the public npm registry via
Changesets on merge to main (with
npm provenance + a GitHub Release); the @scribl/* packages are private and the
web app deploys via the Vercel GitHub integration. Add a changeset with
pnpm changeset — see .changeset/README.md.
MIT © 2026 Denaro Labs, Inc.