metalworks console script is CLI-first by design: metalworks --help and
metalworks version work on a bare install with no extras. Everything heavier
(provider SDKs, duckdb, redditwarp, the MCP server) is lazy-imported inside the
command that needs it.
Secrets come from the environment only — never the config file. The chat
provider is auto-resolved by which key is present (ANTHROPIC_API_KEY >
OPENAI_API_KEY > GOOGLE_API_KEY/GEMINI_API_KEY), then the keyless
claude-code floor when metalworks[claude-code] is installed and no key is set.
Commands flagged (chat key) below need a model — which now includes the keyless
Claude Code login; the rest are zero-key. See Run on your Claude Code
login.
Top-level commands
metalworks init option: --idea TEXT — one line on what you’re building (seeds the project slug).
New to metalworks? Just runmetalworkswith no arguments — the interactive menu lets you validate an idea, configure models/sources, or run diagnostics without memorizing the command chain below.models,sources, andconfigalso open their own interactive menu when run with no sub-command.
models
Inspect and set the chat/fast/embedding models.research
Plan and run demand-research reports, then derive everything else from them. The report-grounded commands (position, landscape, design,
assess, refresh, versions) take a report id —
but it’s optional: omit it to use your latest run, or pass a unique prefix
instead of the full id. No more copy/pasting UUIDs between steps. (research --help
groups these by Core flow / Pillars & build / History.)
The validation loop — frame an idea, then decide if it’s worth building:
Options:
research plan—--out, -o PATH(defaultbrief.json).research ideate—IDEAargument (idea-first) or--from-report REPORT_ID(evidence-first; id or prefix);--out, -o PATH.research landscape/assess— optionalREPORT_ID(id or prefix; defaults to your latest run);--out, -o PATHto write the JSON.research validate—IDEAargument;--auto/--no-auto(headless vs interactive, default interactive);--max-iterations INT(loop cap beforeexhausted, default 4);--out, -o PATH.research run—--question, -q TEXTor--brief PATH(pass exactly one);--subreddit TEXT(repeatable, else auto);--source TEXT(repeatable — which sources to ingest from; else configured/Reddit);--months INT(corpus window, default 12);--out, -o PATHto write the report JSON.research list—--limit INT(max runs to show, default 20).research refresh/versions— optionalREPORT_ID(id or prefix, any version of the report; defaults to latest); refresh updates from the lineage head and takes--out, -o PATH.research diff—REPORT_A REPORT_Barguments (earlier, later; both required).research position/landscape— optionalREPORT_ID(id or prefix; defaults to latest);--out, -o PATHto write the artifact JSON.research design—REPORT_IDargument;--namebrand name;--out, -o DIRforDESIGN.md+preview.html;--max-teardown Ncompetitor sites to teardown (0= all).research logo—REPORT_IDargument;--namebrand name;--out, -o DIRfor the SVGs +picker.html;--count, -nhow many options (design angles).research design-review—URLargument;--report REPORT_IDto also grade against that report’s design system;--json PATHfor theDesignReviewJSON.
corpus
Grow and inspect your saved research data — what research reads from. Aresearch run saves what it reads automatically, but you can also add to
it directly to build up evidence over time and across sources.
Options:
corpus add — --source TEXT (the source id, e.g. reddit / hackernews / web); -q, --query TEXT; --limit INT.
sources
List and toggle the data sources research ingests from.build
Scaffold an evidence-grounded build harness from a report (see the Build spec).REPORT is a stored report id (from research list) or a path to a
report.json. Options:
--dest, -d PATH— directory to scaffold into (default./build).--surface TEXT—auto(default) lets the spec pick the surface + explain why, or pin one:web|mobile|cli|api|sdk|browser_extension|desktop.--base TEXT— stack hint recorded in the spec, e.g.next-shipfast(defaultempty).
distribution
Plan where this product gets distributed, off a stored report (see Distribution and GEO / LLM-citability).REPORT is an id/prefix or omitted for your latest run. Both accept
--out, -o PATH to write the JSON result.
[reddit] extra is required;
search and intel need no API key, only posting needs OAuth credentials.
Options:
reddit search—--subreddit TEXT(restrict to r/X);--limit INT(default 15).reddit auth login— requiresREDDIT_CLIENT_ID/REDDIT_CLIENT_SECRETin the env; you paste thecodefrom the redirect URL.reddit post—URLargument;--text TEXT(the reply, required);--username TEXT(which connected account);--yes(actually send — default is a dry-run that prints the verdict and stops).
discovery
Find and draft Reddit reply opportunities (drafts only; never posts).
Post a chosen draft yourself with
metalworks reddit post <url> --text ....
arctic
Read the Arctic Shift historical corpus. Zero-key — needs the[arctic] extra (duckdb).
Options for
arctic pull: --months INT (how many months back, default 1); --out, -o PATH (write rows as JSONL; otherwise prints a table preview).
config
Read and write non-secret config (cwd over the user config dir). Zero-key. Secret keys (ANTHROPIC_API_KEY, OPENAI_API_KEY, provider/search/Reddit keys,
METALWORKS_FERNET_KEY, METALWORKS_MCP_TOKEN) are refused — they must come from
the environment.
mcp
Run the metalworks MCP server (see the MCP tools reference).
Options:
--transport TEXT (stdio default — keyless; or sse); --port INT
(SSE port); --host TEXT (SSE bind host); --token TEXT (bearer token). The
sse transport is network-exposed and refuses to start without a bearer token
(--token or METALWORKS_MCP_TOKEN); stdio is the keyless default.