Your AI runs here. Your data stays here.
A coding agent, an inference server and a creative studio in one app, on hardware you control. Use our agent, or point yours at Coderae's OpenAI-compatible API.
- macOS · Apple silicon
- Windows
- Linux
- Docker
- iPhone companion
Free, with no time limit. You sign in with a free Coderae account. Create one →
Your agent, our engine.
Any tool that speaks the OpenAI API can use the models on your machine. Point it at Coderae and keep working the way you already do.
Seven inference runtimes
Metal acceleration on Apple silicon. CUDA on NVIDIA GPUs, natively or through WSL2 and Docker. Coderae picks the runtime for your hardware.
Your GPU, your studio.
The same app that writes your code makes the assets for it: seven creative tools, running on your own GPU.
Image
Generate, edit, upscale
Video
Text or image to video
Music
Songs, with or without lyrics
Sound
Effects from a sentence
3D
Image to an animated mesh
Listen
Transcribe and analyze media
Train
Your own LoRAs and fine-tunes
Suite now passes: Ran 6 tests … OK (was FAILED (failures=2, errors=1)). Tests were not touched.
See the full answer
Own your inference.
Coderae is a complete local inference server, written in native C++. It picks one of seven runtimes for your hardware, keeps your model and its cache warm, and serves it to any client that speaks the OpenAI API.
# Any OpenAI-compatible client export OPENAI_BASE_URL=http://localhost:8080/v1 export OPENAI_API_KEY=cdra_sk_… # scoped to one client curl $OPENAI_BASE_URL/chat/completions \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{"model":"qwen3.8-27b-4bit","stream":true, "messages":[{"role":"user","content":"hi"}]}'
Chat, completions, embeddings and model listing, with streaming and tool calls. Each client gets its own key and sees only the models you allow.
Speculative decoding
MTP heads and DFlash drafters, matched to each model automatically.
A cache that persists
Prefix and per-conversation KV reuse, with an SSD cache that survives a restart.
Model management
Download from Hugging Face, convert to MLX, GGUF or JANG, and fine-tune on your own data. One copy on disk, shared by every runtime.
Every setting in reach
Context length, drafter, cache size and memory headroom, with sensible defaults.
Your work belongs to you. Not our servers.
Models, agents and creative tools run on hardware you control. Coderae doesn’t need to host your conversations or project files, and you decide when anything connects to an outside service.
When you use local models. A cloud model or Hosted Git, if you choose one, receives what you send it.
Stays on your hardware
- Chats, prompts and answers
- Code and workspace files
- Models, caches and fine-tunes
- Images, video, music and 3D you generate
- Documents you add to a knowledge base, and memory
Leaves only when you choose
- Cloud modelsAnthropic or OpenAI receive your prompts and context, only when selected
- Web search and fetchThe query or URL, optionally routed through Tor
- Offload to your other machinesJobs and results travel between your own devices
- Usage telemetryOff by default, opt in per category
What Coderae runs
- Sign-in and licenceYour account, device and plan. Never prompts or code
- Remote-access relayForwards WireGuard-encrypted packets it can’t read
- Public API tunnel, if enabledTerminates TLS, so traffic is readable while it passes through
- Hosted Git, if you use itStores the repositories you push to it
Create on your GPU.
Seven creative tools in the app you already code in. Studio runs on this machine, or on another Coderae machine on your network with the GPU you need, and the results come back to your library.
Image
Generate and edit images, then upscale and refine them. LoRAs, depth maps and object cutouts.
Video
Text to video and image to video, through ComfyUI workflows.
Music
Full songs with or without lyrics, with ACE-Step.
Sound
Sound effects from a sentence.
3D
Reconstruct a textured mesh from an image, rig it automatically and animate it.
Listen
Transcribe and batch-analyze audio, video and images.
Train
A music LoRA from your own songs, or fine-tune an LLM on your own data.
Image to animated 3D, in four steps
Image
Generate one, or bring your own photo or drawing.
Mesh
Reconstruct a textured 3D model from it.
Rig
Fit a skeleton automatically, or bring a mesh of your own.
Animate
Apply walk cycles and clips; export glTF or .blend.
An agent that shows its work.
Every tool call is a card you can open: its arguments, its result and how long it took. The answer says what changed and what it verified, so you can check it in seconds.
Tool calls (12)
Read File(filePath: "landing-demo/README.md") Backend 2ms { (+16 lines)(click to expand)
{
"filePath": "landing-demo/README.md"
} 1# invoice23Tiny invoice helper: parses lines like `3 x 4.50` and totals them with discount and tax.45Run the tests from this directory:67 python3 -m unittest discover -s tests -t .
List Directory(dirPath: "landing-demo") Backend 3ms { (+15 lines)(click to expand)
{
"dirPath": "landing-demo"
} README.md invoice/ tests/
List Directory(dirPath: "landing-demo/invoice") Backend 2ms { (+15 lines)(click to expand)
{
"dirPath": "landing-demo/invoice"
} __init__.py parse.py totals.py
List Directory(dirPath: "landing-demo/tests") Backend 0ms { (+14 lines)(click to expand)
{
"dirPath": "landing-demo/tests"
} __init__.py test_invoice.py
Bash Command(command: "cd landing-demo && python3 -m unittest d...", description: "Run invoice test suite", ...) Backend 554ms { (+10 lines)(click to expand)
{
"command": "cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -40",
"description": "Run invoice test suite",
"timeout": 30000
} $ cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -40exit 0Traceback (most recent call last):
File "<workspace>/landing-demo/tests/test_invoice.py", line 12, in test_compact_and_uppercase
self.assertEqual(parse_line("2X9.99"), (2, "9.99"))
~~~~~~~~~~^^^^^^^^^^
File "<workspace>/landing-demo/invoice/parse.py", line 3, in parse_line
qty, price = text.split(" x ")
^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)
======================================================================
FAIL: test_rounds_half_up_to_cents (tests.test_invoice.InvoiceTotalTests.test_rounds_half_up_to_cents)
----------------------------------------------------------------------
Traceback (most recent call last):
File "<workspace>/landing-demo/tests/test_invoice.py", line 27, in test_rounds_half_up_to_cents
self.assertEqual(invoice_total(["1 x 0.125"]), Decimal("0.13"))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Decimal('0.12') != Decimal('0.13')
======================================================================
FAIL: test_surrounding_whitespace (tests.test_invoice.ParseLineTests.test_surrounding_whitespace)
----------------------------------------------------------------------
Traceback (most recent call last):
File "<workspace>/landing-demo/tests/test_invoice.py", line 15, in test_surrounding_whitespace
self.assertEqual(parse_line(" 1 x 12.00 \n"), (1, "12.00"))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Tuples differ: (1, '12.00 \n') != (1, '12.00')
First differing element 1:
'12.00 \n'
'12.00'
- (1, '12.00 \n')
? ---
+ (1, '12.00')
----------------------------------------------------------------------
Ran 6 tests in 0.001s
FAILED (failures=2, errors=1) Show the other 7 tool callsHide the other 7 tool calls
Read File(filePath: "landing-demo/invoice/parse.py") Backend 0ms { (+16 lines)(click to expand)
{
"filePath": "landing-demo/invoice/parse.py"
} 1def parse_line(text):2 """Parse an invoice line such as '3 x 4.50' into (quantity, unit_price)."""3 qty, price = text.split(" x ")4 return int(qty), price
Read File(filePath: "landing-demo/invoice/totals.py") Backend 0ms { (+16 lines)(click to expand)
{
"filePath": "landing-demo/invoice/totals.py"
} 1from decimal import Decimal23from .parse import parse_line456def invoice_total(lines, discount_pct=0, tax_pct=0):7 """Total for a list of invoice lines, discount first, then tax, rounded to cents."""8 subtotal = Decimal("0")9 for text in lines:10 qty, price = parse_line(text)11 subtotal += Decimal(price) * qty12 discounted = subtotal * (1 - Decimal(discount_pct) / 100)13 taxed = discounted * (1 + Decimal(tax_pct) / 100)14 return taxed.quantize(Decimal("0.01"))
Read File(filePath: "landing-demo/tests/test_invoice.py") Backend 0ms { (+16 lines)(click to expand)
{
"filePath": "landing-demo/tests/test_invoice.py"
} 1import unittest2from decimal import Decimal34from invoice import invoice_total, parse_line567class ParseLineTests(unittest.TestCase):8 def test_spaced(self):9 self.assertEqual(parse_line("3 x 4.50"), (3, "4.50"))1011 def test_compact_and_uppercase(self):12 self.assertEqual(parse_line("2X9.99"), (2, "9.99"))1314 def test_surrounding_whitespace(self):15 self.assertEqual(parse_line(" 1 x 12.00 \n"), (1, "12.00"))161718class InvoiceTotalTests(unittest.TestCase):19 def test_simple(self):20 self.assertEqual(invoice_total(["2 x 5.00", "1 x 2.50"]), Decimal("12.50"))2122 def test_discount_then_tax(self):23 self.assertEqual(invoice_total(["1 x 100.00"], discount_pct=10, tax_pct=8), Decimal("97.20"))2425 def test_rounds_half_up_to_cents(self):26 # 0.125 must round to 0.13, as on a printed receipt27 self.assertEqual(invoice_total(["1 x 0.125"]), Decimal("0.13"))282930if __name__ == "__main__":31 unittest.main()
Edit File(filePath: "landing-demo/invoice/parse.py", newText: "import re _LINE_RE = re.compile(r"^\s*(...", ...) Backend 377ms { (+8 lines)(click to expand)
{
"filePath": "landing-demo/invoice/parse.py",
"newText": "import re\n\n_LINE_RE = re.compile(r\"^\\s*(\\d+)\\s*[xX]\\s*(\\S+)\\s*$\")\n\n\ndef parse_line(text):\n \"\"\"Parse an invoice line such as '3 x 4.50' into (quantity, unit_price).\"\"\"\n match = _LINE_RE.match(text)\n if match is None:\n raise ValueError(f\"Invalid invoice line: {text!r}\")\n qty, price = match.groups()\n return int(qty), price",
"oldText": "def parse_line(text):\n \"\"\"Parse an invoice line such as '3 x 4.50' into (quantity, unit_price).\"\"\"\n qty, price = text.split(\" x \")\n return int(qty), price"
} @@ parse.py @@-def parse_line(text):- """Parse an invoice line such as '3 x 4.50' into (quantity, unit_price)."""- qty, price = text.split(" x ")+import re++_LINE_RE = re.compile(r"^\s*(\d+)\s*[xX]\s*(\S+)\s*$")+++def parse_line(text):+ """Parse an invoice line such as '3 x 4.50' into (quantity, unit_price)."""+ match = _LINE_RE.match(text)+ if match is None:+ raise ValueError(f"Invalid invoice line: {text!r}")+ qty, price = match.groups() return int(qty), price
Edit File(filePath: "landing-demo/invoice/totals.py", newText: "from decimal import Decimal, ROUND_HALF_...", ...) Backend 189ms { (+8 lines)(click to expand)
{
"filePath": "landing-demo/invoice/totals.py",
"newText": "from decimal import Decimal, ROUND_HALF_UP",
"oldText": "from decimal import Decimal"
} @@ totals.py @@-from decimal import Decimal+from decimal import Decimal, ROUND_HALF_UP from .parse import parse_line
Edit File(filePath: "landing-demo/invoice/totals.py", newText: " return taxed.quantize(Decimal("0.01"...", ...) Backend 100ms { (+8 lines)(click to expand)
{
"filePath": "landing-demo/invoice/totals.py",
"newText": " return taxed.quantize(Decimal(\"0.01\"), rounding=ROUND_HALF_UP)",
"oldText": " return taxed.quantize(Decimal(\"0.01\"))"
} @@ totals.py @@ subtotal += Decimal(price) * qty discounted = subtotal * (1 - Decimal(discount_pct) / 100) taxed = discounted * (1 + Decimal(tax_pct) / 100)- return taxed.quantize(Decimal("0.01"))+ return taxed.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
Bash Command(command: "cd landing-demo && python3 -m unittest d...", description: "Re-run invoice test suite", ...) Backend 586ms { (+10 lines)(click to expand)
{
"command": "cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -10",
"description": "Re-run invoice test suite",
"timeout": 30000
} $ cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -10exit 0...... ---------------------------------------------------------------------- Ran 6 tests in 0.000s OK
- Modes
- Default, Plan, Explore, Code Review, Read Only
- Orchestrator
- Supervises another Coderae session, or another agent such as Claude
- Agent Swarm
- One chat directs many worker conversations
- Goals, Routines
- Long-running objectives and scheduled jobs
- Tools
- Shell, files, browser, any MCP server, Office documents, forecasting
- VS Code
- Chat and inline edits in your editor: explain, refactor, write tests, fix issues, commit messages
- Your documents
- Add PDFs, Word, Excel, PowerPoint, CSV and text files to a knowledge base. Coderae indexes them on your machine and answers from them.
- Memory
- Shared memory across chats, and full-text search over every conversation
One machine, every device.
Your desktop does the work. Other devices connect back to it over an encrypted overlay you can host yourself.
iPhone
Chat with your desktop from anywhere, or run small MLX models on the phone itself, even in airplane mode.
Remote desktop
See and control your computer from your phone over your own overlay.
LAN GPU offload
Send Studio image jobs to another Coderae machine; results return to your library.
VS Code, Excel and Chrome
An editor extension for chat and inline edits, a spreadsheet add-in, and a browser extension the agent can use with your permission per site.
XREAL Aura glasses
Your agent and your desktop in Android XR glasses, for XREAL Aura when the glasses ship.
One GPU box for the whole office.
Serve your models to the whole office from one GPU box. Each person and tool gets its own key, its own model list and its own limits. A key reaches the models and nothing else: not your chats, files or knowledge bases.
Bring your own machine.
One install gives you the agent, the engine and the studio. Pick your platform.
macOS
Apple silicon.
Windows
x64, with NVIDIA GPU acceleration.
iPhone
Connects to your desktop, or runs small models on its own.
Linux and Docker
Host it on your own GPU server.
Teams and enterprise
Shared servers and seats.
Free, with no time limit. You sign in with a free Coderae account. Create one →