MASON

Settings and configuration

Nothing here is needed to get started: every setting has a default that works. This page lists all of them. A test compares it with the code on every change, so a switch or a variable that is not on this page fails the build.

Settings

Under the gear in the app window. Mason calls you by the first name on this Mac's account until you type another under Name.

SwitchDefaultWhat it does
SummariesOnA model writes the summary of each project and words the proposals. Off: the memory is your own last prompts.
VoiceOnElevenLabs speaks, listens and calls. Shown as a switch once there is a key. Off: the Mac's own voice, typed answers, no calls.
Logos from the webOffAsks each site you used for its own icon, once. Off: lettered tiles.
New versionsOnAsks GitHub once a day whether a newer release is out, and says so here and on the island. Installs nothing.
Agent logsOnReads the logs of Claude Code, Codex and Grok. Off: Mason knows time, not what was built.
What you said, by meaningOffAn embedding model on this Mac places your prompts by meaning, for Find.
Chat and mail by nameOffKeeps the name of a chat or mail app and the time spent there. Off: counted, never named.
SoundOnMason speaks. Off: silent.
Answer readyOnA card of one line drops from the menu bar when Claude Code, Codex or Grok has finished an answer and you are somewhere else. It names the project; a press on the name brings the agent's app forward. It leaves by itself after nine seconds, takes no keyboard, and is not shown for an answer you were waiting in front of. Several at once come as one card, and after time away from the Mac there is one card for all of them. The card itself has a way to switch this off and a way to silence its sound. Cursor keeps no record of when it finished, so its answers are not told of.
A lute with itOnTwo notes on a lute when the card drops. The sound is a file in the repository; playing it calls nothing. Silent as well whenever Sound is off.
A word on the islandOnNudges on the island when an answer has waited.
Island by the notchOnMason sits in the menu bar as the island beside the notch, showing the day. Off, it is one icon among the others on the right, with a dot when there is something to come back to.

The first four are grouped as Leaves this Mac, the next three as Stays on this Mac. What each one sends or keeps is in What it reads, sends and keeps.

Skin is what Mason is made of, chosen from six small panes that each draw themselves in their own colours. Five are glass over the desktop and differ in what the glass is tinted with and which colour is the loud one: Lime (the default: smoked glass and the green), Slate (cool glass, pale blue), Sandstone (warm glass, yellow), Patina (green glass, copper) and Marble (grey glass, no colour). Granite is solid: nothing shows through, for a desktop too busy to work on top of. A skin changes colours and nothing else; nothing moves. It applies to the window and the panel. The island in the menu bar keeps its own colours.

Also in Settings: Screen shows whether Mason has Accessibility and offers Fix access when it has not, In your agents' rules lists the rules that stand in your agents' rules files, with the agents that hold each, and Kept on this Mac opens the memory and the notes in Finder.

In .env.local

apprentice/.env.local is read at start. It is local and ignored by git; cp .env.local.example .env.local gives you a file to fill in. Only the names in this table are read from it. A variable that is already set in the environment wins.

VariableDefaultWhat it sets
ELEVENLABS_API_KEYnoneYour ElevenLabs key. Turns on the voice.
ELEVENLABS_VOICE_IDA premade voiceAnother voice for speech and the calls.
ELEVENLABS_MODEL_IDeleven_flash_v2_5The speech model.
ELEVENLABS_LANGUAGEDetected; the calls in enThe language dictation listens for and the agents speak, for example sv.
ELEVENLABS_AGENT_LLMgemini-2.0-flashThe model the three calling agents think with.
APPRENTICE_LLM_URLnone: your Claude loginAn address that answers in the OpenAI chat format. That model then writes the summaries.
APPRENTICE_LLM_MODELhaiku with ClaudeThe name of the model.
APPRENTICE_LLM_KEYnoneA key, when the provider asks for one.
APPRENTICE_EMBED_URLnone: llama.cpp on this MacAn address that answers in the OpenAI embeddings format.
APPRENTICE_EMBED_MODELThe .gguf in data/models/The embedding model: a name at that address, or the path of a .gguf file.
APPRENTICE_EMBED_KEYnoneA key for the embeddings address.
APPRENTICE_LLAMALooked forThe path of llama-server, when it is not where Mason looks.
APPRENTICE_SYSTEM_VOICESamanthaThe Mac voice used when ElevenLabs is off.
PORT4317The port of the local server.

In the environment

For a rehearsal, a test or a recording. These are read from the environment of the process, not from .env.local.

VariableWhat it does
APPRENTICE_DATAAnother folder for the memory. The notes are then written inside it.
APPRENTICE_COLLECT0: the screen is not watched and nothing is opened in Finder.
APPRENTICE_OVERLAY0: no island.
APPRENTICE_MUTE1: silent.
APPRENTICE_LLM0: no model is asked. The same as Summaries off.
APPRENTICE_LLM_BINThe path of the Claude Code CLI, when it is not on the path.
APPRENTICE_PODCAST_MODELThe model that writes the recap script. sonnet by default.
APPRENTICE_RULES_FILEAnother file than ~/.claude/CLAUDE.md to read your agents' rules from.
APPRENTICE_CLAUDE_DIRAnother folder of Claude Code logs. Codex, Grok and Cursor are then read only when their folders are named too.
APPRENTICE_CODEX_DIRAnother folder of Codex sessions.
APPRENTICE_GROK_DIRAnother folder of Grok sessions.
APPRENTICE_CURSOR_DIRAnother folder of Cursor workspaces.
APPRENTICE_DEMOShorter pauses between questions, for recording a demo.
ELEVENLABS_DIALOGUE_MODEL_IDThe model that records the recap. eleven_v3 by default.
ELEVENLABS_ANCHOR_VOICE_IDThe first voice of the recap.
ELEVENLABS_REPORTER_VOICE_IDThe second voice of the recap.

APPRENTICE_URL, APPRENTICE_KEY, APPRENTICE_OPEN and APPRENTICE_DESKTOP_PID are passed between the app and its own server. Leave them alone.

A rehearsal instance, with its own memory, no voice, no island and no watching. It prints the address to open, with the key of that start in it:

PORT=4318 APPRENTICE_DATA=/tmp/mason-rehearsal APPRENTICE_MUTE=1 APPRENTICE_OVERLAY=0 APPRENTICE_COLLECT=0 node src/server.mjs

Commands

Run in apprentice/.

CommandWhat it does
npm run build:readerBuilds Mason.app and its two helpers with swiftc. Only what changed is built again.
npm startBuilds, then runs the server in the terminal.
npm testEvery test. No network, and no data of yours is needed or touched.
npm run workflowsChecks the collection in workflows/. -- build writes its page, -- add <file> puts a workflow in.
npm run mcpRuns the MCP server on standard input and output.

Where things are

PathWhat
apprentice/Mason.appThe app. Built on your Mac, not in the repository.
apprentice/data/The memory. Not in the repository.
apprentice/wiki/The memory as Markdown notes. Not in the repository.
apprentice/.env.localYour keys. Not in the repository.
http://127.0.0.1:4317The local server, on this Mac only. Everything but the pages needs the key of this start. /mcp is the MCP endpoint.