§ 01
Point opencode at conw.ai
opencode reads providers from its config file — ~/.config/opencode/opencode.json for a global setup, or opencode.json in a project root if you only want it for one repo. Because our API is OpenAI-compatible, the generic @ai-sdk/openai-compatible adapter is all you need. No custom plugin, no shim.
Grab a key from the Platform dashboard and drop it in:
opencode.json
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"conway": {
"npm": "@ai-sdk/openai-compatible",
"name": "Conway AI",
"options": {
"baseURL": "https://conw.ai/v1",
"apiKey": "conw_live_wWCIPxxxxxxxxxxxxxxxxxxxxx"
},
"models": {
"conway-retrain": {
"name": "conway/conway-retrain"
},
"conway-omega": {
"name": "conway/conway-omega"
}
}
}
}
}Two models show up in the model picker. Conway-Retrain is the faster, chattier one — it answers straight out. Conway-Omega thinks first, then answers. Both bill from the same balance at £1.50 per million tokens, so switching between them mid-session costs you nothing but a keystroke.
One gotcha: keep the key in the config file out of git. If you'd rather not have it on disk at all, opencode will read {env:CONWAY_API_KEY} in place of the literal string.
§ 02
Say hello first
Before handing an agent a real task, I always burn one prompt on hello. It proves the auth, the base URL, and the streaming path all work, and it tells you what the model's personality is going to feel like for the rest of the session.
Retrain, no thinking block, 20.3 seconds end to end:

Omega on the same prompt: a 7.4-second thought, then the reply, 26.2 seconds total.

Same voice, same emoji habit, different amount of deliberation. For the actual build I stayed on Retrain — when a task is mostly “emit a lot of correct boilerplate”, thinking tokens are just latency.
§ 03
One prompt, one portfolio
Then the real test. A single sentence, no follow-ups, no corrections:
build me a full stack html portfolio for thomas conway, the founder of conwai
37.5 seconds of thinking, then it started streaming. It opened by pushing back on the premise — a portfolio doesn't need a backend — and then delivered the whole front end anyway, file by file, with the deployment story attached at the end.

Three files: index.html, style.css, script.js. The HTML was sectioned and commented — hero, about, skills, projects, contact — with anchor nav wired to matching IDs. The CSS opened with a custom-property palette and closed with a mobile breakpoint, which is the part models usually forget:
style.css
#hero {
background: linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.9)),
url('path/to/tech_bg.jpg');
background-size: cover;
background-position: center;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}It also noticed the one thing it couldn't do for me and left a marker rather than hallucinating an asset URL — url('path/to/tech_bg.jpg') with a comment telling me to drop in an abstract tech image. I saved one as techbg.jpg and that was the only edit I made by hand.
The JavaScript stayed honest about being minimal:
script.js
// smooth scrolling functionality
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});And on the “full stack” framing it just told me the truth: this is a static site, the stack is your host, push it to GitHub Pages or Netlify and you're live. I'd rather have that than three hundred lines of Express I was never going to run.
§ 04
What actually rendered
Opened index.html in a browser with no changes beyond the background image. Full-bleed hero, sticky nav, the accent yellow it picked for itself:

Below the fold, a two-column about block, four competency cards with a hover lift, and project cards with an accent border on the left edge:


Is it a design award? No. The social links are href="#" placeholders, the projects are invented, and the copyright says 2024. But it is responsive, accessible-ish, and genuinely shippable after ten minutes of filling in real content — from one sentence, through a terminal, on a model you can rent for £1.50 a million tokens.
§ 05
Notes for your own setup
- Retrain for volume, Omega for reasoning.Code generation is mostly volume. Debugging, architecture calls, and anything where the first instinct is usually wrong is where Omega's thinking block earns its seconds.
- Expect deliberation on the first token.Both models front-load; once streaming starts it doesn't stall. Don't kill the process at 30 seconds.
- It will argue with your prompt.Asking for a “full stack” static site got me a correction plus the thing I actually needed. If you want the over-engineered version, say so explicitly.
- Watch the sidebar.opencode's context and spend readout is the cheapest way to notice a long session eating tokens.
Same config shape works for anything that accepts an OpenAI-compatible base URL — Cline, Aider, the OpenAI SDKs, your own scripts. Swap the base URL, keep the key, pick a model name.
Try it
Get a key and paste that config
Pay-as-you-go, no subscription, both models on the same balance. Named keys so you can keep your terminal agent separate from everything else.
Open the Platform API