Reference: CLI
huskarld is the daemon. With no arguments, or with serve, it runs. The other
commands are a small client for development and tests: they connect to the
socket, say hello, do one thing and exit. The daemon must be running, or you
get huskarld is not running (<socket>). The exception is verify-audit.
<bot> is the bot's id, as huskarld bots shows it (a UUID). The name does not
work.
In the app bundle the program is at /Applications/Huskarl.app/Contents/MacOS/huskarld.
From source it is target/debug/huskarld or target/release/huskarld.
The daemon
huskarld / huskarld serve
Runs the daemon in the foreground.
- Creates
~/.huskarland~/.huskarl/runwith mode 0700, and the socket with 0600. - If a daemon is already running on the socket, it exits with
huskarld is already running (<socket>). - Takes
PATHfrom the login shell first (see Agents), unlessHUSKARL_LOGIN_PATH=off. - With
HUSKARL_LOG_TO_FILEset, stdout and stderr are written to~/.huskarl/logs/huskarld.log. Otherwise the log goes to stderr.RUST_LOGsets the level (defaultinfo). - Stops on Ctrl-C or
SIGTERM, stops the agents and the browsers, and removes the socket.
Bots and messages
huskarld bots
Lists the bots: id, name, status and last line.
huskarld new <name> [role]
Creates a bot with Elyra as its agent and prints the id.
huskarld send <bot> <text>
Sends a message and prints the reply as it arrives. On stderr:
· <tool> <arguments>for each tool call⏸ waiting for approval [<id>]: <title>for each proposalnote: …anderror: …for notices. An error exits— done in 4.2s, $0.0045(orfailed) when the turn is over.
huskarld suggest <description>
Asks the designer for a proposed bot based on the description, and prints it as
JSON (bot and, if any, routine). Creates nothing.
Proposals
huskarld actions
Lists the proposals that are waiting, across bots, newest first: id and title,
and below that the subject and the text with | in front of each line.
huskarld approve <id>
Approves a proposal and prints the status and the result, for example
Done: … or Failed: …. A mail, payment or deletion waits for undo first
(see Approvals and rules), and then
it prints:
Scheduled: goes at 14:02:31. `huskarld undo <id>` takes it back.
huskarld reject <id>
Rejects a proposal. Prints Rejected: .
Both give the proposal has already been decided for a proposal that is no longer
waiting.
huskarld replay <run|proposal> [--model <model>] [--instructions <file>]
Does a finished run again as a rehearsal: reads come from what the run read,
nothing is carried out, and the thread shows what differs. Without options it
uses the bot's settings as they are now. Prints Replaying. The comparison comes in the bot's thread when it is done. See
Approvals and rules.
huskarld export <bot> [file]
Writes the bot as a recipe: role, instructions, rules, budgets, sites and routines, never memories, logins or webhook keys. Without a file, prints it. See Recipes.
huskarld import <file> [--yes] [--live]
Shows what the recipe's bot asks for beyond the defaults, and its
instructions. With --yes it makes the bot, in rehearsal unless --live.
huskarld status
What waits for you and which bots are working, in a sentence or two, in your language: what Siri reads aloud.
huskarld ask <bot> <text> / huskarld ask --stdin
Sends the bot a message, waits for its turn to end, and prints only its answer
(and how many proposals it left waiting). The bot is found by name, or the start
of one. With --stdin, it reads "Bot name: text" from stdin, as the Siri
shortcut gives it.
huskarld why <id>
Why the bot proposed it: what started the run, what you wrote, the calls it made first, what it said, and the rule that decides. See Approvals and rules.
huskarld undo <id>
Takes back an approved proposal that has not gone yet. Prints
Rejected: Taken back before it went., or the error It has gone already, or was taken back.
Routines
huskarld routines
Lists all routines: id, the name in «…», when it runs, (paused) if it is
paused, and the next run (next 2026-10-19 07:00, or -).
Connections
huskarld plan / huskarld activate / huskarld release-mac
The plan this Mac is on, as JSON. activate reads a licence key from stdin
and activates it on this Mac; release-mac gives its seat back. See
Plans and prices.
huskarld connect <bot> <gmail|outlook|teams>
Starts the sign-in and prints the address to open in your browser. The daemon waits 10 minutes for you to finish, and the thread is told how it went. See Mail.
huskarld connect <bot> github
With a token on stdin (pbpaste | huskarld connect <bot> github): tries it on
GitHub, keeps it in the Keychain, and prints ok, or why GitHub refused it.
Without one, prints where to make a token. See GitHub.
huskarld connect <bot> workspace
With the client Elyra Workspace paired on stdin (pbpaste | huskarld connect <bot> workspace): the token alone, or the configuration Workspace copies.
Tries it, keeps the token in the Keychain, and prints ok, or why not. See
Elyra Workspace.
huskarld connect <bot> felagi
With a Félagi API token on stdin: the .env lines Félagi hands back, or the
fat_ token alone. Prints ok, or why not. See
Félagi.
huskarld disconnect <bot> <gmail|outlook|teams|github|workspace|felagi>
Disconnects. The login is deleted from the Keychain when no bot uses the account.
Prints ok.
huskarld check <bot>
Tries the bot's mailbox now: lists one message and searches for new mail in the
last 24 hours. Prints one line per mailbox, for example
Gmail: ok (3 mails in the inbox in the last day), or no mail connection.
Memory
huskarld remember <bot> <text>
Adds a memory, as if you had written it in the settings. Prints ok.
huskarld accept-memories <bot>
Accepts all of the bot's memories that were held back after outside text. Prints
ok.
Rules and budgets
All print ok.
huskarld budget <bot> <tokens|none>
Tokens per run. none removes the limit (see
Approvals and rules).
huskarld daily <bot> <usd|none>
Daily budget in dollars, for example 2.50. none removes the limit (see
Approvals and rules).
huskarld allow-domain <bot> <domain>
Adds a rule: mail where every recipient is on the domain is sent without approval
and logged. *.firma.no includes subdomains.
huskarld require-approval <bot> <class>
Adds a rule: the class requires approval. The classes are read, draft,
internal and send. An unknown class gives
unknown class <class> (read, draft, internal, send).
huskarld confidential <bot> <a,b,…|none>
What is confidential to the bot: senders, domains or words in the subject. See Approvals and rules.
huskarld delete <bot>
Puts the bot away: stopped, routines paused, mail disconnected, out of the list. Its thread and audit trail are kept.
huskarld mail-alias <bot> <address|none>
Gives the bot its own address: it sees and handles only mail sent to it.
none gives it the whole inbox again. See
Mail.
huskarld rehearsal <bot> on|off
Turns rehearsal on or off: the bot reads for real, and everything else is only written down. See Approvals and rules.
huskarld browser-domains <bot> <a,b,…>
Sets the sites the bot's browser may open, separated by commas. Replaces the
list. An empty string ("") removes the browser. See Browser.
Notifications
huskarld ntfy on [server]
Turns on notifications on your phone, with https://ntfy.sh or the server you
give. Prints server/topic.
huskarld ntfy chat [on|off]
Lets the phone write to the bots through the reply topic, or not; without
on or off, says which. See
Notifications and menu bar.
huskarld ntfy off
Turns them off. Prints off.
huskarld ntfy / huskarld ntfy status
Prints server/topic, or off.
Félagi
huskarld felagi connect <server> <fdt_token>
Connects the daemon to a Félagi workspace. See Félagi.
huskarld felagi status / huskarld felagi
Prints one of not connected,
connected to <server> (workspace <slug>), N task(s) in hand or
<server>: not connected: <error>.
huskarld felagi disconnect
Disconnects and deletes the token.
Audit
huskarld verify-audit
Walks the hash chain in the audit log and prints N entries, chain intact, or
fails with the audit log is broken at entry <id>. Reads
~/.huskarl/huskarl.db directly. Does not need the daemon.
Errors
- An unknown command gives
unknown command <name>. - Too few arguments give the usage, for example
usage: huskarld send <bot> <text>. - If the client and the daemon speak different protocols, the daemon replies
the app speaks protocol X, this daemon Y; update the older one.