Skip to main content
The daemon runs GitHub and Slack work in the background on a machine you choose. Start it once, check it in the monitor, and leave it running while you want requests handled.

Prepare the host

  • Install Embedder on the host.
  • Install the project’s toolchain and any flashing or debugging tools the work needs.
  • Connect the boards and instruments the work may use, or set up a remote hardware bridge.
  • Record build, test and flash commands in EMBEDDER.md.
  • Use an Embedder account that belongs to the teams whose repositories this host should work on. The daemon only picks up work for those teams.

Start the daemon

The command starts the daemon in the background, prints its PID and scope, then returns. You can close the terminal. If a daemon is already running, the command says so and starts nothing new. The daemon needs an API key. The command finds one in this order: If a saved key is rejected, the command discards it and sets up a new one from the remaining sources.

Use a key on an unattended host

On a host without an interactive terminal, either sign in once with embedder and then start the daemon, or provide a token in the environment:
  1. In the Embedder app, open Settings.
  2. Under Tokens, choose Create token, and enter a Name.
  3. Choose an Expiration. The default is 90 days. When the token expires, the daemon stops authenticating until you give it a new one.
  4. Choose Create token, then copy the token. It isn’t shown again.
  5. On the host, set it and start the daemon:
Keep the token out of repository files and request messages. If the daemon reports that authentication failed, check that the token is valid, hasn’t expired and belongs to the intended account, then start it again.

Restrict work to one project

By default, the daemon works on every mapped repository its account can reach. To limit it to one project, give both the team and project names:
Use the full names. Matching ignores case. Quote names with spaces. EMBEDDER_TEAM and EMBEDDER_PROJECT make the same selection through environment variables. Set both, or neither. If a name doesn’t match, the command reports it and lists the available names, for example Team "Firmware" not found. Available: .... The directory you start the daemon from doesn’t matter. Each run checks out its mapped repository separately.

Monitor work

The Daemon Monitor refreshes every second and shows each running daemon: Common activity messages: Monitor keys: With several daemons listed, click Change in the daemon’s Session section to change its model. The daemon applies the new model on its next status update and keeps it after a restart.

Set parallel capacity

The daemon runs up to four requests at once. To change this, set EMBEDDER_DAEMON_CONCURRENCY to a positive whole number when you start it:
Choose a value the host can support. An invalid value falls back to four. Requests for the same pull request or Slack thread still run one at a time. More capacity doesn’t let two runs drive the same board at once.

Keep runs within the time limit

Each run can take up to 30 minutes. Time spent waiting for hardware extends that limit by the time waited, up to 20 extra minutes. A run that goes past its limit stops and reports that it exceeded its duration ceiling. Split long builds, investigations or soak tests into requests that finish within the limit. If a run stops at the limit, check its partial result and narrow the next request.

Stop the daemon

If more than one daemon is running, the command lists them. Pass the PID of the one to stop:
You can also choose Stop in the monitor. A run still in progress gets a few seconds to finish before it’s stopped, so check Workers for active work before you stop the host.
Daemon runs approve their own actions automatically. They can edit files, run commands and use any hardware the host can reach. Limit the host account to the access meant for automation, and state hardware limits in each request.

Troubleshoot

  • The monitor shows No active daemon found: start the daemon with embedder start daemon. Run the monitor under the same operating-system account that started the daemon.
  • No daemon API key found: set EMBEDDER_API_KEY, or run embedder to sign in, then start the daemon again.
  • Connected but idle: check that the repository is mapped to a project, that the daemon’s account belongs to that project’s team, and that --team and --project name the right project.
  • Slack shows Waiting for daemon: no daemon picked up the request. Start one, then check the monitor.
  • The project selection is rejected: provide --team and --project together, with names from the list the command prints.
  • Waiting for local capacity: let an active run finish, or raise EMBEDDER_DAEMON_CONCURRENCY if the host can support it.
  • Waiting for hardware: find the run using the board in Workers before stopping anything.
  • Update the daemon: agent-owned publishing is required: update Embedder on the host, then stop and start the daemon.
  • A run failed: read the result in GitHub or Slack, fix the reported setup problem, and request a new run.
  • The duration ceiling was exceeded: shorten the request, or split it into separate build, test and investigation requests.
Last modified on October 13, 2026