alle80 / agent-devboard
Agent Devboard: a Livewire dev board where you queue requests for a coding agent (open to work → working → done, questions, stop, resume) — multiple lists, sub-tasks, notes, images, live updates, themes, settings.
Requires
- php: ^8.3
- ext-gd: *
- illuminate/console: ^12.0|^13.0
- illuminate/database: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
- league/commonmark: ^2.4
- livewire/livewire: ^4.0
- spatie/laravel-settings: ^3.4
Requires (Dev)
- orchestra/testbench: ^10.0|^11.0
- phpunit/phpunit: ^11.5|^12.0
Suggests
- laravel/ai: AI descriptions of uploaded images, used by the search (any supported provider).
- laravel/reverb: Live updates between devices via WebSocket (any Laravel broadcaster works).
README
A dev board for coding agents on Laravel 12/13 + Livewire 4. You queue requests as todos; a coding agent (Claude Code, …) takes them, asks questions, and closes them — driven from the app.
Includes
- Agent workflow: open to work → working → done, with questions, stop and resume
- Multiple lists per user · sub-tasks · notes
- Image attachments (upload / camera / paste) with optional AI descriptions for search
- Archive · state filters · free-text search
- Live updates between devices (any Laravel broadcaster, e.g. Reverb)
- A theme system (built-in Slate theme + installable zip packs) and a settings page
- English base language with an Italian translation
Extracted from the original app at https://github.com/alle80/laravel-dev.
Requirements
- PHP 8.3+ · Laravel 12 or 13 · Livewire 4 · Tailwind CSS 4 (Vite) in the host app
ext-gd(image resizing) ·spatie/laravel-settings(installed automatically)- Optional:
laravel/ai(AI image descriptions) · a broadcaster likelaravel/reverb(live updates)
Install
composer require alle80/agent-devboard php artisan migrate # tables + settings defaults (idempotent) php artisan storage:link # attachments live on the "public" disk php artisan vendor:publish --tag=devboard-assets # precompiled build & theme assets
Routes register automatically — / (default theme), /{theme}, /settings — behind web + auth.
The package needs an authenticated user (lists belong to users), so plug it into your app's login.
Then wire up the front-end assets (below) and you're ready to connect an agent.
Connect a coding agent
One list — config('devboard.agent_list'), default dev — is the request channel between you
and the agent. You add todos; the agent works them. Setup is meant to be minimal:
1 — Launch the agent inside the project directory (Claude Code, or any agent that reads a project
AGENTS.md).
2 — Give it the workflow (once):
php artisan vendor:publish --tag=devboard-agents # drops AGENTS.md in the project root
Agents read AGENTS.md automatically; it describes the whole protocol (states, order, questions, stop).
3 — Start the monitor (one command):
php artisan devboard:watch # prints ONLY the changes the agent must react to
watch polls the list and emits a line when something needs the agent — an item goes open to
work, the answers to a paused question arrive, or a stop is requested. The agent then reads
and acts with devboard:check.
The state of each row
| Dot | State | Meaning |
|---|---|---|
| ⚪ | waiting | not ready — the agent leaves it alone |
| 🟢 | open to work | the user released it; the agent may take it (top-down = priority) |
| 🔧 | working | the agent took it (its first action, so you see it in real time) |
| ❓ | question | the agent asked something; paused until you answer in the app |
| ⏹ | stop | you stopped it; the agent drops it immediately |
| ✔ | done | closed, with the agent's comment |
The agent's commands (devboard:check)
php artisan devboard:check # what to work on (🟢/🔧), in order; --all for everything php artisan devboard:check --take=ID # take it in charge → 🔧 php artisan devboard:check --ask=ID --q="…" --q="…" # ask, pausing it → ❓ php artisan devboard:check --done=ID --comment="…" # close it, with a note back to the user → ✔
devboard:check also prints the behaviour settings from /settings (commit policy, autonomy,
notifications, …) that the agent is expected to follow. A closed item can be resumed into a new
linked one, carrying its context.
Front-end assets
Pick one mode.
A — Precompiled (zero build). Use the CSS/JS shipped by the package:
# .env → DEVBOARD_ASSETS=precompiled (or 'assets' => 'precompiled' in config/devboard.php) php artisan vendor:publish --tag=devboard-assets # public/vendor/devboard/{build,images}
<x-devboard::assets /> then links public/vendor/devboard/build/devboard.{css,js} (Tailwind
utilities, the theme system, SortableJS, and Laravel Echo when a Reverb/Pusher key is set). No npm.
B — Bundled by your app (default, assets = vite). Import the package sources in your Vite build.
Tailwind 4 doesn't scan vendor/, so add an @source:
/* resources/css/app.css */ @import 'tailwindcss'; @source '../../vendor/alle80/agent-devboard/resources/views/**/*.blade.php'; @import '../../vendor/alle80/agent-devboard/resources/css/devboard.css';
// resources/js/app.js import '../../vendor/alle80/agent-devboard/resources/js/devboard.js'; // SortableJS + Echo (optional)
npm i sortablejs laravel-echo pusher-js && npm run build
In both modes the Echo client is configured at runtime from config('devboard.echo') (VITE_REVERB_*
/ REVERB_*); an empty key opens no WebSocket. Theme fonts load from config('devboard.fonts_url')
(bunny.net by default; set '' to self-host). To rebuild the precompiled files after editing package
sources: cd vendor/alle80/agent-devboard && npm install && npm run build.
Configuration
php artisan vendor:publish --tag=devboard-config # config/devboard.php php artisan vendor:publish --tag=devboard-views # override the Blade views php artisan vendor:publish --tag=devboard-lang # translations (en, it) php artisan vendor:publish --tag=devboard-agents # AGENTS.md (agent workflow)
config/devboard.php covers the route prefix and middleware, the user model, the attachments disk,
the default theme, and the agent list name (agent_list).
Themes
The package ships a generic theme system (shared views + CSS variables per .theme-<slug>) with the
built-in Slate theme. Add more with config('devboard.themes') or
Alle80\Devboard\Themes::registerTheme($slug, [...]) plus a .theme-<slug> { --tl-… } CSS block.
Fully custom styles (own components/views) plug in via Themes::registerStyle() /
Themes::registerSkin().
Installable packs (zip): a theme.json + theme.css (+ optional images/). Install from
/settings → 🎨 Themes or php artisan devboard:theme-import pack.zip; packs live in
storage/app/themes/<slug>. Export any theme as a starting point:
php artisan devboard:theme-export slate --css-from=resources/css/app.css. A sample pack (pollon)
is in resources/themes/.
Live updates
Every change to a todo / sub-task / question / attachment broadcasts
Alle80\Devboard\Events\TodoChanged on the private channel App.Models.User.{id}. With no broadcaster
configured nothing happens (failures are logged, never raised).
Development
cd packages/devboard && composer update && vendor/bin/phpunit
The suite (orchestra/testbench, in-memory sqlite) covers migrations, per-user scoping, the Livewire
components, devboard:check and devboard:watch, the theme registry and zip packs, translation parity
and the live event. GitHub Actions runs it on PHP 8.3 / 8.4 on every push touching the package.
License
MIT — see LICENSE.