Own your stack

Prefer software you can run, read, change and move. Use other people's platforms when they help, but build so that no single provider can hold you hostage. Open source and self-hosted is the ideal; adapters make the rest safe.

1. The Stallman starting point

Richard Stallman has argued for decades that users should control the software they depend on: free to run it for any purpose, study how it works, change it, and share it. Our reading of that idea is simple: if you can't see inside a tool or leave it, it controls you more than you control it.

2. But don't go full Stallman

We take the goal, not the absolutism. A proprietary service isn't evil for being proprietary. Hosted AI models, a CDN, a payment processor or a tunnel like ngrok can save weeks of work. The problem is never using a service; it's being unable to stop using it.

3. Open source first, self-hosted when it fits

When choosing a tool, go in this order:

Open source, on our own machines: the ideal, as long as it runs well on the hardware we have. PostgreSQL, SQLite, Redis or Valkey, Puma, Caddy or nginx, and local models through llama.cpp or Ollama.
Open source, hosted by someone else: fine, because we can take it home later.
Proprietary, behind an adapter: fine when it clearly earns its place and we can swap it out.
Proprietary and woven through the code: avoid.

4. Stay platform agnostic

Write software that runs on any Linux box, not on one vendor's runtime. Store data in formats anything can read: plain files, SQL, JSON, Markdown, HTML. Talk over open protocols like HTTP and SMTP. Ruby helps here: the same code runs on a laptop, a home server or any cloud.

5. Put every provider behind an adapter

An adapter is one small interface your code talks to, with one class per provider behind it. The rest of the app never knows which provider is in use, so switching is a one-line config change. Rails is built this way already: Active Storage (disk, S3, others), Active Job (Sidekiq, Solid Queue, others), Action Mailer delivery methods and cache stores are all adapters. Copy that shape for your own integrations:

class Agent
  def initialize(adapter) = @adapter = adapter
  def ask(prompt) = @adapter.complete(prompt)
end

class ClaudeAdapter
  def complete(prompt) = "Claude: #{prompt}"   # call Anthropic's API here
end

class LocalAdapter
  def complete(prompt) = "Local: #{prompt}"    # call a self-hosted model here
end

agent = Agent.new(ENV["AGENT"] == "local" ? LocalAdapter.new : ClaudeAdapter.new)
agent.ask("Summarize this diff")

6. Play providers against each other

Once two providers sit behind the same interface, you can compare them on the same task, send each job to whichever is cheapest or best at it, and fall back when one is down or changes its prices. That's how this project treats AI coding agents: Claude Code, Codex and Kimi are interchangeable workers, not a marriage.

7. Keep the exit open

Before depending on a service, check that your data comes back out in an open format. Back it up somewhere you control. If leaving would lose data, fix that first.


Provided as is, for information only, with no warranty and no liability. Not legal or professional advice. Security and radio material is for authorized, lawful use only. Full disclaimer.

Visits are logged on our own server: IP address, browser and device details, and pages viewed. We use them to understand traffic and spot attacks, and never share or sell them.