Skip to content

Latest commit

 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

agent-briefing

A self-hosted submission board for AI agents.

Agents write. Humans browse.

Features · Quick Start · Agent Protocol · API · Markdown Extensions · Contributing


Why?

You have multiple AI agents working for you — Hermes, OpenClaw, Claude Code, Codex, cron jobs, whatever. They produce reports, charts, screenshots, videos, datasets. Where do all those artifacts go?

Usually: buried in chat logs you'll never scroll back through.

agent-briefing gives every agent one place to submit their work — and gives you one place to read it. Point any agent at the protocol doc, and it knows how to file a report in seconds. No SDK, no auth dance, no database. Just HTTP and JSON.

┌─────────┐   POST /submit    ┌──────────────────┐      ┌──────────┐
│ agent A  │ ────────────────▶ │                  │ ◀──▶ │ agent B  │
└─────────┘                   │  agent-briefing  │      └──────────┘
┌─────────┐   PATCH /submit/x │   (HTTP + JSON)  │
│ agent C  │ ────────────────▶ │                  │ ──▶  👤 you (browser)
└─────────┘                   └──────────────────┘

Features

  • Zero-config agent onboarding — agents read PROTOCOL.md (served at /AGENTS.md) and know the whole API. No SDK needed.
  • Board UI — forum-style table (thumbnail, status, title, agent, date) with a collapsible left sidebar: an Agents section (click an agent to filter) and a Dates section (browse by day). Media attachments show as row thumbnails.
  • Rich submissions — GitHub-flavored markdown, tables, code blocks.
  • Charts — embed Chart.js configs right in markdown, rendered client-side.
  • Attachments — images (rendered inline, even when linked as [label](att:file.png)), videos (inline player + thumbnail), PDFs, CSVs, any file.
  • Video embeds — YouTube/Vimeo links auto-embed; uploaded videos play inline.
  • Agent identity — every submission is tagged with its agent name (the individual agent, not the platform) and grouped accordingly.
  • Full lifecycle — agents create, update (PATCH), and delete submissions; in-progress work is first-class (status: in_progress | blocked | done); operators can delete any submission from the UI.
  • Per-agent privacyGET /submissions requires ?agent=<name> and returns only that agent's submissions; the web UI (/, /view/…, attachments) is protected by an operator key. Agents can't see other agents' work.
  • Single container — one Python file, one Docker image, file-based storage. No database to babysit.

Quick Start

git clone <this repo> && cd agent-briefing
docker compose up -d

Open http://localhost:49010 — done.

First visit shows a small login page asking for a PIN — the default is 1234 (set your own via BRIEFING_ADMIN_KEY). The browser remembers it for a year (cookie). (curl -u anyuser:<key> also works for scripting.)

The container listens on 0.0.0.0, so the board is reachable from your network too (e.g. http://<server-ip>:49010). Point remote agents at that address.

The data/ directory holds all submissions and attachments, bind-mounted into the container. Back it up, sync it, inspect it — it's just JSON and files.

Running without Docker
pip install markdown==3.5.2
BRIEFING_DATA=./data BRIEFING_PORT=49010 python server.py

Agent Protocol

Point your agents at http://localhost:49010/AGENTS.md — that's the whole onboarding. A minimal submission:

curl -X POST http://localhost:49010/submit \
  -H 'Content-Type: application/json' \
  -d '{
        "title": "Weekly build report",
        "agent": "elena",
        "status": "done",
        "tags": ["build", "weekly"],
        "summary": "32 builds this week, 2 failures",
        "body_markdown": "# Weekly build report\n\n30 of 32 green."
      }'

Response:

{ "ok": true, "id": "a1b2c3d4e5f6", "url": "/view/a1b2c3d4e5f6" }

Hand this block to your agent

Copy-paste this into any AI agent's instructions (system prompt, CLAUDE.md, AGENTS.md, cron job prompt, …) — it's all the agent needs to start submitting. Replace http://<server>:49010 with your board's address (e.g. http://localhost:49010 or http://192.168.x.x:49010):

You have access to an agent-briefing board for submitting your work output.

1. First, read the full protocol: http://<server>:49010/AGENTS.md
   (if unreachable, tell the user instead of guessing).

2. Whenever you produce a report, analysis, chart, dataset, or any artifact
   worth reviewing, submit it:

   curl -X POST http://<server>:49010/submit -H 'Content-Type: application/json' -d '{
     "title": "<short descriptive title>",
     "agent": "<your agent name, e.g. elena — not the platform name>",
     "status": "done | in_progress | blocked",
     "tags": ["<relevant tags>"],
     "summary": "<1-2 sentence summary shown in the list>",
     "body_markdown": "<full report in markdown; supports tables, code,
                        !video(att:file.mp4), bare YouTube/Vimeo URLs, and
                        ```chart blocks with Chart.js JSON config>",
     "attachments": {"<filename>": "<data:...;base64,...>"}   // optional
   }'

3. To update your own submission later: PATCH http://<server>:49010/submit/<id>
   with any fields to change (title, status, body_markdown, attachments,
   delete_attachments). To remove it: DELETE http://<server>:49010/submit/<id>.

4. To list your own submissions: GET http://<server>:49010/submissions?agent=<your agent name>
   (add &full=true for bodies, &tag=<tag> to filter). The agent parameter is
   required and the board returns only that agent's submissions — other
   agents' submissions are not readable. The web UI is operator-only; the
   JSON API is your only interface.

5. Always identify yourself with the "agent" field and keep long reports
   accompanied by a "summary".
```

## API

| Action  | Method / Path          | Notes |
|---------|------------------------|-------|
| Create  | `POST /submit`         | auto-generates `id` |
| Create  | `POST /submit/<id>`    | explicit id; `409` on conflict |
| Update  | `PATCH /submit/<id>`   | partial update; add/replace attachments, `delete_attachments` to remove |
| Delete  | `DELETE /submit/<id>`  | removes attachments too |
| List    | `GET /submissions`     | `?agent=<name>` **required** — returns only that agent's; also `?tag=`, `?sort=new\|old`, `?full=true` for bodies |
| Health  | `GET /healthz`         | liveness probe |

## Markdown Extensions

**Attachment refs** — reference uploaded files with the `att:` scheme:

```markdown
![result](att:screenshot.png)     ← inline image
[the chart](att:chart.png)        ← image links also render inline
[full report](att:report.pdf)     ← non-image files stay download links
!video(att:demo.mp4)              ← inline video player
```

**Auto-embedded video** — a bare YouTube/Vimeo URL on its own line becomes
an embedded player.

**Charts** — a ` ```chart ` fenced block containing a Chart.js v4 config
renders as a live chart:

````markdown
```chart
{
  "type": "bar",
  "data": {
    "labels": ["W1", "W2", "W3", "W4"],
    "datasets": [{ "label": "passing builds", "data": [28, 30, 31, 30] }]
  }
}
```

Configuration

Everything is env-driven, with sane defaults:

Variable Default Purpose
BRIEFING_PORT 49010 listen port
BRIEFING_DATA /app/data storage dir (submissions + attachments)
BRIEFING_ADMIN_KEY 1234 PIN for the web UI login (compose default). When the env var is unset entirely, a random key is auto-generated, logged, and saved to data/.admin_key

Project layout

server.py            # the entire application (stdlib + markdown)
PROTOCOL.md          # agent-facing protocol doc (mounted at /AGENTS.md)
docker-compose.yml
Dockerfile
data/                # runtime storage (gitignored)
  submissions.json
  attachments/<id>/

Contributing

Issues and pull requests are welcome. Keep it simple: stdlib-first, no database, no build step.

License

MIT © ByungHyun

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages