Skip to main content
The 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 run metalworks with no arguments — the interactive menu lets you validate an idea, configure models/sources, or run diagnostics without memorizing the command chain below. models, sources, and config also 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 (default brief.json).
  • research ideateIDEA argument (idea-first) or --from-report REPORT_ID (evidence-first; id or prefix); --out, -o PATH.
  • research landscape / assess — optional REPORT_ID (id or prefix; defaults to your latest run); --out, -o PATH to write the JSON.
  • research validateIDEA argument; --auto/--no-auto (headless vs interactive, default interactive); --max-iterations INT (loop cap before exhausted, default 4); --out, -o PATH.
  • research run--question, -q TEXT or --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 PATH to write the report JSON.
  • research list--limit INT (max runs to show, default 20).
  • research refresh / versions — optional REPORT_ID (id or prefix, any version of the report; defaults to latest); refresh updates from the lineage head and takes --out, -o PATH.
  • research diffREPORT_A REPORT_B arguments (earlier, later; both required).
  • research position / landscape — optional REPORT_ID (id or prefix; defaults to latest); --out, -o PATH to write the artifact JSON.
  • research designREPORT_ID argument; --name brand name; --out, -o DIR for DESIGN.md + preview.html; --max-teardown N competitor sites to teardown (0 = all).
  • research logoREPORT_ID argument; --name brand name; --out, -o DIR for the SVGs + picker.html; --count, -n how many options (design angles).
  • research design-reviewURL argument; --report REPORT_ID to also grade against that report’s design system; --json PATH for the DesignReview JSON.

corpus

Grow and inspect your saved research data — what research reads from. A research 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 TEXTauto (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 (default empty).

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

Search Reddit, fetch intel, and post (gated). The [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 — requires REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET in the env; you paste the code from the redirect URL.
  • reddit postURL argument; --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.