Turns Daybook into a multi-user tool and reworks the feed UI: - Multi-user: Django session login (username/password + remember-me), per-user personal API tokens (DRF authtoken), whole app gated behind login. Each artifact has an owner; feeds are private per user. - Rename persona -> source (free-text label for whatever posted an artifact: agent-profile, script, or person). source + tags form one unified label system; single label filter matches tags, source has its own filter/column/sidebar. - Settings area (gear/user menu, top-right): Account (view/regenerate token) and Demo Data (in-app button seeding one artifact per kind). User account management via Django admin (superusers only). - Feed rework: rolling 7-day window with sticky inline date separators and infinite scroll; left sidebar is now a Sources list with per-source unread counts; artifact type shown as text after title; source in its own column. - Unread tracking: read_at on Artifact, marked read when previewed, bold titles for unread, sidebar unread badges, old banner removed. - Tag colours: global shared registry, hash-based default with optional per-tag override via tag_colors on POST/PATCH. - Ingest: token resolves owner; same source name under two users' tokens stays isolated. daybook_post.py renamed persona->source, requires a real token, --check accepts a bearer token. Docs updated to match. Migrations 0004-0008 rename persona, add owner (nullable -> backfill to first superuser -> required), and add read_at. Fresh installs no-op the backfill. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.6 KiB
| name | description |
|---|---|
| daybook-posting | Use when you have produced a finished deliverable such as a report, summary, brief, diagram, generated HTML, PDF, deck, or status update that a human should review later outside this chat. Publishes the artifact to Daybook and returns a URL. |
Daybook Posting
Daybook is a private artifact journal for completed agent outputs. It stores, indexes, and displays artifacts for human review. It does not execute commands, run workflows, or continue conversations.
Always use the helper script. Do not hand-build curl, JSON, PowerShell multipart, or inline shell content.
From the project root:
python skills/daybook-posting/scripts/daybook_post.py --check
python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report" --content-file report.md
cat report.md | python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report"
python skills/daybook-posting/scripts/daybook_post.py --file diagram.svg --title "Architecture Diagram"
The project also keeps a compatibility wrapper at scripts/daybook_post.py, but the canonical helper is bundled inside this skill.
The artifact URL is printed as the final stdout line.
Configuration
Use environment variables:
DAYBOOK_URL=http://127.0.0.1:8001
DAYBOOK_TOKEN=your-personal-api-token
DAYBOOK_SOURCE=agent
DAYBOOK_TOKEN is your personal per-user API token, from Settings → Account in the app (not a token shared by everyone). Artifacts posted with your token land only in your feed.
Kind Cheat Sheet
| Kind | Use for | Content shape |
|---|---|---|
markdown |
Reports, briefs, notes | Markdown text. |
html_fragment |
Themed HTML reports/cards/tables | Body-only HTML. No html/head/body. |
html_full |
Complete custom pages/frameworks | Full HTML document with doctype/html/head/body. |
deck |
Simple slide-like artifact | Top-level <section>...</section> blocks. |
For images, PDFs, SVGs, and other files, use --file; the helper infers multipart and content type.
For CSV, JSON, or code that should render today, use --file path --as-markdown to post it as a Markdown fenced code block. Without --as-markdown, these upload as downloadable binary files.
Rules
- Run
--checkfirst if unsure Daybook is reachable. - Use a stable
DAYBOOK_SOURCEor pass--source(the agent-profile, script, or person name that produced this artifact). - Use
--tags a,b,cfor filtering. - Use
--meta run_id=... --meta model=...for machine-readable context. - Never inline multiline content into the shell command; use a file or stdin.