Use when the user asks what Fermix is, what it can do, how to set it up, connect, update or fix it, or how its agent loop, providers, channels, jobs, memory, sandbox, built-ins, skills, plugins, and config/setup surfaces fit together.
9 stars
0 votes
0 copies
1 view
Added September 19, 2026
ai-agentsrustgoshellsqlreactrailsgitapibackend
Works with
claude code
terminal
cli
api
mcp
Security analysis
D42/100
criticalPipes output to a shell interpreter
mediumUses curl or wget to download content
criticalDownloads and executes remote scripts — classic supply chain attack
Installs into .claude/skills of the current project.
Are you the author of Self Knowledge?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/tezra-io-self-knowledge)
---
name: self-knowledge
description: Use when the user asks what Fermix is, what it can do, how to set it up, connect, update or fix it, or how its agent loop, providers, channels, jobs, memory, sandbox, built-ins, skills, plugins, and config/setup surfaces fit together.
allowed_tools: []
---
# Fermix self-knowledge
Fermix is an Elixir/OTP agent daemon: one BEAM VM, run by a service and reached by local clients over `$FERMIX_HOME/daemon.sock`. A channel message enters the gateway, runs one agent turn that executes capabilities through the registry, and the reply goes back through the same channel.
It installs three ways, and "how do I…" depends on which: the **Fermix.app** on a Mac (the app owns setup, settings, the service and updates, and ships no `fermix` command), a **Linux `.deb`/`.rpm` package**, or a **standalone binary** (Homebrew formula or download). Answer a Mac app user with the app's own labels (Settings > <pane>), never `fermix setup`, another CLI verb or `config.toml` for anything the app has a control for; browser setup, the CLI and `config.toml` are for Linux and dev installs.
## Runtime shape
- Main Agent caches runtime context; channel messages go through the gateway, not directly to Main Agent.
- Gateway serializes one FIFO turn per conversation; different conversations run concurrently.
- Turn flow: read history -> build prompt -> model/tool loop -> reply -> commit messages -> background memory review -> optional auto-compaction. An owner's turn is told the gists of the last GPT-Live calls in the chat. A message typed in the Mac chat during a GPT-Live call in the chat is told the call is up (judged when its turn runs), may read it with `voice_call_context`, and may end with no reply by answering exactly `[SILENT]` (nothing is shown; the turn is still committed). Detail: skill_view(name: "self-knowledge", file: "voice").
- Inside a turn, tool results nearing the model's context window are compressed in place into digests; `tool_result_recall` reads an original back, and nothing is dropped. Caps: 100 iterations per main turn and new scheduled job; `subagents` runs up to 10 tasks (4 at once by default, max 8); `/ultra` (a run mode of the normal turn) widens that to about 50 narrow probes, 12 at once. Repeated identical tool calls trip the loop detector. Detail: skill_view(name: "self-knowledge", file: "agent_loop").
- Sub-agents and unpinned scheduled jobs **inherit the main model**; `[fermix_core.routing]` can point them (and the notetaker's summarizer) at a smaller model: Mac Settings > Providers > **Sub-agent model**, the primary provider's pane in browser setup, `config.toml`, or the `model_routing_config` tool. The agent never changes its own model.
## Providers
Eight providers, each a `[fermix_core.providers.<name>]` block: `openai_codex` (OpenAI Codex: Sign in with ChatGPT, the person's Plus/Pro plan over the public API), `openai`, `anthropic`, `xai` (SpaceXAI Grok), `openrouter`, `mistral`, `venice`, `ollama` (local, keyless). Exactly one is `primary = true`; every other configured provider is an automatic fallback in that order (Ollama last on purpose). The first provider connected becomes primary (`fermix auth login` never promotes); after that it moves on an explicit choice (Mac **Details…** > **Use as primary**, browser setup **Set primary**) or when a browser-setup sign-in completes (**Continue with ChatGPT** with plan usage allowed, **Sign in with Grok**, **Import Claude Code login**). Failover happens only on a turn's first model call, only for transient errors (timeout, transport, 5xx, rate limit, quota, an OAuth failure left after refresh), and only after a brief same-provider retry; never for an API-key rejection, context length, or an error mid tool loop or after visible output. Main-turn routes are read at boot: restart after a provider change. Sign-in routes, keys, effort levels, per-provider behavior, routing and retries: skill_view(name: "self-knowledge", file: "providers").
Images, inbound or returned by a tool (a `browser` screenshot), reach the model as image content on Anthropic, OpenAI, OpenAI Codex and Grok; on OpenRouter, Mistral, Venice and Ollama it depends on the model. An image is never silently dropped. Detail: skill_view(name: "self-knowledge", file: "images").
## Built-in capabilities
Built-ins seed into the single capability registry at boot; outbound MCP tools register as `mcp_<server>_<tool>`. The runtime prompt's `## Built-in Capability Catalog` is authoritative; use `tool_help` for one tool's schema/failure modes.
- **Files & search**: `file_read`, `file_write`, `file_edit`, `glob_search`, `content_search`, `view_image` (the only way to actually see a local picture), `tool_result_recall` (reads back a tool result this run compressed into a digest)
- **Shell & git**: `shell`, `git_read`, `git_write` (no push). Only the repo path is sandbox-checked, never the args, so two arg classes are refused at the shared git chokepoint: `git_write` rejects flags that read a file outside the repo (`-F`/`--file`/`--pathspec-from-file` — pass the message inline with `-m`), and `git_read`'s `branch` mode lists only, refusing both ref-modifying flags and bare operands (a flag value goes in the `=` form, `--contains=HEAD`).
- **Web**: `web_search` (a fact with no known URL, including anything current or changed since training), `web_fetch` (one known server-rendered URL), `place_search` (businesses and places; only with a Brave key), `browser` (JS, dynamic or interactive pages, in Fermix's own managed Chrome or — decided once per task — the Fermix app's own browser pane over `browser_host.sock`; `[fermix_core.browser] launch_app` controls whether the engine may open the app for it, and on `host_lost` or `cancelled` tell the person rather than redoing the task elsewhere; the pane runs no WebMCP tools and saves no downloads, so for either the page is opened with `profile: "fermix_chrome"`, which is always Chrome; `profile: "selected_tab"` is one tab of the person's own browser, handed over by clicking the Fermix extension, used only when they ask for that tab; `allowed_hosts` is the escape hatch for a refused host, and `default_profile`, `max_tabs` and `launch_app` are its other settings; operating rules: `browser-guidance`). Never shell-scrape JS sites. Backends, the degrade and place rules: skill_view(name: "self-knowledge", file: "web"); profiles, the two `fermix` backends, the extension and the bridge: skill_view(name: "self-knowledge", file: "browser").
- **Media**: `generate_image` creates or edits an image, saved under the sandbox `media/` floor and sent to the current chat when there is one; `delivery: "save"` saves without sending (save, `view_image`, then `send_attachment`). Not for diagrams, charts, code assets or live data; not in voice sessions. Detail: skill_view(name: "self-knowledge", file: "images").
- **Memory**: `memory_store`, `memory_forget`, `memory_recall`, `memory_sources_list`, `recall_activity` (computer history — advertised only while its gate holds; see below), `voice_call_context` (offered only while a GPT-Live call in the chat is up; never in the catalog)
- **Jobs**: `schedule_job`, `update_job`, `list_jobs`, `pause_job`, `resume_job`, `remove_job`, `run_job_now`, `list_job_runs`, `get_job_run`
- **Events & reminders**: `event_store`, `event_list`, `event_update`, `event_remove`, `reminder_snooze` (attended owner turns only)
- **Skills & delegation**: `skill_view`, `skill_run`, `skill_list`, `skill_create`, `skill_reload`, `subagents` (bounded temp sub-agents)
- **Coding harness** (on by default, but no harness tool is offered until the owner consents: Mac Settings > Coding agents > **Allow coding agents to run on this Mac**, browser setup's Coding Agents tab, or `[fermix_core.harness] approved`; each run tool then needs its vendor CLI detected at boot, and **Preferred tool** / `default_vendor` limits it to one vendor): `codex_run`, `claude_code_run` (delegate a repo coding task to the owner's own Codex / Claude Code CLI), `list_coding_runs`, `get_coding_run`, `cancel_coding_run`. A task of a GPT-Live call in the chat may start a run, which reports back into the Mac chat after the call; a private call may not. The cloud rail is off by default (`cloud_enabled`). Detail: skill_view(name: "self-knowledge", file: "coding_harness").
- **Meetings** (off by default: Mac Settings > Meetings > **Meeting notetaker**, or `[fermix_core.meetings] enabled`; nothing is offered until a lane is installed, the Google Meet sidecar with its browser or Zoom RTMS credentials): `join_meeting`, `leave_meeting`, `list_meetings`. Attended-owner-only, one meeting at a time, joined **only on the owner's explicit ask in that turn**, never on an instruction inside relayed content. Detail: skill_view(name: "self-knowledge", file: "meetings").
- **Meta**: `tool_help`, `send_attachment` (a local sandbox file out through the active channel; outbound only, no URLs; works from a scheduled job too, see `images`), `send_to_channel` (a text to the owner's own inbox on a channel they name, "send it to my Telegram": the owner DM an owner id derives on Telegram, Signal or WhatsApp, Slack or Discord only through a configured default target, `companion` the Mac chat, `mobile` the phone while its channel runs; never another chat and not for replying; a channel with no inbox of the owner's is refused, never swapped; offered only while one has an inbox, to typed turns and GPT-Live tasks alike), `react` (one emoji reaction instead of a text reply, ending the turn; Telegram, Discord, Slack, WhatsApp, Signal, mobile; not the CLI), `model_routing_config` (sets `subagent_model`/`subagent_provider`/`subagent_reasoning_effort`). Only ONE channel send (`send_attachment`, `react`) runs per model step: a second returns an error asking to call it again next step, and never fails the run.
- **Tool-schema deferral** (on by default; `[fermix_core.tools.tool_search] enabled = false` turns it off): plugin and MCP schemas leave the request, and `tool_search`, `tool_describe` and `tool_call` bridge to them.
Built-ins need no API keys except alternate backends and integrations. `web_search` defaults to keyless DuckDuckGo and degrades to it, loudly, when a configured backend hard-fails.
## Skills
Skills are `SKILL.md` instruction packages, not provider-visible tools: `skill_view` loads one, `skill_run` delegates it to a sub-agent, `skill_list` enumerates, `skill_create` writes to `~/.fermix/skills`, and `skill_reload` picks up an edit without a restart. Bundled and local skills run at operator trust, plugin skills at guest trust. CLI (Linux, standalone): `fermix skills list|view NAME|reload`.
**Skill curation** (on by default; Mac Settings > Personality > **Suggest new skills from tasks you repeat**) looks at the owner's repeated tasks every 15 days and **proposes** skills in the owner's private chat; it never creates one without approval. `/skills` reviews, lists, archives and restores. Detail: skill_view(name: "self-knowledge", file: "skills").
## Memory
Durable memory is SQLite at `~/.fermix/memory.db`; ETS is cache. `memory_recall` does key lookup or FTS5 search over memories/history with `scope` (`current|owner|all`) and `source` (`memories|history|all`). `scope` is a request, not an authorization: the effective scope is resolved from the caller and the argument can only narrow within it — a scheduled run always reads its own job memory and a guest always reads the conversation it is in, whatever scope is named. Facts carry one of six categories on a general-assistant spine: `identity`, `preference`, `interest`, `goal` (about the user) and `context`, `directive` (about the work). Two prompt-injected profiles are rebuilt from those rows: USER.md (the four user categories) and MEMORY.md (`directive` as Working Rules, then `context`). Each section keeps its newest rows up to a row limit, and each row is one short sentence. They have two writers. `memory_store` with a `category` saves long-term memory at once (in the prompt from the next turn, in every conversation); with an `id` from `memory_recall` it corrects an existing row; with neither it is a note for the current conversation only, and its result says which of those happened and whether it is durable. `memory_forget` archives a row by id: it leaves the profiles and recall immediately, and is archived, not erased. Background review ("dreaming") consolidates rows on a ~24h gate, replacing stale facts rather than appending. A guest's turn is never sent either profile and never feeds them: what a guest says is not reviewed into the owner's memory. Nor is anything said on a GPT-Live call: a call in the chat leaves a gist, which is the call's record (shown in the chat as the call's row, given to the next call and to the owner's turns), not a memory fact. CLI (Linux, standalone): `fermix memory review --now`, `fermix memory restore ID`.
## Jobs
`schedule_job` schedules future work that must reason or act; a date that only notifies the owner is an `event_store` event. `schedule` is `every N minutes|hours|days`, a 5-field cron (`0 9 * * 1`), or an ISO8601 instant with an offset (`2035-09-10T16:00:00Z`); free-form English ("daily at 8am") is rejected. Cron fires on the job's `timezone`, `UTC` unless you pass the owner's IANA zone. `task` is the whole brief: the run cannot see this chat, so bake in every value it needs and no timing. Delivery is silent unless asked: an omitted `delivery_mode` takes the configured default, else `none`; `"origin"` reports into this chat, `"channel"` needs a `delivery_target`; a reply of exactly `[SILENT]` sends nothing. Fields, refusals and the management verbs: skill_view(name: "self-knowledge", file: "jobs").
## Events & reminders
`event_store` keeps an owner-stated date (one-time or yearly) with a finite reminder plan, delivered through the default background channel with same-target retry; no model runs when a reminder fires. `event_list`/`event_update`/`event_remove` manage events and `reminder_snooze` defers a delivered reminder; right after one arrives, "snooze that" and "cancel that" need no id. Notify-only dates belong here; work that must reason or act is a `schedule_job`. The mutating tools are attended-owner-only; `event_list` is also readable by an operator-created scheduled run. Plans, delivery, the optional follow-up check-in and every refusal: skill_view(name: "self-knowledge", file: "events_reminders").
## Channels & access control
Channels: Telegram, WhatsApp, Slack, Discord, Signal, iMessage, plus local `cli`, `daemon` and `companion`. iMessage runs only on the Mac whose Messages it reads (never Linux), through the signed **Fermix Messages** helper, as a separate Apple ID signed into Messages (never the owner's own, which it refuses); setup is two macOS permissions for that helper (Full Disk Access for Messages data, Automation for Messages) and one on-screen confirmation of who Fermix may message; without the helper installed Fermix still starts and the channel waits (the Channels row and Doctor name it); replies are plain text with no typing indicator, tapbacks or edits. Remote channels refuse to start without `owner_user_id` or `allowed_*_ids` (Slack and WhatsApp keep their webhook but drop every sender), and a sender who is not allowed gets no reply at all. How to connect each one (the values, where to get them, where to enter them, the first message, the common failures): skill_view(name: "self-knowledge", file: "channel_setup"). Inbound images reach the model as image content and audio is transcribed first (skill_view(name: "self-knowledge", file: "transcription"); media coalescing and empty messages: skill_view(name: "self-knowledge", file: "channel_presentation")).
Outbound presentation is channel-aware: long replies split at safe Markdown boundaries, oversized code becomes a document, one reply rings once, and delivery failures stay explicit. Chat turns get a phone-width presentation note; machine surfaces do not. Full detail: skill_view(name: "self-knowledge", file: "channel_presentation").
Live streaming defaults by channel capability: editable channels use rotating drafts, other configured channels use completed blocks, and unconfigured channels stay off. Ephemeral 💭 status disappears when the answer lands; only real channel turns stream. Full detail: skill_view(name: "self-knowledge", file: "channel_presentation").
**Mobile companion** is an owner-only, Noise-encrypted phone channel (chat streaming on a streaming route, history shared live with the Mac app and one agent conversation with its chat, media, voice notes, slash commands, a scoped Stop, approval cards, APNs push), off by default: an absent `[fermix_channels.mobile]` means disabled. **No phone app is released** (the iPhone app is not out, Android is in design): say so, and never walk an owner into installing or scanning. It is managed through the `channels.mobile` settings section (restart to apply) and the `mobile.*` pairing and device methods; no desktop app has a Phone pane on them yet. On an app-managed Mac pairing belongs to the app, never the CLI; a dev or Linux host sets `enabled = true` in `config.toml`, restarts, and pairs with `fermix pair`, which the daemon takes only from the owner's own terminal, never from a command Fermix runs. Detail: skill_view(name: "self-knowledge", file: "mobile").
**Companion chat socket** (`$FERMIX_HOME/companion.sock`, `0600`, always served, no setting or setup step): the Mac app's local owner-only chat, turns at operator trust with slash commands. **No released Fermix.app has the chat window yet**: say so, never walk an owner to it. It shares the phone's timeline and agent conversation (one history, one turn queue); delivery and cancel go by client message id; `schedule_job` with `delivery_mode: "origin"` from it lands in that timeline; no attachments. Detail: skill_view(name: "self-knowledge", file: "companion").
**ACP agent surface** (`[fermix_channels.acp] enabled`, on by default; Mac Settings > Channels > Editors > **Accept editor connections**, browser setup's Channels tab, or `fermix setup --acp-enabled`; restart to apply): an ACP client (Zed, a Buzz harness) spawns `fermix acp`, a bridge into the running daemon's `acp.sock`, never a second Fermix. Each session is its own conversation at operator trust. Absent by design: the slash-command pipeline, the in-chat approval flow (a sandbox refusal is final), and origin-mode scheduling. A client presenting a Buzz relay identity is remembered by npub until `fermix acp forget <npub>` (`--all`); such a session is offered `codex_run`/`claude_code_run`. A Buzz session refuses computer use and the person's own tab. Setup, behavior and failures: skill_view(name: "self-knowledge", file: "acp").
Gateway trust: **operator** (`owner_user_id`, or any local caller) gets the full surface; **guest** (`allowed_*_ids`, chat only, never promoted) gets read-only chat: no skills, MCP, exec or network, and none of the tools that return the owner's own data (workspace, job and memory-source reads, `send_attachment`), in the prompt or by name. Tool discovery is filtered by the same ceiling.
Slash commands run before the agent: `/help` and `/whoami` for any allowed sender; for the operator `/compact`, `/new` (`/clear`), `/sandbox` (`/grant`, `/revoke`, `/confirm`, `/deny`), `/soul`, `/skills`, `/stop`, `/pause`, `/resume`, `/background` (`/bg`), `/tasks`, `/ultra`, `/history`. `command_allowlist` opens owner commands to a guest, never `/grant`, `/revoke`, `/confirm`, `/deny`, `/soul`, `/skills`, `/stop`, `/background`, `/ultra` or `/history`; approval commands must come from a person, never a process Fermix started. `/stop` cancels every active turn, queued message, background task and coding run daemon-wide; a scheduled job's run, a voice call and a computer-use session keep going (`/pause` takes the machine back, `/resume` returns it). Auto-compaction runs after a reply at 0.85 of the context by default; `/compact` forces it. Who may run what, and exactly what `/stop` settles: skill_view(name: "self-knowledge", file: "commands").
`/soul` curates the persona file (`SOUL.md`), owner-only and never autonomous: `/soul review [instruction] [--with-context]` drafts an edit as a diff, and nothing changes until `/soul apply TOKEN` (a 5-minute token); `/soul revert N` and `/soul reset` are proposals that need the same apply. Every write is a revertable revision, and an edit made outside `/soul` is reported to the owner. Prompt files, personalization and every `/soul` subcommand: skill_view(name: "self-knowledge", file: "persona").
## Sandbox
Filesystem and exec built-ins (`shell`, `file_*`, `view_image`, search, `git_*`, `send_attachment`) run inside the sandbox. Modes: `strict` (workspace + grants), `standard` (default: workspace, the home's `skills` folder, grants, and a local operator turn's own directory, such as where `fermix ask` ran or an ACP working directory, when it is inside your OS home), `open` (all of `$HOME`). Protected paths (credential folders such as `~/.ssh`, Fermix's own config, secrets and memory, OS roots) and catastrophic commands are denied in every mode, even inside a grant. Mode and command profile: Mac Settings > Sandbox (restart to apply), browser setup's Sandbox tab, `/sandbox` or `fermix sandbox`; the app has no roots control, so on a Mac a directory is granted with `/grant path PATH` in chat or by approving the agent's request. When a task needs a directory outside the roots, an attended operator turn calls `request_directory_access` and the owner answers `/confirm TOKEN` or `/deny TOKEN` within 60 s (Telegram and Discord also show **Approve**/**Deny** buttons); on approval the grant persists and a chat request resumes. Roots, protected paths, what needs `/confirm`, presets and the CLI: skill_view(name: "self-knowledge", file: "sandbox"). Environment variables for commands: skill_view(name: "self-knowledge", file: "sandbox_env").
**Access-sensitive plugin commands** (marked `access_sensitive` by the plugin release; the Tesla plugin marks unlock, Sentry, trunk and window vent, and an older Tesla release marks none until it is updated) run at once on the owner's direct request. After the turn read outside content, or on any Buzz request, they wait for one owner confirmation, and the asking turn runs nothing else meanwhile; Fermix then runs exactly that call. What counts as outside content, where the confirmation goes, workers and jobs: skill_view(name: "self-knowledge", file: "plugins").
## Plugins
Plugins are connected integrations that own a surface (an API, a vault) and register their own tools; the always-present bundled trio is Gmail, Google Calendar and Google Drive. The agent learns what is live from the `## Plugins` section of the runtime prompt (there is no plugin-list tool); a plugin that is not ready shows `status=` and its fix, which on a Mac is a button in Settings > Integrations. More install from a signed catalog built into the binary, over an http rail or an mcp rail (a local process, or a vendor-hosted MCP server whose signed manifest drops undeclared upstream tools and registers none if a declared one goes missing or changes). Disabling a plugin, forgetting its local credential and revoking it upstream are three different actions. Full detail: skill_view(name: "self-knowledge", file: "plugins").
## Voice (macOS, off by default)
The Fermix app's voice companion: Mac Settings > Voice > **Talk to Fermix** plus an OpenAI Platform API key (`[fermix_core.realtime] enabled`; an OpenAI Codex sign-in with ChatGPT does not authorize voice). A call starts from the app's sidebar **Pet** > **Begin voice call** and runs over `$FERMIX_HOME/realtime.sock`. The chosen model sets the engine: `openai_realtime` (default; the voice model runs tools) or `openai_live` (GPT-Live speaks, the Fermix agent acts, its tasks running in the Mac chat's conversation unless `conversation = "private"`, and a task still running when such a call ends finishes into the chat, cancellable there or by `/stop`). `screen_share` (start/stop) watches the screen only inside a Realtime call; Live has none. Detail: skill_view(name: "self-knowledge", file: "voice").
## Computer use & computer history (off by default)
Two opt-in features share one native helper, each with its own consent and switch: Mac Settings > Computer (**Computer use**, **Computer history**; rights under **What the helper may do** > **Ask for both rights at once** > **Grant…**), or the cards on browser setup's Plugins tab on Linux and dev installs. Both need a restart.
- **Computer use** (experimental; Apple Silicon macOS, Linux x86_64 under X11): `computer_use` drives the desktop by screenshot, mouse and keyboard, or presses a control by name from `elements`. Its `access` follows `[sandbox] mode` (`strict` only looks); operator-only, attended turns only, never delegated. **Work inside one window** (`background`, experimental) binds one window. Detail: skill_view(name: "self-knowledge", file: "computer_use").
- **Computer history** (macOS): records only the chosen apps (window titles, page titles and addresses in a chosen browser, typed text outside private windows), summarized off-device by default into memories `recall_activity` reads. `/history status|pause|purge|off` manages it from any chat; enabling is never a chat command. Detail: skill_view(name: "self-knowledge", file: "computer_history").
## Config & control surfaces
- `FERMIX_HOME` default `~/.fermix`: files `config.toml`, `auth.json`, `chatgpt_host.json` (the Sign in with ChatGPT install id), `memory.db`, `setup-token`, `daemon.sock`, `realtime.sock`, `acp.sock`, `companion.sock`, `browser_bridge.sock` (the browser extension's bridge, `0600`), `browser_host.sock`; dirs `workspace/`, `bootstrap/`, `memory/`, `skills/`, `plugins/`, `browser/`, `bin/` (the browser bridge's native-messaging launcher), `journals/`, `realtime/`, `mobile/`, `secrets/` (the file secret store), `job_runs/`, `traces/`, `logs/`, `grants/`.
- Settings: on a Mac, the app's Settings panes (**Restart to apply** when a change needs it); on Linux and dev installs, `fermix settings` from any terminal, SSH included, through the running service (`list`, `show SECTION`, `set SECTION KEY=VALUE`, `primary PROVIDER`; `secret set ID` prompts without echo or reads `--stdin`, and a secret typed as an argument is refused; exit 3 when no daemon runs; a home the Mac app manages refuses it), browser setup (`fermix setup` mints a short-lived one-time `/setup?t=...` link; the durable setup token never goes in a URL), the terminal wizard, setup flags, or `config.toml`, then `fermix restart`. Secrets live in the OS keychain/keyring (default) or a `0600` file store, and `config.toml` holds `@keyring`/`@file` references; `[fermix_core] profile` keeps two homes' keyring entries apart. An outside edit to `config.toml` blocks saves until **Reload settings from disk** (`fermix settings reload`). The Mac pane map, every config section, secret stores and keyring problems: skill_view(name: "self-knowledge", file: "config").
- Personalization (the owner's name, time zone, style, and the assistant's name in `[fermix_core.agent] name`) is seeded by the first boot from the machine and edited in Mac Settings > Personality, browser setup or the terminal wizard. Prompt files live under `bootstrap/main/` and `memory/main/`; unedited defaults adopt a new build's templates on restart. Detail: skill_view(name: "self-knowledge", file: "persona").
- Outbound proxy: a host that must reach the internet through an HTTP proxy sets `[fermix_core.network] proxy = "http://host:port"` (plus `proxy_bypass` for hosts it reaches directly), with `fermix setup --proxy URL [--proxy-bypass a,.b]` or in `config.toml`, and restarts. Fermix does not read `HTTPS_PROXY` or `NO_PROXY`, and `fermix doctor` (row `network`) says so when the environment sets one. Web requests then tunnel through the proxy with TLS still verified end to end; if the proxy fails, the request fails and is never retried direct. Voice, Discord, Zoom meeting capture, streaming transcription, remote MCP plugins and phone push cannot use a proxy and will not connect to a proxied host; programs Fermix starts (the agent's commands, coding agents, the browser) are not configured by it. No Mac Settings pane sets it yet. Detail: skill_view(name: "self-knowledge", file: "config").
- Readiness: a connected provider is the one gate, checked at boot: Telegram, Discord, Signal, iMessage, ACP and the mobile listener start only when it holds (the companion socket always runs), so restart after connecting the first provider. Missing personalization, a half-configured channel, and voice without an OpenAI key are advisory: doctor warns and `/health` still answers ready.
- Service: a standalone install (Homebrew formula or downloaded binary) owns its launchd/systemd unit (per-user, or `--system`); a Linux `.deb`/`.rpm` package owns a systemd user unit, and `fermix service install` only binds it to a home, turns on linger and starts it. Linux packages install with `curl -fsSL https://fermix.ai/install | sh`, and running that again, then `fermix restart`, is how they update: the `apt`/`dnf` line `fermix upgrade` prints finds nothing until a repository is published. A standalone binary updates with `fermix upgrade` (it restarts itself); a Homebrew formula with `brew upgrade fermix`, then `fermix restart`. Control with `fermix start|stop|restart`; inspect with `fermix status|doctor|logs -f` (a Linux service that will not start says why in `journalctl --user -u fermix`). "Upgraded but behavior unchanged" almost always means no restart. Detail: skill_view(name: "self-knowledge", file: "service_unit").
- On a **Fermix.app-managed macOS engine** the app owns setup, settings, the service and updates, and drives the daemon over a versioned management protocol on `daemon.sock`. Updates come from the app's **Check for Updates…**; `fermix upgrade` does not reach it. A standalone `fermix` pointed at the app's home refuses `start`, `stop` and `service install`, cannot restart it (use **Restart Fermix…**), and opens the app for `setup`; the app's own engine binary makes `fermix start|stop` and `service install|uninstall` exit non-zero pointing at the Enable/Disable background service controls, hands `setup|uninstall` to a `fermix://` route, and answers doctor with its `upgrade` and `binary integrity` rows not-applicable. `fermix migrate-to-app` moves a Homebrew formula install to the app. Its Browser pane sets how tasks run and can download Chromium. No path deletes a Fermix home. First setup, controls, start-up failures and every verb: skill_view(name: "self-knowledge", file: "macos_app").
- Health judges a channel by its running transport, not its configured `mode`: a missing supervised process reads `degraded`, as does Telegram once its poller has failed repeatedly in a row (it keeps polling and clears on the first success).
## Observability
Logs: `~/.fermix/logs/fermix.log` (10 MB × 5 files), redacted before writing: a `[REDACTED:<vendor>]` marker means a secret was caught, not that data was lost. Read them in the Mac app's **Logs** screen, or `fermix logs -f` on Linux and standalone installs. Traces: JSONL under `~/.fermix/traces/<UTC date>/` (`llm_call`, `tool_exec`, `agent_event`, `channel_msg`, `sandbox_event`; nothing writes `error.jsonl`), each row carrying `session_id`; there is no `fermix traces` verb. Bodies are captured by default and stay on the machine unless the Opik exporter sends them elsewhere; `FERMIX_TRACE_CONTENT=0` in the daemon's environment turns capture off. Opik export is off unless `FERMIX_OPIK_ENABLED` reaches the daemon (the Mac app has no Opik setting). Session ids, failure fields, Opik per install type, the support bundle and what a restart loses: skill_view(name: "self-knowledge", file: "observability").
## Reference files
Deeper detail loads on demand with `skill_view(name: "self-knowledge", file: "<name>")`:
- `macos_app` — the Mac app: install and first-setup labels, everyday controls, updates and removal, start-up failures, a standalone `fermix` against the app's home, and `fermix migrate-to-app`.
- `service_unit` — standalone and Linux-package installs: who owns the service, updating each kind, the `PATH` baseline, the environment file, the system unit, and the package's verbs, port and logs.
- `config` — where each setting lives (the Mac pane map, browser setup, `config.toml`), what needs a restart, every config section, outside edits, and the secret stores.
- `persona` — personalization and the assistant's name, the prompt files and template adoption, and every `/soul` subcommand.
- `providers` — connecting each provider (Mac, browser setup, CLI), primary and sign-out rules, config keys, reasoning effort, sub-agent routing, failover and retries, OpenAI Codex responses.
- `agent_loop` — the context budget inside a turn, iteration and fan-out caps, `/ultra`, and deferred tool schemas.
- `images` — `view_image`, how images reach each model, `generate_image` backends and `delivery`, and `send_attachment`, including from a scheduled job.
- `web` — choosing between `web_search`, `web_fetch`, `browser` and `place_search`, search backends and the degrade, and the place-search rules.
- `browser` — the managed browser and its limits, launching Chrome on macOS, the person's own tab (`selected_tab`), and installing the extension and bridge.
- `skills` — skill loading and trust, and skill curation with every `/skills` subcommand.
- `coding_harness` — consent and turning it on, posture and watched vendor config, runs and durable delivery, and the cloud rail.
- `plugins` — what the agent sees, credential failures, the rails and auth kinds, access-sensitive commands, hosted MCP, and the operator CLI.
- `acp` — driving Fermix from Zed or Buzz: turning it on, wiring a client, remembered identities, what is absent, and failures.
- `channel_setup` — connecting Telegram, Discord, Slack, WhatsApp, Signal and iMessage: the values and where each comes from, where they are entered (Mac app, browser setup, flags, `config.toml`), the first message, the public URL, owner and allow lists, and the common failures.
- `channel_presentation` — inbound media coalescing and empty messages, then how replies land on chat surfaces: dialect rendering, the boundary-ladder splitter, message hygiene, draft-rotation and block streaming, the ephemeral 💭 stream, and the approval-prompt buttons.
- `mobile` — the phone channel: availability, the management surface, pairing, device revocation, reachability, APNs push, and troubleshooting.
- `companion` — the Mac app's chat socket: trust, the shared timeline, delivery and cancel by client message id, history and search, scheduled delivery, and what it does not carry.
- `voice` — the voice companion: turning it on, both engines, key and cost limits, which conversation a call's tasks run in, the app connection, access-sensitive commands on a call, noise and echo, and screen sharing.
- `transcription` — speech to text: choosing a backend, keys and models, the on-device `local` backend, live streams, and failure replies.
- `meetings` — the notetaker: turning on each lane, consent, artifacts, delivery, the summary route, and each refusal.
- `jobs` — scheduled agent runs: every `schedule_job` field with its default and its refusal, the schedule grammar, delivery resolution and `[SILENT]`, attachments, run confinement, lifecycle, and each management verb.
- `events_reminders` — dates and reminders: the `schedule_job` boundary, time forms, reminder plans, delivery and retry, the follow-up check-in, and managing stored events.
- `computer_use` — turning it on, platforms, permissions and the helper's identity, safety, sharing the machine and `/pause`, action receipts, window binding, and config.
- `computer_history` — capture scope, turning it on, the privacy gate and summarizer tiers, `recall_activity`, and the `/history` commands.
- `sandbox` — modes and roots, protected paths, changing the sandbox, the directory-approval loop, what needs `/confirm`, and command profiles.
- `sandbox_env` — which environment variables reach shell commands, and where their values come from.
- `commands` — trust tiers, every slash command and who may run it, the in-person rule, and what `/stop` settles.
- `observability` — logs, trace files and session ids, finding failures, content capture, Opik per install type, the support bundle, and what a restart loses.