A live review page for what your coding agent makes.
When an agent renders an image, records a clip, generates a sound or exports a 3D model, it usually opens a new window or leaves you a path deep inside a worktree β and you end up asking "open it" again and again. agent-dailies gives the agent one place to put things instead: a browser tab you keep open, where every result appears at the top as it is made, side by side with the alternatives, and stays there.
You reply to what it shows β OK, or a note β and answer its questions ("which of these three?", "which pattern?", a whole design review) right on the page: pick, press Send, add a note only if you want to. Those come back to the agent β even while it is idle β so the review loop runs through the page instead of through copy-pasted paths and options typed in chat.
Named after dailies, the daily review where a film or game team looks at yesterday's renders and decides what to keep.
- One tab, live β new posts slide in at the top (server-sent events); no windows pop up, nothing steals focus. The browser is opened only when no tab is.
- Every medium β images and GIFs, video (looping, muted, plays when in view; formats browsers no longer play, such as Ogg Theora, are converted once with ffmpeg if it is installed), audio, GLB/glTF (orbit with model-viewer), PDF, HTML, Markdown and text.
- History by issue and session β a sidebar lists repositories β issues (or
branches) β agent sessions, newest activity first, with unread dots, counts and
questions waiting; pick one to see just its posts, or search titles, files and
issues. Posts carry the issue key from the branch name (
summ-239βSUMM-239). - Devlog β on its own tab, apart from the review feed. When work has been
merged into the main branch (never before), the agent looks back and records
what changed, what worked (ε·₯倫), what was hard (θ¦ε΄) and what was decided, with
before/after β images, or videos for motion and sound β whenever the change can
be seen or heard; later,
agent-dailies devlog summary --since <when the last update ended>gathers everything since then β entries, decisions, commits, Claude Code transcripts (kept in the store before Claude Code deletes them) β to write the next one from. - The issue on screen β above an issue's posts, its title, status, project and description, fetched by a command you choose (Linear, GitHub, β¦) or written by the agent.
- Questions about what you see β
agent-dailies askturns files, patterns made of several files, and sentences into options A, B, Cβ¦ to pick from, shows the thing to sign off on above the options (--about), or takes a whole review sheet; your answers wake the agent. Questions answered from words alone stay in the terminal. - Notes on one file β when a post has several files, each file takes its own notes (the speech-bubble button under it, or in full screen), and they show under that file; the row below the post is for the post as a whole.
- Feedback reaches the agent β
agent-dailies watchexits (waking the agent) when you comment; hooks hand comments over before the agent stops and with your next message. - Take files with you β copy an image straight to the clipboard and paste it anywhere; copy a video's or model's path to paste into an upload dialog; download one file or the whole post under the original names; drag a file to the desktop or a folder.
- Kept β files are stored by content hash outside your repository, so they survive worktree cleanup and never bloat git.
- Keyboard first β
j/kposts,h/lfiles,oOK,cnote on the file (Con the post),ffull screen,1β9choose an option,Entersend it,ycopy (Ythe path),ddownload,[/]move through the sidebar,/search.
You need Node.js 22.6 or later on your PATH. Nothing
else: no npm package, no build.
/plugin marketplace add k1-c/agent-dailies
/plugin install agent-dailies@agent-dailies
The plugin is the whole tool. Claude Code fetches this repository; the plugin's
hooks run the code in it with Node, and at session start they put its bin/ on
the agent's PATH (through $CLAUDE_ENV_FILE), so the agent can simply type
agent-dailies show β¦. The plugin also adds a skill (when and how to show
things) and hooks that tell the agent about the viewer, stop xdg-open/image
viewers/video players on media files in favour of agent-dailies show, and
hand your comments to the agent.
Clone the repository and put bin/ on your PATH:
git clone https://github.com/k1-c/agent-dailies ~/.local/share/agent-dailies-src
ln -s ~/.local/share/agent-dailies-src/bin/agent-dailies ~/.local/bin/
agent-dailies guide # the instructions to give your agent (CLAUDE.md / AGENTS.md)agent-dailies hook <pre-tool-use|session-start|user-prompt-submit|stop> reads
a Claude Code style hook event on stdin, if your agent has hooks.
The agent runs:
agent-dailies show render_a.png render_b.png --title "Lighting: A / B" --note "B lowers the fill light"Shown 2 files in the viewer: http://127.0.0.1:4777/#p_mupkr1fn81b4a9
1. render_a.png (i_mupkr1c5fdf43e)
2. render_b.png (i_mupkr1c613713a)
The viewer is open in 1 tab; it updated in place. No need to open anything.
When it needs a decision, it asks:
agent-dailies ask "Which front view do we keep?" a.png b.png --option "Neither β redraw it" \
--why "B matches the back view best; A loses the cape."
agent-dailies ask "Which palette?" --pattern "Current" c_front.png c_back.png --pattern "Warmer" w_front.png w_back.png
agent-dailies ask "Ship this cut?" --about cut.mp4 --option "OK" --option "Fix something" # sign off on one thing
agent-dailies ask --file review.json # several decisions at once (see the skill for the format)
agent-dailies wait <post-id> # in the background: exits with the answersYou look, reply and answer in the tab. The agent reads it back:
| Command | What it gives the agent |
|---|---|
agent-dailies context |
What you selected (or the newest post): files with readable paths, answers, replies |
agent-dailies wait <post-id> |
Blocks until every question of a post is answered (or you comment on it), prints the answers, exits |
agent-dailies watch |
Blocks until you comment on this session's posts, prints the feedback, exits. Run it in the background so your comment wakes the agent |
agent-dailies feedback [--since 2h] [--all] |
Your replies and answers for this worktree |
agent-dailies list [--all] |
Recent posts |
agent-dailies get <item-id> [--to PATH] |
A stored file |
And for you: agent-dailies open (open the viewer), status, stop, and
agent-dailies remove <post-id>β¦ | --project NAME to take posts out of the store for good
(something shown from the wrong repository, say): it lists them and asks first (--yes skips
that), copies the log to backup/ before, and deletes their files unless another post shows
the same content. The β on a post in the viewer does the same, after a confirmation.
| Situation | Use |
|---|---|
| The agent's work in progress, to look at | show |
| A choice between things to look at: which render, how it looks, what to keep | ask |
| A page other people read, or that outlives the work (a report, a shared doc) | your agent's documents / Artifacts |
| Any question answered from words alone (which approach, yes/no, a name) | the terminal |
Every post remembers the agent session that showed it (CLAUDE_CODE_SESSION_ID).
A comment on it, or an answer to its questions, is pending for that session until
it has been handed over once:
- While the agent is idle β it keeps
agent-dailies watchrunning in the background. Claude Code wakes the agent when a background command exits, andwatchexits with your comment. - When the agent is about to stop β the Stop hook hands over unread comments
(and, once per unanswered question it asked, reminds the agent to start
wait; a show alone needs no reply, so it gets no reminder). - With your next message β the UserPromptSubmit hook adds marks and comments since the agent last heard.
- In a new session β the SessionStart hook passes on feedback left in this worktree that no session read.
| On the page | What you get |
|---|---|
β§ copy (y) |
Still images: the picture itself (as PNG) β paste into chat, issues, posts. Text files: the text. Video, audio, GIFs, models: the file's path, because a web page cannot put those on the clipboard as files; in an upload dialog press Ctrl+L and paste. Shift-click (Y) always copies the path. |
β€ download (d), β€ All |
The file, or every file in the post, saved under the original names. From Chrome's download bubble you can drag them on into another site. |
| Drag a file name (or an image) | Dropped on the desktop or in a folder, the file itself; dropped on another page, images arrive as images and other files as their link. |
Paths point to named/<item>/<original name> in the store, a hard link to the
stored copy, so the name is right and no space is used.
agent-dailies devlog add --title "What changed" --before old.png --after new.png --summary - <<'EOF'
What changed for the people using it, and why.
## ε·₯倫
What worked β the idea that made it work.
## θ¦ε΄
What was hard: what failed first, what was tried.
## ζ±Ίγγγγ¨
What was decided.
EOF
agent-dailies devlog summary --since "2026-10-01 18:00" # material since the previous updateSections may also be given as --craft, --struggle, --decided (English
headings "Craft", "Struggle", "Decided" work too). Before/after take files or the
ids (i_β¦) of files already shown β images, or videos for motion and sound β and
are expected whenever the change can be seen or heard. Only merged work is recorded:
the PreToolUse hook notes the merges a session runs (and commits it makes straight
on the main branch); once a merge has landed, its commits and the merged branch's
issue are attached, and devlog add refuses work still on a branch. The Stop hook
suggests an entry once after a merge lands; the agent decides whether one is worth it. Transcripts are copied at
session start and end (agent-dailies devlog sweep by hand).
A recorded entry can be corrected β agent-dailies devlog edit <p_β¦> --before new.png --reason "the before was wrong" (or --title, --summary, --craft, --struggle,
--decided, --after, --no-before, --no-after, --issue) β or taken back with
agent-dailies devlog retract <p_β¦> [--undo]. Nothing is rewritten or deleted: the
correction is a new event in the log, applied to the entry wherever it is read, and the
viewer marks the entry as edited (with the reason) and can show it as first recorded.
(agent-dailies remove is the other thing: it takes a post and its files out of the store
for good, with no undo.)
agent-dailies talks to no tracker itself. Name a command that prints an issue as
JSON in your config file, $XDG_CONFIG_HOME/agent-dailies/config.json
(~/.config/agent-dailies/config.json); {key} becomes the issue key:
{
"issueCommand": "gh issue view {key} --json title,body,state,url",
"projects": {
"game-lab": { "issueCommand": "linear-tui issue show {key} --json" }
}
}When a post names an issue, the CLI runs the command in the background (at most
every 30 minutes per issue) in the post's repository and records the title,
description, status, URL, project, milestone and labels; Linear (linear-tui),
GitHub (gh) and Jira-like JSON are understood. Only your own config is read β
a repository cannot make agent-dailies run commands. Without a command, agents
can describe an issue with agent-dailies issue <KEY> --title β¦ --description β¦;
agent-dailies issue <KEY> --refresh fetches it now.
$XDG_DATA_HOME/agent-dailies/ (~/.local/share/agent-dailies)
blobs/<ab>/<sha256><ext> files, once per content
log/<machine>.jsonl append-only events: post (with its questions), comment, answer, issue,
amend and retract (corrections to a devlog entry; the entry's post
event is never rewritten), remove (readers forget the post; its files
go unless another post shows them), and verdict (per-file marks before 0.5)
backup/<machine>-before-removing-<what>-<date>.jsonl the log as it was before each `remove`
named/<item>/<original name> hard links under the original names (copy path)
derived/<sha256>.webm videos converted for the browser
transcripts/<project>/<session>.jsonl Claude Code transcripts, kept
sessions/<session>.json what each agent session has been handed, and where it began
selection.json what is selected in the viewer
server.log
Each machine only appends to its own log, so syncing the store between machines is a plain union β the groundwork for the planned sync (below).
| Variable | Default |
|---|---|
AGENT_DAILIES_HOME |
$XDG_DATA_HOME/agent-dailies |
AGENT_DAILIES_PORT |
4777 |
AGENT_DAILIES_HOST |
127.0.0.1 (0.0.0.0 to reach it from other machines, e.g. over Tailscale) |
AGENT_DAILIES_NO_OPEN=1 |
never open a browser from show |
AGENT_DAILIES_BROWSER |
command to open URLs with |
AGENT_DAILIES_AUTO_WATCH=0 |
no Stop-hook reminder to start wait for an unanswered question |
AGENT_DAILIES_DEVLOG=0 |
no Stop-hook suggestion of a devlog entry |
AGENT_DAILIES_ISSUE_COMMAND |
the issue command, overriding the config file |
AGENT_DAILIES_CONFIG |
another config file |
The viewer listens on 127.0.0.1 only and has no login. It refuses requests
whose Host is not the viewer's own address (DNS rebinding), requires JSON for
every write (so other sites cannot post forms to it) and rejects cross-origin
writes. Listening on 0.0.0.0 turns the Host check off β do that only on a
network you trust.
- Sync the store between machines through Cloudflare R2, set up by
agent-dailies initafterwrangler login(no infrastructure to run): files fetched on demand, logs merged. - Provenance between posts (this model came from that sketch, that prompt).
- Codex and other agents' hooks.
npm run setup # TypeScript and types into dev/; the tool itself has no dependencies
npm test # node --test, TypeScript run directly by Node
npm run verify # typecheck, test, build
bin/agent-dailies show some.pngThe 3D viewer (model-viewer, with
three.js and Lit) is vendored in web/vendor/ so the page works offline; their
licenses are in web/vendor/licenses/. npm run vendor refreshes it.
Development tooling lives in dev/package.json, not the root one: Claude Code runs npm install
on a plugin that has dependencies, and this plugin needs none.
MIT