A phone that runs the model, not a client for someone else's.

Cortiq loads a .cmf model onto the device and runs local chat there. An account and hosted inference are not required. Downloads, the phone API, Companion, and the optional Oracle are separate network features that you control.

Android & iOS · Flutter Engine libcortiq (Rust, FFI) Format CMF v2 Apache-2.0 Inference: local by default 7 languages
On device

Downloaded models run through the same Rust runtime as the desktop tools, bundled as a native library. Local chat stays on the device; network features are opt-in.

On the phone

Search the Hub, choose a compatible safetensors architecture and a quantization, and the safetensors → CMF conversion runs multi-threaded on the handset. No laptop in the loop.

On the network

The loaded model can be served over an OpenAI-compatible API on a trusted LAN, so a laptop can use the phone as its backend.

Measured on a real iPhone

145.7 tok/s in the phone's own chat UI

iPhone 16 / A18 · TestFlight 1.3.0 (47) · LFM2.5 230M Q4TP. The 126 MiB, 14-layer Ready CMF model is estimated at about 622 MiB RAM. With CPU Auto (5), GPU toggle off, temperature 0.10 and a 128-token cap, three warm completions measured 144.5–166.0 tok/s; the median was 145.7 tok/s.

This is the chat UI metric: completion tokens divided by the full execution interval measured by the engine after generation starts. Prompt processing and the model response are included; queue waiting is not. UI latency is rounded, while the rate uses the engine timer. It is not a synthetic core-only decode number or a tap-to-response latency. A separate interactive completion in the current gallery shows 162.1 tok/s. The compact LFM result belongs to that model and workload; it is not a universal claim for every model in the catalog.

The same phone also ran Hy-MT2 Q4TP for short translation at 14.4–21.8 tok/s (17.75 average native output rate) after warm-up; its end-to-end Wi-Fi round-trip is recorded separately. Translation and compact general chat are intentionally separate model choices, not a single throughput ranking.

Full LFM iPhone record · LFM JSON data · Hy-MT2 translation record · LFM2.5 model card · Privacy boundaries

What it does

Five workflows, each doing real work

Core chat and decision paths run against a model file in device storage. Downloads and optional integrations are explicit rather than hidden.

Chat

  • Streaming replies with per-message statistics — latency, prompt and completion tokens, tok/s
  • Persistent topics: every conversation keeps its own context
  • Attach documents (txt, md, code, json) into the prompt
  • Markdown rendering, copy, regenerate, stop
  • Disable thinking — reasoning models answer directly, with no visible reasoning step

Model library

  • Parsed metadata for every local file: architecture, quantization, layers, context, task masks
  • RAM fit check before loading — a warning instead of an out-of-memory kill
  • One-tap load and unload, to give memory and battery back
  • Import .cmf files from device storage

Hugging Face converter

  • Search the Hub, pick a compatible safetensors model and a quantization, watch live progress
  • On-device multi-threaded conversion of compatible safetensors architectures to CMF v2, streamed in row slabs so a multi-gigabyte model converts in constant memory
  • cortiq import-gguf imports GGUF into CMF in the desktop toolchain; the resulting .cmf imports into the phone app
  • Download size and estimated output size shown before you commit
  • Repos that already ship .cmf are detected and simply downloaded
  • Resilient downloads — byte-range fetches that resume from the last written byte after a network drop, instead of restarting gigabytes

CMF Decision

  • Pick a known skill and receive a structured label — or an explicit abstention
  • See confidence, total time and resonance time, then inspect the JSON/API payload
  • Oracle is off by default; each external request needs confirmation

Local server

  • The phone becomes an OpenAI-compatible endpoint on a trusted LAN
  • QR code with the base URL, plus the address list and a live request log
  • Optional bearer-token auth; the listener is HTTP, so use a trusted LAN or a protected tunnel
  • Use the handset as the AI backend for a laptop
Quantization

Seven codecs, chosen on the phone

The converter offers the same codec ladder the desktop tools produce, so a file made on the handset is a file the rest of the ecosystem reads.

CodecWhat it isUse it for
Q4TP recommended4-bit tiles on a per-row scale ladderThe default for dense models — what the desktop tools emit
Q2TP2/4 mixed MoE profile: gate and up experts at 2-bit, the rest q4tpMixture-of-experts checkpoints that would not otherwise fit
Q8_2F8-bit two-field (𝒲 × θ)Highest fidelity; the reference when you are checking a smaller codec
Q8_ROW8-bit per rowA simpler 8-bit, smaller header, wide compatibility
Q1TTraining-free ternary {−s, 0, +s}, ≈2.25–3 bit, with a per-row f16 outlier overlayBelow 4-bit on a model that was never trained for it
Q11.5-bit for models trained 1-bit (Bonsai, BitNet)A 27B checkpoint in roughly 5 GB
F16No quantizationSmall models, or a baseline to measure against
API

What the phone serves

The active model determines the contract: chat models expose the OpenAI-compatible chat routes; a CMF Decision model exposes typed decision and skill routes. Use either only on a trusted LAN.

EndpointPurpose
POST /v1/chat/completionsChat — JSON and SSE streaming (chat model)
POST /v1/decideConvenience endpoint for one skill decision
POST /v1/decisionsTyped decision request (Decision model)
GET /v1/skillsDiscover skills offered by the loaded Decision model
POST /v1/completionsLegacy completions
GET /v1/modelsThe loaded model
GET /v1/cortiq/statusUptime, tokens, tok/s
GET /v1/cortiq/masksTask masks baked into the model
POST /v1/cortiq/switchSwitch the active task
GET /healthzHealth check
Companion

A model larger than the phone

Pair the handset with a desktop running cortiq worker and the desktop holds the layers, the head and the sampler while the phone keeps the tokenizer and draws. That is what puts a 34.7B MoE on a phone with 2 GB free at 16.3 tok/s. It also works the other way: the phone serves a span of its own layers so a desktop can run a model bigger than its memory.

Measured on a Xiaomi 12 Lite against a MacBook M4 over USB with the same 1.7B model: 12.5 tok/s on the phone alone, 30.9 through the desktop.

The split buys memory, not speed — a token walks the layers in order — and the app says so rather than offering to "speed up" a model that already fits. The transport is labelled too: one round trip per token is 95 ms p99 over Wi-Fi against 2.9 ms on a cable, and the app names which one you are on.

Current product screens

Cortiq Mobile 1.3.0, on a real iPhone

English TestFlight build 47. Start with the LFM2.5 230M speed capture, then browse the current Decision, Ready CMF, API, Oracle, Companion, and settings flows—not the older 1.2 gallery. The device-local bearer field is redacted in the server capture.

scroll

LFM2.5 230M chat result with 162.1 tokens per second on iPhoneLFM2.5 230M — 162.1 tok/s in the phone chat UI
Accepted CMF Decision with card arrival and timingsCMF Decision — accepted card_arrival, confidence and timings
Ready CMF catalogue distinguishes Chat and DecisionsReady CMF — one file per card; Chat and Decisions are distinct
Stopped Decision API server with typed endpoints and redacted tokenDecision API — typed routes; bearer value redacted
Optional Oracle settings switched offOracle — optional, manual and off by default
Current Companion split execution screenCompanion — split execution and transport boundaries
Settings with English language, Oracle and GPU optionsSettings — English, Oracle boundary and CPU/GPU behavior
Where the models come from

Ready-made, or bring your own

Every .cmf repo published at huggingface.co/infosave is pinned in the app as a featured model and downloads in one tap. A compatible safetensors repository on the Hub goes through the on-device converter. The CMF desktop toolchain also imports GGUF with cortiq import-gguf; its resulting .cmf file can be imported from storage.