FixMyAI OS · multi-model AI workspace
Every answer names the company that processed it.
Chat, images, characters, research and documents across the whole model catalogue. Pick a privacy mode and the router enforces it: if no provider can meet it, the request is refused rather than quietly downgraded. Under every reply, the provider, the region, the retention term, the latency and the cost.
The number of routes that qualify for Private is read live from the route table, which is not reachable right now. The route table itself is on the privacy page.
The line under the answer is the product. It is recorded per request, and you can export the log.
Four modes you can switch per conversation
Privacy is a setting on the thread, not a badge on the homepage.
A fifth mode, Local model, runs against a model server on your own network with no egress at all. It is designed and specified but not switched on in the current build — we say so on the privacy page rather than in a footnote.
One gateway, every model
One catalogue. One bill. One keyboard shortcut to switch.
Change model mid-conversation and keep the thread. The picker shows what each route costs, how long it usually takes and which privacy modes it survives — before you send anything. The table below is generated from the same route table the router filters against.
Catalogue unavailable
The model table is read live from the route table, and the route table cannot be reached right now, so this section is blank rather than approximate. We would rather show you nothing than a number you cannot check against the product.
Something went wrong. (HTTP 500)
Prices are read from the gateway and move when providers change them, which is the point of showing them at all. A route with no named processor cannot be offered above Standard, however cheap it is.
The fail-closed guarantee
When the promise can’t be kept, nothing is sent.
Most systems degrade gracefully. A privacy system that degrades gracefully is a privacy system that lies. Ours stops, shows its working, and offers you named ways out.
What usually happens
A graceful degradation is the right instinct almost everywhere in software. It is the wrong instinct here, because the thing being degraded is a promise, and a promise that degrades under load was never load-bearing.
What happens here
Held — this request was not sent anywhere.
This thread requires Private: contractual zero retention, and you have pinned gemini-3.0-pro. Google does not offer that model under a zero-retention contract.
Catalogue unavailable
The routing arithmetic is read live from the route table, and the route table cannot be reached right now, so this section is blank rather than approximate. We would rather show you nothing than a number you cannot check against the product.
Something went wrong. (HTTP 500)
Five modules, live today
The parts that work, and nothing that doesn’t.
Canvas, Code Studio, Agents, workflow automation, video and audio are designed and visible in the product as roadmap screens, clearly labelled. These five are finished.
Chat
Streaming chat with the receipt attached
Markdown, tables, code blocks with copy, vision, branching, edit-and-resend, folders and tags. Every parameter — system prompt, temperature, top-P, penalties — is one click away rather than buried in settings.
- Switch model mid-thread and keep the context
- Cost, token count, provider and latency under each message
- Web search with clickable citations, in the modes that allow it
- Export a thread as Markdown or JSON
The trade-off: the metadata line adds visual noise to every answer. We think a number you can check beats a badge you cannot, but it is a real cost in tidiness.
Image Studio
A control panel, not a prompt box
Negative prompt, style presets, aspect ratio, resolution to 4K, steps, guidance, seed with lock and randomise, batch count. Brush a mask and describe just the change.
- Inpaint and edit a region without regenerating the frame
- Upscale, variations, background removal on any result
- An inspector showing every parameter, with reuse-these-settings
- Asset library with lineage — which image came from which
The trade-off: image generation always leaves your device. There is no browser-only image mode, and we will not pretend otherwise.
Characters
Personas with version history
Name, backstory, system prompt with a live token count, greeting, example dialogues, default model and temperature. Preview the character in a chat panel beside the editor while you build it.
- Save a version, compare two versions, roll back
- Duplicate an existing character and evolve it
- Start a thread as any character — its settings become the thread’s
- Share by unlisted link, or keep it to yourself
The trade-off: a shared character carries its system prompt to whoever opens the link. Treat the prompt as public once you share it.
Research
Watch it search, read and synthesise
Ask a question and the work is visible: queries issued, pages fetched, sources kept and discarded. The report comes back with inline citation chips that open the exact source.
- Real web search and real page fetching, not a recollection
- A sources sidebar with domain, retrieval date and a confidence bar
- Follow-up questions reuse the sources already gathered
- Export to Markdown or PDF with the citation list intact
The trade-off: research needs the open web, so it cannot run in Private, Browser-only or Temporary modes. The toggle greys out and tells you why.
Documents
Answers that point at the page
Drop in PDF, DOCX, TXT, MD or CSV and watch the pipeline: queued, parsing, embedding, ready. Ask across one document or a whole collection.
- Citations carry page numbers, and clicking one jumps the viewer
- Document viewer beside the chat panel, not in another tab
- Collections to group documents for a single question
- Indexed with pgvector inside Postgres — no separate search cluster
The trade-off: indexing writes chunks of your document to our database. In Browser-only and Temporary modes, document Q&A is unavailable rather than silently downgraded.
What you give up
Every privacy mode costs you something. Here is the bill.
This section exists because a privacy product that only lists benefits is telling you the same story as the ones it claims to be better than. The app shows these lines at the moment you switch modes, too — not only here.
- Every model in the catalogue
- Web search with citations
- Sync, search, export and share
- Lowest price per token
- The provider that serves the request may retain the prompt briefly for abuse monitoring — up to 30 days on some routes
- Your thread text sits in our database, encrypted at rest but readable by us if you ask support to look at it
- Contractual zero retention on the provider side
- Named provider, region and contract date on every reply
- Still synced to your account so you keep your history
- Far fewer routes — only the ones a human has verified qualify, and the count is on the privacy page
- Higher cost per token on the zero-retention routes
- No web search: fetching a page means telling a search provider what you asked
- No server-side record of the conversation exists
- Works with every zero-retention route
- Clearing your browser data really does delete it
- No sync — the thread exists on one device only
- No cross-device search
- No recovery: clear your browser, lose the thread
- No sharing, no team access
- The shortest possible lifetime for a conversation
- No artefact to delete afterwards, anywhere
- Ideal for a question you would not put in a ticket
- No history at all — close the tab and it is gone
- A refresh loses the thread
- You cannot export it after the fact, only during
- No egress at all — nothing leaves your network
- You own the logs, the weights and the hardware
- The only mode that survives an offline audit
- Weaker models than the frontier closed-weight ones
- Slower, unless you own real GPUs
- You run the infrastructure and carry the uptime
For developers
OpenAI-compatible. Change two lines, keep your client.
Same request shape, same streaming format, same SDKs. The additions are one header that sets the privacy mode and three response headers that tell you exactly who served it.
from openai import OpenAI
client = OpenAI(
base_url="https://api.fixmyai.os/v1",
api_key=os.environ["FIXMYAI_KEY"],
)
r = client.chat.completions.with_raw_response.create(
model="mistral-large-3",
messages=[{"role": "user", "content": "Summarise clause 7."}],
# the only line that is not stock OpenAI
extra_headers={"X-Privacy-Mode": "private"},
)
print(r.headers["x-route-provider"]) # Mistral AI SAS
print(r.headers["x-route-region"]) # eu-west-3
print(r.headers["x-route-retention"]) # noneimport OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.fixmyai.os/v1",
apiKey: process.env.FIXMYAI_KEY,
});
const res = await client.chat.completions.create(
{
model: "mistral-large-3",
messages: [{ role: "user", content: "Summarise clause 7." }],
},
// the only line that is not stock OpenAI
{ headers: { "X-Privacy-Mode": "private" } },
).withResponse();
console.log(res.response.headers.get("x-route-provider"));
// Mistral AI SAScurl -sS -D - https://api.fixmyai.os/v1/chat/completions \
-H "Authorization: Bearer $FIXMYAI_KEY" \
-H "Content-Type: application/json" \
-H "X-Privacy-Mode: private" \
-d '{"model":"mistral-large-3",
"messages":[{"role":"user","content":"Summarise clause 7."}]}'
HTTP/2 200
x-route-provider: Mistral AI SAS
x-route-region: eu-west-3
x-route-retention: none
x-route-verified-at: 2026-07-21
x-usage-credits: 3The three headers that come back
- x-route-provider
- The legal entity whose hardware ran the request. Mistral AI SAS
- x-route-region
- Where it ran. eu-west-3
- x-route-retention
- The contractual retention term for that route. none
And the one status code that matters
A request that cannot be routed under the mode you asked for returns 422 privacy_contract_unsatisfiable with the same arithmetic the app shows a human: routes checked, routes qualifying, why each group was excluded, and the alternatives. It never returns a 200 from a route that does not meet the contract.
Self-host
Five containers on one box. No Kubernetes required.
The whole stack is a web app, an API, Postgres with pgvector, Redis, and Caddy for automatic TLS. It fits in about 2.5 GB of RAM on a four-core machine with no GPU, because inference happens elsewhere — unless you point it at your own model server, which is the entire idea behind Local mode.
- Source-available under AGPL-3.0, no seat count, no phone-home
- Bring your own provider keys; the route table is yours to edit
- Row-level security in Postgres, on by default
- One command to start, one file to configure
# one file, five services, automatic TLS
git clone https://git.fixmyai.os/os.git && cd os
cp .env.example .env # provider keys + domain
docker compose up -d
# NAME CPU MEM STATUS
# os-caddy 0.2% 18 MiB healthy
# os-web 0.9% 212 MiB healthy
# os-api 1.4% 340 MiB healthy
# os-postgres 0.8% 1.1 GiB healthy
# os-redis 0.1% 26 MiB healthyCustomer logo wall — placeholder
This band is where customer logos go once there are customers who have agreed to be named. We would rather leave an obviously empty frame here than fill it with companies who have not said yes.
Questions we actually get
Answered at the length the question deserves.
Under every assistant message there is a line like mistralai/mistral-large-2411 · Mistral AI SAS · eu · zero-retention · 431ms · $0.0021. That is the company whose hardware ran your prompt, the region it ran in, the retention term we hold them to, and what it cost. It is recorded per request and you can export it.
Most AI products will tell you they have zero-retention agreements. Very few will tell you with whom. That is the gap this product is built in.
Partly private, and we would rather be exact about which part. In Standard mode your text is on our servers and may sit briefly with a provider. In Private mode the provider is contractually bound to keep nothing but we still store your thread so you can find it. In Browser-only and Temporary modes we hold nothing.
In no mode is the traffic end-to-end encrypted such that we could not read it in flight — we proxy the request, so we can. Anyone claiming otherwise while also offering server-side search is describing something that does not exist.
Venice's strongest draw is that it does not refuse much, and it runs open-weight models on its own GPUs. We do not replicate the first part: standard model safety applies here.
The difference that matters to us is disclosure. Venice's public model catalogue reports provider: venice.ai for every single model, including the closed-weight ones that nobody can self-host, and their privacy policy names one subprocessor. So the promise rests on parties you cannot see. We publish the route table, the region, the retention term and the date we last verified each one.
That comparison is drawn from their published catalogue and policy, read in July 2026. If they start naming providers, this paragraph should change.
The request is refused and nothing is sent. You get the arithmetic — how many routes were checked, how many supported the mode, how many were excluded by region — computed from the route table at the moment you asked, and at least three named ways out, including relaxing the requirement for that one thread.
The thing we will not do is quietly serve you from a route that does not meet the setting and let the badge keep saying it does.
No, in any mode, and there is no setting that turns it on. We do not have a model to train. Providers we route to are bound by their API terms, which for every route in the catalogue exclude training on API traffic; the route table names each one so you can go and read the terms yourself.
The whole OpenRouter catalogue — Anthropic, OpenAI, Google, Mistral, Meta, DeepSeek, Qwen and several hundred more — refreshed from the gateway. Every one of those is available in Standard mode. Only the handful whose provider terms a human here has actually read qualify for Private, and the privacy page lists each of them with the date and the terms that were read; the count is generated from the route table, not typed into a page.
The picker shows live price and context length, and greys out anything your current mode excludes with the reason attached.
Yes. It is five containers and one docker compose up -d — a web app, an API, Postgres with pgvector, Redis and Caddy for TLS. It fits in about 2.5 GB of RAM on a four-core box with no GPU, because inference happens elsewhere unless you point it at your own model server. Source-available under AGPL-3.0.
One credit is a thousand tokens on a mid-tier model, or one 1024px image, or one page of a document indexed. A typical working day of chat is 40–80 credits. The meter is visible in the app and every message shows what it cost, so you are never guessing.
Yes, and it is OpenAI-compatible: change the base URL and the key, keep your existing client. The extra piece is a X-Privacy-Mode header. Set it to private and the same fail-closed rule applies to your API traffic — a 409 with the routing arithmetic rather than a quiet downgrade.
Five modules are live: Chat, Image Studio, Characters, Research and Documents. Canvas, Code Studio, Agents, workflow automation, video, audio and the Security Hub are designed and visible in the product as roadmap screens, clearly marked. We would rather show you the plan than pretend the plan is shipped.
Try it, then go and check the route log.
Free plan, 200 credits a month, no card. Every answer you get will tell you which company processed it — including the ones on the free plan.