Configuration
Feynman stores user-level configuration and state under ~/.feynman/, created on first run. Set FEYNMAN_HOME to use <FEYNMAN_HOME>/.feynman instead.
Directory structure
~/.feynman/
├── agent/ # Pi agent dir (PI_CODING_AGENT_DIR)
│ ├── settings.json # Default model, thinking level, packages
│ ├── auth.json # Provider credentials (user-only permissions)
│ ├── models.json # Custom and local providers
│ ├── web-search.json # Web search provider and keys
│ ├── web-search-cache/ # Fetched pages, kept for one hour
│ ├── extensions/subagent/config.json # Subagent runtime config
│ └── npm/ # Optional Pi packages from `feynman packages install`
├── sessions/ # Session transcripts (JSONL)
├── bin/ # `feynman` shim used by child agents
└── .state/ # Telemetry install ID and first-run notice state
agent/settings.json is the main configuration file. Feynman fills in missing defaults on every launch, and you can edit it by hand. The model fields look like:
{
"defaultProvider": "openai",
"defaultModel": "gpt-5.6-terra",
"defaultThinkingLevel": "medium"
}
Model configuration
defaultProvider and defaultModel set the model used when you launch without --model. Only providers you have authenticated appear in feynman model list. To add a provider, sign in to it, then switch the default:
feynman model login anthropic
feynman model list
feynman model set anthropic/claude-opus-5-5
feynman model login with no provider shows the OAuth and API-key choices. model set accepts provider/model or provider:model. Pro-class model IDs are rejected here and in --model. See Setup for OAuth on headless machines, Amazon Bedrock, and local models.
Web search configuration
Web search, page fetching, and PDF extraction come from the bundled pi-web-access package, configured in ~/.feynman/agent/web-search.json. The default auto route works without keys through Exa and uses any other provider you have configured. Set a provider and key from the CLI:
feynman search status
feynman search set brave <api-key> # or exa, tavily, perplexity, kagi, auto, ... (`feynman search set` lists all)
feynman search clear # back to auto, keys kept
The pi-web-access README documents every provider and option, including PDF extraction.
Subagent model overrides
The bundled subagents (researcher, reviewer, writer, verifier) inherit the main research model. To pin one to another model, use /subagents or set subagents.agentOverrides.<name>.model in ~/.feynman/agent/settings.json; remove it to inherit again. Feynman sets subagents.agentExcludeDirs to ["~/.agents"] so agent files there cannot replace the bundled agents, and subagents.defaultSubagentOnlyExtensions to its research tools and pi-web-access so every subagent can search, including foreground runs. It rewrites that list on each launch unless you replace it with your own.
The subagent runtime config at ~/.feynman/agent/extensions/subagent/config.json defaults to background delegation on and missions and the fleet view off. Feynman fills in only missing values and leaves your changes alone.
Thinking levels
defaultThinkingLevel sets how much the model reasons before responding: off, minimal, low, medium (default), high, xhigh, or max, subject to the active model’s capabilities. Override it for one run:
feynman --thinking high
Environment variables
Feynman reads these environment variables. FEYNMAN_MODEL, FEYNMAN_THINKING, and FEYNMAN_SERVICE_TIER override settings.json for that run. Feynman also loads a .env file from the current directory.
Telemetry
Feynman collects anonymous usage telemetry by default and shows a one-time notice the first time it runs: inside the interactive session (including Pi’s fullscreen UI), or on stderr for a one-shot --prompt run. Telemetry goes to Feynman’s PostHog project under a random install ID stored in ~/.feynman/.state/telemetry.json. Person profiles and GeoIP lookup are off.
Feynman never sends prompts, model output, paper or document content, or tool arguments. When something fails, it sends the error message and stack trace, the end of Pi’s error output, and a failed tool’s error text, with your home folder shown as ~. These can include file paths inside your projects.
To opt out, set either variable in your shell profile:
export FEYNMAN_TELEMETRY=off
export DO_NOT_TRACK=1
feynman status shows whether telemetry is on.
What is sent:
Every event also carries the Feynman version, Node.js version, platform, and CPU architecture.
Each send is tried once. The first network or ingest failure turns telemetry off for the rest of that process without printing anything; set FEYNMAN_DEBUG=1 to see the single CLI diagnostic.
Session storage
Sessions are saved as JSONL files in ~/.feynman/sessions/. An interactive feynman launch continues the most recent session for the current directory. Session flags:
feynman --new-session # start a new session
feynman --resume # pick a previous session
feynman --session <path|id> # open a specific session
feynman --fork <path|id> # fork a session into a new one
feynman --no-session # in-memory session, not saved
feynman --export <session.jsonl> [out.html] # export a session to HTML
feynman --session-dir <path> # store sessions somewhere else
Diagnostics
feynman doctor checks alphaXiv auth, the default model and authenticated providers, models.json, pandoc, web search config, and the Pi runtime, and prints next steps. It reports quietStartup: "header" as “header only”. feynman status prints a shorter summary.
