v0 · local · four engines

The CLIs do the work.
The ledger remembers.

One local chat API over Claude, Codex, Grok, and Copilot. Official engines run the turn. Codicent Logbook is the append-only store. A job is just a tagged message.

terminal
# one process owns in-flight jobs
dint serve

# enqueue work as a Logbook message
dint job grok "Summarize this repo"
# job    <logbook-id>
# chat   <chat_id>

dint list <chat_id>
4
Official CLIs, not reimplemented
#job
Work is a tagged Logbook post
parentId
Codicent-style conversation chain
MIT
Small Python package, no deps
Why it exists

Agents already have CLIs. They do not share a ledger.

Claude Code, Codex, Grok, and Copilot each keep their own sessions, transcripts, and resume ids. That is fine for a terminal. It is a poor inbox: nothing to search later, nothing to enqueue from another tool, no common #user / #bot thread.

Do not wrap the model

dint does not call the model APIs itself. It spawns the official CLI, streams events, and resumes with the engine’s own session id.

Logbook is the store

Every chat is an append-only Codicent thread: header, then #user and #bot turns chained with parentId. The ledger is Logbook, not a dint database.

Jobs are messages

Post @project #job #grok … and dint serve runs it. Ack is #job-run, so the webhook does not loop. Same path as an interactive send.

How it fits

A thin router between CLIs and Logbook.

start_chat, send, cancel. Engines do the work. ChatLog writes the thread. Serve turns Logbook webhooks into background turns.

01

Start a chat

Pick an engine and a working directory. dint posts a header in Logbook and keeps the native session id when the CLI returns one.

02

Send a turn

The CLI streams JSONL. dint maps that to text, tools, and errors, then writes the user prompt and the joined bot reply onto the same parentId chain.

03

Or post a job

Keep dint serve running. A #job message is enough — from the CLI, from Logbook, or from anything that can PostMessage.

Engines on PATH today

claude codex grok copilot
Status

v0 is a local router, not a product yet.

Interactive send and webhook jobs work against a local logbook-server. Follow-ups use the engine session. What is still rough: no HTTP chat API, jobs are one-shot, serve must stay up, and dint chats previews the last message rather than a title.

You canNot yet
Chat from the CLI or Python Router Hosted multi-user service
Enqueue #job for Claude / Codex / Grok / Copilot Follow-up jobs on an existing chat from Logbook
Read the full thread with dint list Small UI (planned after an HTTP API)
Get started

Logbook plus one engine CLI.

install
# once: logbook-server + pipx
curl -fsSL https://logbook.codicent.ai/install.sh | bash
# Windows: iwr https://logbook.codicent.ai/install.ps1 | iex
pipx install dint-cli

# in any folder
dint                          # chat  —  /help /engine /job /chats
dint job grok "Summarize this repo"

dint starts logbook-server and a background dint serve if they are not running. One logbook covers every folder (chats store cwd). If port 5100 is another logbook, dint picks the next free port. Needs logbook-server and one engine CLI on PATH. Full commands are in the README.