Skip to content
Bondig.dev
Go back

unrestricted.sh: An Uncensored Coding Agent API on Serverless GPUs

unrestricted.sh header

unrestricted.sh is an uncensored coding model served over an OpenAI-compatible API. One command wires it into the coding agent you already use, prompts are never stored, and you pay per token on GPUs that scale to zero when nobody is asking anything.

This post covers why I built it, what runs underneath, and the engineering that took a cold start from five minutes down to under thirty seconds.

Table of contents

Open Table of contents

The problem: refusals in the middle of real work

Mainstream models are good at code and bad at a specific slice of it. Ask for a proof-of-concept exploit for a CVE you are paid to reproduce, a parser for a malware sample, a keygen for your own licensing code, or a scraper that ignores a robots file on your own site, and you get a lecture instead of an answer.

The open-weight world solved this a while ago. Abliterated and uncensored finetunes are among the most downloaded models on Hugging Face. The catch is hardware: a 27B model at a usable quantisation wants a 48 GB card. Most people do not have one sitting under the desk, and the large hosted providers will not serve these models for policy reasons.

That gap is the whole product: the models you cannot run at home, from the hosts that will not serve them.

What it is

The model today is Qwen3.8 27B Uncensored (the OrcaRouter build, Q5_K_M) with a 262K context, at $2 per million input tokens and $6 per million output.

The stack

LayerChoice
Web appNext.js 16, React 19, Tailwind v4, Prisma on Postgres, better-auth magic links
HostingRender, Cloudflare DNS, Stripe for payments
Inferencellama.cpp (pinned commit, patched) on RunPod serverless, load-balancing endpoints
GPUNVIDIA A40 48 GB, one worker per request burst, scale to zero

Nothing exotic. The interesting parts are all in the seams between them.

Serverless GPUs: the cold start problem

Scale-to-zero is what makes a service like this affordable at low traffic. It is also what makes the first message slow. The first version took five minutes to answer, and the trail of fixes is the most transferable part of this project.

FixCold start
Original: apt-installing packages and copying binaries from a network volume at boot5 min 07 s
Bake everything into the image, built by RunPod from the repo~90 s
RunPod cached models: weights staged on host-local NVMe instead of a network volume~43 s
Report readiness early and hold the request in-container~27 s

That last one needs explaining, because it is not obvious.

RunPod’s load balancer polls a health port and only routes traffic to a worker once it answers 200. llama.cpp answers 503 while it loads the model, which RunPod reads as unhealthy and would drop the worker, so the image runs a small health responder that answers “initializing” until the model is up. The problem: while the responder says “initializing”, the load balancer backs off, and the request sat in the balancer for 13 to 28 seconds after the GPU was ready to serve it. The model load itself was only nine seconds.

The fix is a ~600-line Python front process in the container. It takes the request port, moves llama-server to loopback, and:

With that in place, the balancer’s checks turn out to run every five seconds once it sees a healthy worker. A cold start is now ~7 s container start, ~10 s model load, ~6 s of routing, and the reply.

Coding agents are prefill-heavy, and that changes everything

My own usage over a month: 8.7M input tokens against 198K output, a 44:1 ratio. Coding agents send whole files, tool definitions and conversation history on every step.

That shapes the economics and the user experience:

llama.cpp reuses a cached prefix when the same conversation lands on the same warm worker, and you can see it in the logs picking a slot by longest common prefix and processing only the new tokens. Anything that changes early in the prompt, though, invalidates everything after it.

Billing in microcents

Money is counted in microcents — millionths of a cent — because a price in cents per million tokens makes one token cost tokens × cents-per-million microcents exactly. Columns are BIGINT, and nothing above the data layer ever sees a float.

Each request estimates the prompt cost up front and refuses if the wallet cannot cover it, debits in batches while the reply streams, and settles exactly once at the end against the real usage from the backend — refunding or charging the difference in the same transaction as the ledger entry. A request the backend failed costs nothing. A client that hangs up mid-stream still settles.

Two policies exist because serverless GPUs bill by the second while customers pay by the token:

Privacy: what is and is not kept

The claim on the site is narrow on purpose, because I audited it rather than assumed it:

If someone asked me for a user’s past conversations, I could not produce them. That is a property of the architecture, not a promise in a policy document.

Who it is for

Security researchers, pentesters, CTF players and reverse engineers who hit refusals on legitimate work. People who want an agent that writes the code and skips the disclaimer. Anyone who wants an uncensored model that needs a 48 GB card without buying one.

It is not a frontier model. For everyday application code, Claude and GPT are stronger, and I would not pretend otherwise. This is for the work they will not touch.

Where it goes next

New accounts get $0.10 of credit to try it, which is a few hundred thousand tokens — enough to see whether the model is any good at your kind of work. The site is unrestricted.sh.


Share this post:

Next Post
Baseway: Database-Per-Tenant Managed Postgres for EU SaaS Teams