I Killed My ChatGPT Plus Subscription. The Replacement Took Fifteen Minutes.

Brett Ridenour Brett Ridenour · June 19, 2026

I had three AI subscriptions stacked on top of each other. ChatGPT Plus because I lived in it. Claude Pro because the writing was sharper. Gemini for the long-context grunt work and image stuff. Three logins, three browser tabs, three monthly charges, three different histories of conversations I could never search across.

The thing that finally tipped me was watching a model swap on OpenRouter. The same single API endpoint that talks to GPT-4o also talks to Claude Opus 4.7, Gemini 2.5 Pro, DeepSeek, Llama, Qwen, every Grok variant, the whole catalog. One key. Pay-per-token. No seats. No “Plus” tier. And there was nothing stopping me from putting a real chat UI in front of it.

So I did. The whole thing came up in one Docker run and a tailscale serve line. I cancelled ChatGPT Plus the same night.

What this actually is

Two free, open-source pieces and one tiny bill:

1
OpenWebUI
Open-source chat UI that looks and feels like ChatGPT. Runs as one Docker container. Multi-user, model picker, conversation history, file upload, the whole thing.
2
OpenRouter
One API endpoint, 300+ models. You hand it your prompt and pick a model. Pay-per-token across every major lab. No subscription.
3
Tailscale
Private mesh network. The container is bound to localhost. Tailscale exposes it only to devices signed into my tailnet — phone, laptop, iPad, anywhere I'm logged in.

OpenWebUI is the UI you already know. Sidebar of chats, model picker top-left, prompt box at the bottom. Looks like ChatGPT. Behaves like ChatGPT. Except the model picker has every model, and the bill comes from one place.

The actual setup

This is the entire deployment. One container, two environment variables, one port mapped to localhost only.

docker run -d \
  --name open-webui \
  --restart always \
  -p 127.0.0.1:3000:8080 \
  -v open-webui:/app/backend/data \
  -e OPENAI_API_BASE_URL=https://openrouter.ai/api/v1 \
  -e OPENAI_API_KEY=sk-or-v1-... \
  ghcr.io/open-webui/open-webui:main

Docker run command

Two things to notice.

The first is OPENAI_API_BASE_URL. OpenWebUI is built to talk to OpenAI’s API shape. OpenRouter speaks that exact shape. So you just point the OpenAI client at OpenRouter’s URL, hand it an OpenRouter key, and OpenWebUI thinks it’s still talking to OpenAI — except now the model picker is suddenly populated with everything OpenRouter offers.

The second is 127.0.0.1:3000:8080. The container is not on the public internet. It’s bound to loopback. The only way to reach it is from inside the machine — or from inside the tailnet.

The Tailscale part is the unlock

Without Tailscale this would be a local-only toy. With it, it’s a private app I run on my own box that I can open from any device I own, anywhere in the world, with no port forwarding, no DNS, no Cloudflare tunnel, no reverse proxy I have to think about.

One command:

tailscale serve --bg --https=9000 http://127.0.0.1:3000

That gives me https://brett.tailfa0379.ts.net:9000 — a real HTTPS URL, with a valid cert, that only works for devices on my tailnet. Phone in a coffee shop, laptop on hotel wifi, iPad on the couch. Same URL. Same chat history. Same bookmarked conversations.

What I gave up. What I got.

I lost the things ChatGPT Plus bundles for the price: the iOS app’s voice mode, the Sora integration, the custom GPT marketplace, the macOS app’s screen capture. Those are real. If you live in voice mode, this isn’t your setup.

What I got instead:

  • One UI, every model. I can open a chat in GPT-4o, fork it to Claude Opus to get a sharper second pass, then send the result to Gemini for a long-context summarization step. Three labs, three tabs, one conversation tree.
  • A model picker that includes models the consumer apps don’t ship. DeepSeek-V3 for cheap reasoning. Qwen for translation. Llama for “I don’t want to send this to a US lab.” Grok if I want it. Open-weight stuff alongside frontier stuff.
  • Bills that follow what I actually used. Some months are $4. The month I dumped a 90k-token transcript into Gemini twenty times was $31. Still a third of three subscriptions, and I got the work done.
  • A search box that searches across every chat I’ve ever had with any model. ChatGPT’s history is ChatGPT’s. Claude’s is Claude’s. Mine is mine.

The chat UI was never the moat. The chat UI is fifteen minutes of Docker.

— The realization that closed the loop

The part nobody tells you

OpenWebUI has a settings page that lets you add multiple base URLs. So if I want to keep my Anthropic key separate from my OpenRouter key — or wire a local Ollama install for offline models — they live side by side in the same picker. Two API roots. Twenty models from each. One sidebar of chats.

That’s the move. OpenRouter for the breadth, a direct Anthropic or OpenAI key for the one model you use most, and an Ollama instance on the same box for the times you want zero network calls. Three sources, one UI, still no subscriptions.

What this changes if you do it

Three things, in order of how much they surprised me.

One: the consumer chat apps stop feeling like products and start feeling like distribution channels. The product is the model. The UI is fifteen minutes of open-source code. The subscription is a packaging decision.

Two: model-switching becomes free. Not in dollars — in friction. When swapping models is one dropdown instead of three tabs, you swap constantly, and you start to notice which one is actually better for each kind of task. The taste you develop is yours, not the marketing team’s.

Three: the family/team version is trivial. OpenWebUI is multi-user out of the box. Invite your partner, your team, your kids. Same models. One bill. Per-user history. The “ChatGPT for the household” tier costs zero per seat.

If you’ve been paying for two or three subscriptions and didn’t realize they all funnel through the same kind of API call, this is the post that should bother you. The chat UI was never the moat. The chat UI is fifteen minutes of Docker.