makemode
for people who work in a terminal

build from your terminal.

Type what you want to make and it gets built as real files, in a folder on your own computer. The model doing the work is hosted in France and paid from your balance. Already use Claude Code? The same key drives it too.

everything runs through france — nothing leaves the eu

takes about five minutes · stuck? scroll to the fixes

where are you starting from?

in a workshop

Your host put a link on the slide, like makemode.eu/org/two-words.

  1. Open that link and sign in.
  2. On your account page, press Get my setup command.
  3. Paste it in your terminal. That covers steps 01 and 02 below — continue at 03.

on your own

Working solo on your own laptop. Start at step 01 and just follow the numbers.

New accounts start with a small balance of EU credits, so there is nothing to buy first.

01

run the setup command

Open your terminal, paste the line for your machine, press Enter. It installs opencode and points it at MakeMode. You never touch a config file or copy a key.

mac or linux — Terminal (mac: ⌘+space, type terminal, Enter)

$ curl -fsSL https://makemode.eu/setup.sh | sh

windows

download the windows setup →

Double-click the downloaded file and it does the whole thing: installs opencode for Windows, signs you in, done. Your browser may ask if you trust the file — it comes straight from makemode.eu, and all it does is run this readable script. Rather paste it yourself? The same setup, in PowerShell (Start menu, type powershell, Enter):

PS> irm https://makemode.eu/setup.ps1 | iex

More in the Windows note.

02

confirm in your browser

A tab opens on account.makemode.eu. Sign in, click confirm, and the terminal finishes on its own. Signing in by email? The link in the mail shows one Continue button; pressing it is what signs you in.

what just happened?

The confirm click made a key for this machine. It's on your account page, named after your computer, and you can revoke it there any time.

03

open a new terminal tab

Press ⌘+T (Linux: Ctrl+Shift+T). The old window can't see the fresh install; a new tab can. If the script's last line says it already opened a fresh shell for you, skip this. On Windows the setup window itself already works — skip straight to step 04.

rather stay in the same window?
$ export PATH="$HOME/.opencode/bin:$PATH"
04

start makemode

Copy the line for your machine into the terminal and press Enter. It makes a folder for your project, steps into it, and opens MakeMode there. The screen changes: your terminal becomes the MakeMode agent.

$ mkdir my-project && cd my-project && makemode
PS> mkdir my-project; cd my-project; makemode
05

you're in — it looks like this

Type your idea in the box and press Enter — it builds while you watch, as files in this folder. Sometimes it asks permission first: before commands it recognises as risky, like deleting files, publishing, or sending anything off your machine, it stops and asks in the terminal. Read the question, answer y for yes or n for no, and it carries on. Everything else it just does. It can open, change and delete files the way you can. Keep each project in its own folder, and keep a backup of anything you can't afford to lose (Time Machine on a Mac).

06

share it

One command puts your page on a public, EU-hosted link. Run it again after changes and the same link updates. Publishing is public, so this is one of the moments the agent checks with you first.

$ makemode publish
tired of the questions?

makemode --auto skips them for one session; makemode auto on makes that the default and makemode auto off goes back. With auto on, the agent deletes, installs and sends files without asking you. Only a short list of commands, like wiping a disk or your home folder, is still refused. Auto never switches off the folder boundary: the agent still changes files only in the folder you started it in.

if you see…

“command not found: makemode”

You're in the window that ran the setup. Open a new tab (⌘+T) or paste export PATH="$HOME/.opencode/bin:$PATH". If a new tab still can't find it, run ls ~/.opencode/bin — an empty folder means the install didn't finish; paste the setup command again (safe to run twice, and it repairs your shell profile itself).

“sign-in link has expired or was already used”

Ask for a fresh link on the sign-in page, open the new email, and press Continue. Old links in your inbox stay dead.

“Too many attempts”

The room shares one internet address and hit the sending limit. Wait a few minutes and try once more — don't hammer it, each try counts.

the browser tab never appeared

The terminal printed a link instead. Copy it into any browser, sign in, click confirm; the terminal notices on its own.

“Get my setup command” stopped working

That command is good for 15 minutes. Press the button again for a fresh one.

Windows — the whole story

The setup runs natively on Windows: it installs opencode's official Windows build into your user folder, signs you in from the browser, and writes the same config Mac users get. Admin rights stay untouched and there is nothing to restart. If Windows shows a "protected your PC" screen when you run the downloaded file, that's its standard screen for a file it hasn't seen often — click More info, then Run anyway, or use the PowerShell line from step 01 instead, which skips that screen entirely. One extra for Windows: makemode publish uses Node.js — install it from nodejs.org when you're ready to share; building works without it. Already on WSL or Git Bash? The Mac/Linux setup command works there as before. One difference from the Mac: Windows has no folder boundary yet, so the agent can change or delete any file on the computer, not only the project's. Back up anything important first.

Setting up Claude Code from Windows? Give the script its flag first:

PS> $env:MAKEMODE_SETUP_ARGS = '--claude' PS> irm https://makemode.eu/setup.ps1 | iex

not sure what state you're in

Run the check. It says what's installed, whether your key works, and what to do next:

$ curl -fsSL https://makemode.eu/setup.sh | sh -s -- --check
rarer ones — key rejected, crashes, gibberish

“Forbidden / blocked by a gateway or proxy” or “token expired or incorrect”

opencode's wording for a rejected key. Usually the key was mis-copied: the full sk-gw-… key is shown once, on the “key created” screen; the value in your key list is only a short prefix. Check a key in two seconds:

$ curl -s https://api.makemode.eu/v1/balance -H "authorization: Bearer sk-gw-YOURKEY"

See your balance? The key's good. See invalid_api_key? Create a fresh key and re-run the setup command.

opencode crashes with trace trap, or errors with no such column

opencode's local state database got out of sync, usually after an app upgrade. Reset it; your key lives in a separate file and survives:

$ mv ~/.local/share/opencode/opencode.db{,.bak}

Relaunch opencode and it rebuilds a fresh database. On brew, brew upgrade opencode is worth a try first.

your terminal is spewing gibberish like 35;86;21M…

A crashed full-screen app left mouse-tracking on. Harmless. Type reset and press Enter (it looks messy as you type, that's fine).

“Too Many Requests — quota of tokens per minute”

A shared per-minute limit on the EU model. opencode retries with a short backoff and recovers on its own; pause a moment if a big build keeps hitting it.

prefer to configure it by hand?

The script writes two files (plus the launcher, rules and rails). To do it yourself, create a key on your account page and paste it into the second one:

~/.config/opencode/opencode.json

{
  "$schema": "https://opencode.ai/config.json",
  "model": "makemode/glm-5.2",
  "provider": {
    "makemode": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "MakeMode (EU, metered)",
      "options": { "baseURL": "https://api.makemode.eu/v1" },
      "models": {
        "mistral-small-3.2-24b-instruct-2506": { "name": "Mistral Small (EU, fast)", "limit": { "context": 128000, "output": 8192 } },
        "devstral-2-123b-instruct-2512": { "name": "Devstral 2 (EU, coding)", "limit": { "context": 128000, "output": 8192 } },
        "mistral-medium-3.5-128b": { "name": "Mistral Medium (EU, balanced)", "limit": { "context": 128000, "output": 8192 } },
        "glm-5.2": { "name": "GLM 5.2 (EU)", "limit": { "context": 128000, "output": 8192 } },
        "qwen3.5-397b-a17b": { "name": "Qwen 3.5 (EU, reasoning)", "limit": { "context": 256000, "output": 8192 } },
        "kimi-k2.6": { "name": "Kimi K2.6 (EU, reasoning)", "limit": { "context": 256000, "output": 8192 } },
        "kimi-k2.7-code": { "name": "Kimi K2.7 Code (EU, coding)", "limit": { "context": 256000, "output": 8192 } },
        "deepseek-v4-pro": { "name": "DeepSeek V4 Pro (EU, agentic)", "limit": { "context": 256000, "output": 8192 } }
      }
    }
  }
}

~/.local/share/opencode/auth.json

{ "makemode": { "type": "api", "key": "sk-gw-YOUR-KEY-HERE" } }
what's protecting you

your key is safe to use, and the rails are sovereign.

the model key stays server-side

You hold an sk-gw-… key, never the real provider key. The gateway injects that in France — it never reaches your machine.

your balance is the limit

Requests draw from prepaid EU credits, and spending stops where your balance does. Top up any time.

eu-only models

The gateway only routes EU-hosted models (GLM-5.2 today). It won't send your traffic to a non-European model, even by accident.

the agent asks before risky commands

Ordinary work just runs. When the agent recognises a command that deletes files, spends credits, publishes, or sends anything off your machine, it waits for your yes; wiping a disk is refused outright. It spots them by matching against a list that covers the usual ways of deleting or sending files, not every possible one. So keep your work in its own folder, with a backup. The rules are readable at agent-rules.md, the enforced list at permissions.json.

the agent stays in its folder

On a Mac, and on Linux with bubblewrap installed, your computer itself keeps the agent inside the folder you start makemode in. It can create, change and delete files there, install what the project needs, and reach the internet. Everywhere else it can't change a file, and it can't read your keys, passwords or browser data, whichever command it uses. makemode check proves this on your own computer with decoy files. When a job really needs the rest of the machine, like brew install, makemode unsafe starts one session without the boundary, after asking you. On Windows there is no folder boundary yet: the agent can change or delete any file on the computer, not only the project's.

revoke any time

Lost a key, or done with a machine? Revoke it from your account dashboard and it stops working immediately.

one key, your choice of model

choosing which model builds.

One key runs every EU model MakeMode offers; the default is GLM-5.2, hosted in France. Switching is a per-request setting (opencode has an in-session model switcher), never a new key or sign-up. Your data stays inside the EU whichever you pick — see how the models compare.

switch the default in your config

The setup script wrote every model into your config. Point "model" at another entry:

{
  "model": "makemode/glm-5.2",
  "provider": {
    "makemode": {
      "options": { "baseURL": "https://api.makemode.eu/v1" },
      "models": {
        "mistral-small-3.2-24b-instruct-2506": { "name": "Mistral Small (EU, fast)", "limit": { "context": 128000, "output": 8192 } },
        "devstral-2-123b-instruct-2512": { "name": "Devstral 2 (EU, coding)", "limit": { "context": 128000, "output": 8192 } },
        "mistral-medium-3.5-128b": { "name": "Mistral Medium (EU, balanced)", "limit": { "context": 128000, "output": 8192 } },
        "glm-5.2": { "name": "GLM 5.2 (EU)", "limit": { "context": 128000, "output": 8192 } },
        "qwen3.5-397b-a17b": { "name": "Qwen 3.5 (EU, reasoning)", "limit": { "context": 256000, "output": 8192 } },
        "kimi-k2.6": { "name": "Kimi K2.6 (EU, reasoning)", "limit": { "context": 256000, "output": 8192 } },
        "kimi-k2.7-code": { "name": "Kimi K2.7 Code (EU, coding)", "limit": { "context": 256000, "output": 8192 } },
        "deepseek-v4-pro": { "name": "DeepSeek V4 Pro (EU, agentic)", "limit": { "context": 256000, "output": 8192 } }
      }
    }
  }
}

It's the same choice the web app puts behind its model picker.

already work in claude code?

point claude code at the same key.

Claude Code speaks Anthropic's API, and the gateway serves that dialect at api.makemode.eu. So the coding agent you already use can run on GLM-5.2, hosted in France — same sk-gw-… key, same balance, same EU-only routing. No proxy to install, no new account. One command sets it up:

$ curl -fsSL https://makemode.eu/setup.sh | sh -s -- --claude $ claude

The script asks for your key and writes ~/.claude/settings.json (if you already have one, it prints the exact block to merge instead of touching your file). It points model traffic at France, pins the status line to glm-5.2 — the model actually serving, not a Claude model it isn't — routes Claude Code's background chores to the cheapest fast EU model, and sets CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1: moving the base URL only relocates model calls, and without this flag Claude Code still sends telemetry and error reports to US endpoints.

prefer to set it by hand?

Two environment variables do the core of it:

$ export ANTHROPIC_BASE_URL=https://api.makemode.eu $ export ANTHROPIC_AUTH_TOKEN=sk-gw-YOUR-KEY-HERE $ claude

Whatever model name Claude Code asks for is served by GLM-5.2 — except haiku-class names (Claude Code uses those for quick background chores), which go to Mistral Small so the cheap-and-fast request actually gets a cheap, fast model. Prefer another EU model from the table above? Set ANTHROPIC_MODEL to its id. To make the setup permanent, put the variables in your shell profile, or in ~/.claude/settings.json under "env" — that's all the script does. Every request is metered against your balance and stays inside the EU.

good to know — context, status line, search, cost

GLM-5.2 runs 128k tokens of context here (Claude Code assumes more, so trim very long sessions). Image pasting isn't supported on this endpoint yet.

The API response and your usage page always record the model that really served the request. Claude Code's status line is the one place that doesn't: it shows the name it was configured with. Set ANTHROPIC_MODEL=glm-5.2 if you want the UI to say what's true.

Claude Code's built-in web search runs on Anthropic's servers rather than in the model, so it doesn't work through the gateway. If a search tool call fails, that's why.

On cost: we measured a Claude Code session at roughly 2.4× the same work in opencode here. Claude Code resends its large system prompt every turn, and the EU models behind this gateway don't offer prompt caching yet, so each resent token bills at full input price. Fine for real work, worth knowing before a long session.