Reference: configuration
Huskarl has no configuration file for the daemon. Most things are set per bot in
the app (see Settings). What is left is files under
~/.huskarl and a few environment variables.
Environment variables
The daemon reads the variables when it starts, unless stated otherwise. For the app's login item you do not set them yourself. Most are for development and tests.
Locations
| Variable | Default | What |
|---|---|---|
HUSKARL_HOME |
~/.huskarl |
where everything is stored. Read by both the app and the daemon |
HUSKARL_SOCKET |
<home>/run/huskarld.sock |
the socket. Unix sockets are limited to 104 bytes on macOS, so a deep HUSKARL_HOME may need this |
The daemon
| Variable | Default | What |
|---|---|---|
HUSKARL_LOGIN_PATH |
on | off: keep the PATH the daemon was given, instead of taking it from the login shell |
HUSKARL_LOG_TO_FILE |
off | set: stdout and stderr go to <home>/logs/huskarld.log. The app's login item sets it |
RUST_LOG |
info |
log level (env_logger) |
HUSKARL_TICK_SECONDS |
20 |
how often the scheduler looks for routines and tasks |
HUSKARL_WEBHOOK_PORT |
47811 |
the port for the routines' webhooks on 127.0.0.1 |
HUSKARL_BROWSER_IDLE_SECONDS |
600 |
how long a bot's browser can sit unused before it is closed |
HUSKARL_CHROME |
first one found | the Chromium program the bots' browsers use |
HUSKARL_NOTIFY |
on | off: no system notifications (ntfy is not affected) |
HUSKARL_VAULT |
the Keychain | memory: logins in memory instead of the Keychain. For tests |
HUSKARL_FELAGI_TICK_MS |
2000 |
the tick of the Félagi thread |
HUSKARL_LOCAL_MODEL |
huskarl-local beside the daemon |
the on-device model's program; off for none |
HUSKARL_LISTEN |
huskarl-listen beside the app |
the program that turns speech into text for the chat box. Read by the app |
HUSKARL_FOLDERS |
~/Huskarl |
where the folders routines watch are made |
HUSKARL_UNDO_SECONDS |
30 |
how long an approved mail, payment or deletion waits for undo. 0: it goes at once |
The app
| Variable | Default | What |
|---|---|---|
HUSKARL_UPDATE_URL |
https://elyracode.com/huskarl/latest.json |
where the app looks for a newer version |
HUSKARL_AWAY_SECONDS |
600 |
how long the window must have been in the background before "While you were away" is shown |
| Variable | What |
|---|---|
HUSKARL_MICROSOFT_CLIENT_ID |
the Entra app's client id. Used instead of microsoft.json |
HUSKARL_MICROSOFT_TENANT |
tenant, default common |
HUSKARL_MICROSOFT_LOGIN |
login server, default https://login.microsoftonline.com. For tests |
HUSKARL_GRAPH_API |
Graph, default https://graph.microsoft.com. For tests |
HUSKARL_GOOGLE_CLIENT_ID |
Google's client id. Used instead of google.json |
HUSKARL_GOOGLE_CLIENT_SECRET |
Google's client secret |
HUSKARL_GOOGLE_AUTH_URL |
default https://accounts.google.com/o/oauth2/v2/auth. For tests |
HUSKARL_GOOGLE_TOKEN_URL |
default https://oauth2.googleapis.com/token. For tests |
HUSKARL_GCAL_API |
Google Calendar, default https://www.googleapis.com. For tests |
HUSKARL_GMAIL_API |
default https://gmail.googleapis.com. For tests |
HUSKARL_GITHUB_API |
default https://api.github.com. For tests |
HUSKARL_LICENCE_API |
https://elyracode.com/huskarl/licence |
HUSKARL_WORKSPACE_MCP |
Elyra Workspace's gateway, instead of the port in ~/.elyra/state.db. For tests |
Agents and tests
| Variable | What |
|---|---|
HUSKARL_AGENT_ELYRA |
a program other than Elyra that speaks Elyra's RPC protocol, for example scripts/mock-agent/elyra_rpc.py. Variables that start with MOCK_ are passed on to it |
HUSKARL_AGENT_CLAUDE |
a program other than claude. MOCK_ variables are passed on |
HUSKARL_AGENT_GROK |
a program other than grok |
HUSKARL_FAILPOINT |
crash the daemon at a given step: after_step_begin, before_step_finish, after_propose, after_claim or after_execute. For the kill matrix |
ELYRA_CODING_AGENT_DIR |
where your Elyra keeps its login, default ~/.elyra/agent |
The scripts
| Variable | Default | Used by |
|---|---|---|
HUSKARL_TEAM |
52AT44QFCM |
bundle.sh, release.sh: which Developer ID team it is signed for |
HUSKARL_IDENTITY |
first Developer ID for the team | bundle.sh, release.sh: the signing identity |
HUSKARL_NOTARY_PROFILE |
Knut Horne |
release.sh: the profile in the Keychain for notarytool |
HUSKARL_DOWNLOAD_BASE |
https://elyracode.com/huskarl |
release.sh: the address in latest.json |
Files under ~/.huskarl
| Path | What |
|---|---|
huskarl.db |
the SQLite database, with -wal and -shm next to it. Only the daemon writes |
run/huskarld.sock |
the socket between the app and the daemon (0600, in a folder with 0700) |
logs/huskarld.log |
the daemon's log, from the login item, the developer LaunchAgent, and when the app starts the daemon itself |
bots/<id>/ |
the bot's own folder, the only place the agent may write |
bots/<id>/home/ |
HOME for Elyra and Grok Build |
bots/<id>/work/ |
the working folder, with tmp/ (TMPDIR) |
bots/<id>/agent/ |
Elyra's folder: settings.json, links to auth.json and models.json, and sessions/ |
bots/<id>/instructions.md |
the system prompt for Elyra, written at every start |
agents/claude/ |
Claude Code's login for Huskarl (CLAUDE_CONFIG_DIR) |
agents/grok/ |
Grok Build's login for Huskarl (GROK_HOME): auth.json and config.toml, which Huskarl writes at every start |
browsers/<bot>/ |
the Chrome profile of the bot's browser: logins and cookies |
testpost/ |
the practice mailbox: inbox.json, drafts.json and outbox.json |
microsoft.json |
{"client_id": "…", "tenant": "common"}. See Mail |
google.json |
{"client_id": "…", "client_secret": "…"} |
felagi.json |
{"server", "daemon_id", "name"} for Félagi. The token is in the Keychain |
app.json |
the app's appearance, and the language ("language": "en", the default, or "nb"). See Settings |
bin/huskarld |
the copy the developer LaunchAgent runs |
The daemon reads microsoft.json, google.json and felagi.json when it starts
(felagi.json also while it runs).
In the database
The phone notifications (server and topic for ntfy) are in the settings table
under the key ntfy. The language for what the daemon writes for people (en
or nb) is under the key language; the app sets it when you choose a language.
Everything about the bots is in the other tables. See
Architecture.
In the Keychain
| Service | Account | What |
|---|---|---|
no.huskarl.google |
the email address | refresh token for Gmail |
no.huskarl.microsoft |
the email address | refresh token for Outlook |
no.huskarl.felagi |
the server address | the daemon token (fdt_…) |
Outside ~/.huskarl
| Path | What |
|---|---|
~/Library/LaunchAgents/no.huskarl.daemon.plist |
the developer LaunchAgent. Removed by the packaged app |
Huskarl.app/Contents/Library/LaunchAgents/no.huskarl.huskarld.plist |
the app's login item |