Running it
The three processes Félagi needs besides the web server, and what stops working without each.
The short version
php artisan serve # or nginx, php-fpm
php artisan queue:listen --queue=broadcasts,mail,webhooks,imports,default
php artisan schedule:work # or a cron entry
php artisan reverb:start # websockets
composer dev runs all of them for local work. In production they are four
supervised processes, or three plus a real web server.
Every one of them fails silently. Nothing throws, no page breaks, no log fills up — a feature simply stops happening, and the first person to notice is the one who wondered why their autopilot never ran.
The scheduler
Without it, four things stop and nothing says so.
| Command | Runs | Without it |
|---|---|---|
felagi:reap |
every 30 seconds | A laptop that closed mid-run keeps its task forever. Nothing is requeued, and the runtime shows as online indefinitely |
felagi:autopilots |
every minute | Scheduled autopilots never fire. Daily triage and weekly audits quietly do not happen |
felagi:timers |
hourly | A stopwatch left running is never closed. It is still capped when somebody stops it by hand, but nobody is reminded |
felagi:cycles |
daily at 00:05 | Cycles stop arriving. The current window runs past its end date, and unfinished work is never carried forward |
One process:
php artisan schedule:work
Or one crontab line, which is what a server usually wants:
* * * * * cd /path/to/felagi && php artisan schedule:run >> /dev/null 2>&1
felagi:reap runs twice a minute, which a plain schedule:run cannot do on its
own — Laravel handles the sub-minute frequency internally, so the crontab entry
above is still correct.
Checking
php artisan schedule:list
Every command above should be listed with its next due time. If the list is empty,
routes/console.php is not being loaded.
The queue worker
Five lanes, and the order matters.
php artisan queue:listen --queue=broadcasts,mail,webhooks,imports,default
| Lane | Carries | Without it |
|---|---|---|
broadcasts |
Live updates to open pages | Boards stop moving on their own. A reload still shows the truth |
mail |
Invitations, password resets, comment notifications | Nobody is ever emailed |
webhooks |
Outgoing deliveries | Every webhook you configured silently never fires |
imports |
A CSV being read | An import sits at "queued" forever |
default |
Everything else |
Listing them in that order is not decoration: a live update is worthless three minutes behind a batch import, and a worker drains lanes left to right.
The whiteboard is the exception. Its changes are sent immediately rather than queued, so a board keeps working with no worker at all — see Broadcasting for why that one is different.
Checking
The dashboard reads the backlog and warns when nothing is draining it. From a shell:
php artisan queue:monitor broadcasts,mail,webhooks,imports,default
Reverb
php artisan reverb:start
Without it: live updates and whiteboard cursors stop. Everything else is
unaffected, because a failed broadcast is never allowed to fail the write that
caused it — see App\Support\Announce.
The whiteboard needs accept_client_events_from on the Reverb app, which is
members by default. Cursors are whispered between browsers and never reach the
application.
Commands you run by hand
| Command | For |
|---|---|
felagi:admin {email} |
Grant or revoke platform administration. The only thing that sets is_admin, and it is deliberately not in any interface — see Permissions |
felagi:daemon-token |
Issue a token for one machine, if you would rather not use the interface |
Everything else is scheduled.
What to watch
There is no metrics endpoint and no health check. What exists:
- The dashboard warns about a stalled queue and about runtimes that have gone quiet.
storage/logs/laravel.loghas every webhook attempt, every failed delivery and every reaped task./admin/runtimesshows last-heartbeat times, which is the fastest way to tell whether the daemon side is alive.
Not there yet
- No health endpoint. Nothing to point a monitor at.
- No metrics. No Prometheus, no queue depth over time.
- No supervisor or systemd units shipped. The commands above are the contract; how they stay running is yours.