Your AI runs here. Your data stays here.

Agent · Inference engine · Studio

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.

Runs on
  • 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

oMLXvMLXllama.cppSplashvLLM-MetalvLLMTensorRT-LLM

Metal acceleration on Apple silicon. CUDA on NVIDIA GPUs, natively or through WSL2 and Docker. Coderae picks the runtime for your hardware.

How the engine works ↓
Model picker listing local models with format and quantization badges (MLX, JANG, 4-bit, TQ4), speculative heads (MTP, DFlash2), Vision support, the serving engine (oMLX) and size.
The model picker: format, quantization, drafter and size for every model
The engine

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.

shell
# 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.

Privacy

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.

0B of your chats, code or files stored on Coderae-operated servers

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
WireGuard overlayYour own Headscale or TailscaleTor for outbound requestsOffline mode
The studio

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

Step 1

Image

Generate one, or bring your own photo or drawing.

Step 2

Mesh

Reconstruct a textured 3D model from it.

Step 3

Rig

Fit a skeleton automatically, or bring a mesh of your own.

Step 4

Animate

Apply walk cycles and clips; export glTF or .blend.

The agent

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)
ARGUMENTS:
{
  "filePath": "landing-demo/README.md"
}
RESULT
landing-demo/README.md · 7 lines · 184 bytes
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)
ARGUMENTS:
{
  "dirPath": "landing-demo"
}
RESULT
landing-demo · 3 entries
README.md
invoice/
tests/
List Directory(dirPath: "landing-demo/invoice") Backend 2ms { (+15 lines)(click to expand)
ARGUMENTS:
{
  "dirPath": "landing-demo/invoice"
}
RESULT
landing-demo/invoice · 3 entries
__init__.py
parse.py
totals.py
List Directory(dirPath: "landing-demo/tests") Backend 0ms { (+14 lines)(click to expand)
ARGUMENTS:
{
  "dirPath": "landing-demo/tests"
}
RESULT
landing-demo/tests · 2 entries
__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)
ARGUMENTS:
{
  "command": "cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -40",
  "description": "Run invoice test suite",
  "timeout": 30000
}
RESULT
$ cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -40exit 0
Traceback (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)
ARGUMENTS:
{
  "filePath": "landing-demo/invoice/parse.py"
}
RESULT
landing-demo/invoice/parse.py · 4 lines · 164 bytes
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)
ARGUMENTS:
{
  "filePath": "landing-demo/invoice/totals.py"
}
RESULT
landing-demo/invoice/totals.py · 14 lines · 492 bytes
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)
ARGUMENTS:
{
  "filePath": "landing-demo/tests/test_invoice.py"
}
RESULT
landing-demo/tests/test_invoice.py · 31 lines · 963 bytes
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)
ARGUMENTS:
{
  "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"
}
RESULT
landing-demo/invoice/parse.py
@@ 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)
ARGUMENTS:
{
  "filePath": "landing-demo/invoice/totals.py",
  "newText": "from decimal import Decimal, ROUND_HALF_UP",
  "oldText": "from decimal import Decimal"
}
RESULT
landing-demo/invoice/totals.py
@@ 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)
ARGUMENTS:
{
  "filePath": "landing-demo/invoice/totals.py",
  "newText": "    return taxed.quantize(Decimal(\"0.01\"), rounding=ROUND_HALF_UP)",
  "oldText": "    return taxed.quantize(Decimal(\"0.01\"))"
}
RESULT
landing-demo/invoice/totals.py
@@ 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)
ARGUMENTS:
{
  "command": "cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -10",
  "description": "Re-run invoice test suite",
  "timeout": 30000
}
RESULT
$ cd landing-demo && python3 -m unittest discover -s tests -t . 2>&1 | tail -10exit 0
......
----------------------------------------------------------------------
Ran 6 tests in 0.000s

OK
The demo task's 12 real tool calls, with their real arguments, results and timings. Open any of them. The workspace path is shown as <workspace>.
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
Devices and teams

One machine, every device.

Your desktop does the work. Other devices connect back to it over an encrypted overlay you can host yourself.

Your desktop models · agent · studio ● serving iPhoneremote or on-device XREAL AuraAndroid XR GPU PCLAN offload Laptopremote access VS Code Excel add-in Chrome

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.

Teams

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.

Talk to us

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 →