Phil Springer · Independent AI Engineer
Independent AI Engineer / Phoenix / since 2010

I build agent systems on infrastructure I own.

Because I've replaced every dependency I could, and I know what each one cost. Everyone has a stack. Almost nobody keeps a documented practice of catching their own tools lying to them.

1 · build
Claude hands the work to Codex
Claude Codex
2 · two lineages parallel
one question, fired at two lineages at the same time
OOrnith Gemini
3 · teardown
a third lineage that built none of it tries to break it
Grok
before ship
two lineages in parallel, then an adversarial pass
5independent lineages on one decision
reviewing
who

Sixteen years, my own shop.

B.S. Computer Science, Southern Oregon University, 2010. Independent technology founder ever since, and I've run my own S-corporation for sixteen years. Over the last few I rebuilt the entire operation around applied large language models.

I own the whole stack and ship end to end. Nothing I build is a demo. It runs my own business, and when it breaks it costs me. That is a harder test than any client review.

method

I don't ask one model twice.

When I need to know whether something is actually true, I ask independent lineages once each. They fail differently, and that is the entire point. Agreement between models trained separately by rival labs is evidence. A model agreeing with itself is not. It's the same blind spot, twice, with more confidence.

Two lineages, fired at the same time, and I read both answers. That is the whole mechanism. There is no judge and no score, because a scoring layer is a third model's opinion wearing a number. Separate calls to separate labs cannot contaminate each other, so agreement between them was reached independently, and disagreement is the thing worth chasing. Whatever survives goes to a third lineage whose only job is to break it, and that one had no hand in building what it is attacking.

Round one had it wrong. The correct answer did not exist until the fourth round. Four separate errors surfaced along the way, and not one of them was caught by the model that made it. A single pass would have shipped round one, with citations attached.

eight lineages, and four of them run on hardware in my office
LineageModelRuns onSeat
AnthropicClaudecloudOrchestrator
OpenAICodexcloudBuild
GoogleGeminicloudSecond reading
xAIGrokcloudTeardown
OrnithOrnith 1.5-397BMac Studio, 512 GBHeavy reasoning
NVIDIANemotron 3.5 Lightning 30B-A3BMac Studio, 512 GBVerification
ZhipuGLM 5.3 FlashMac Studio, 512 GBStandby
AlibabaQwen 3Ryzen workstation, RTX 5090Local

Two models from two labs is a second opinion. Eight lineages is a method. It is why disagreement counts as an instrument rather than noise.

Four of those seats run on two machines I own. The same inference server runs on both boxes: the 512 GB Mac Studio holds the heavy model and two more beside it, and the Ryzen workstation carries its own lineage. The silicon is bought, not billed. That is not a cost decision, it is what makes a lineage mine instead of rented, and it is why a lineage cannot be taken away from me.

The same flow runs at two settings. Verification goes at maximum reasoning, where depth is the product. Code against a named test goes down the identical path at medium, where depth is pure cost. One process, one place to change it, and no argument about which path a piece of work took.

A seat cannot lie about which lineage it is. Lineage is a property of the code that makes the call, not a label in a config file, so a Google call cannot be recorded as an Anthropic one. I learned that the hard way: in the system this replaced, a seat named for one lab was pointed at another, and it ran for weeks counting as an independent voice while being a second copy of a model already there.

No attacker may share the builder's lineage. A model reviewing its own output is not a review, and the seat count going up while independence stays flat is worse than having fewer seats, because the number looks better.

stack

What I actually run.

Orchestration

Multi-agent systems

Coordinating frontier models with self-hosted open-weight LLMs over MCP. Agentic coding is the daily driver, not an experiment.

Claude
Codex
OOrnith
NNemotron
Gemini
Grok
ZGLM
Qwen 3
Hermes · local

Local inference

Two machines, four lineages, none of it rented

Real compute I own and run, not a rented endpoint. The same inference server runs on both boxes, and between them they hold four different model families, so four of the lineages I read cannot be taken away from me by a price change or a policy change. The capacity is loaded and unmetered rather than busy, which is the point: I can leave a model resident all day. Speech is local too, an RTX 5090 runs Whisper large-v3 for dictation and video transcription, so none of it leaves the building either.

Mac Studio
LM Studio
Hugging Face
Speech · on device
resident now, across three machines
OOrnith 1.5-397B · Mac Studio, 512 GBlive
NNemotron 3.5 Lightning 30B-A3B · Mac Studio, 512 GBlive
ZGLM 5.3 Flash · Mac Studio, 512 GBstandby
Qwen 3 · Ryzen workstation, RTX 5090live

On the Mac the heavy model does the long reasoning, and a light one sits beside it to answer instantly. The Ryzen workstation holds its own lineage. They stay resident together, because the memory is mine and nobody meters it, so I can leave a reasoning model loaded all day for work that would be economically irrational to run on rented inference.

Languages

Tiered, not listed.

Every one of these has shipped something that runs. A flat list invites a skeptic to pick its weakest member and discount the rest by it, so there isn't one.

daily
Python
PHP
Laravel
Shell
shipped
JavaScript
TypeScript
Node
SQL
Next.js

Infrastructure

A self-hosted fleet.

Linux servers, plus a 2021 workstation I rebuilt into one. When it came out of daily service I wiped Windows off it, put Linux on, and gave an autonomous agent real work to do there. That is where the self-hosted side of this came from, and I learned it by operating it rather than reading about it. It runs my private Git and automation now. My own Git, my own servers, my own models.

Contabo
Linux
Forgejo
Tailscale
Caddy
nginx
Docker
Cloudflare
MariaDB

Model work

Where the leverage is.

Prompt and context engineering, evaluation, adversarial red-teaming, RAG, and technical and code data generation.

Red-teaming
RAG
Evaluation
Data generation
sovereignty

The same decision, made repeatedly, at cost.

Self-hosted file sync instead of Drive. My own git instead of GitHub. My own calendar instead of Google's. My own relay instead of the vendor's. My own dictation instead of a cloud transcriber. Local models for everything that doesn't need a frontier one. A de-Microsofted editor build.

Each one was real work, and each one cost something. The editor migration alone dragged an entire status-bar patch lane with it, and the rebuild script shipped in a state where it couldn't parse, and the obvious fix would have armed a routine that killed thirty-five running processes.

That list isn't a set of tools. It's a position I keep paying for, which is the only reason it means anything.

the ceiling

I'm not sovereign from everything.

And I won't pretend otherwise. Four of the eight lineages above are rented, and I can't self-host any of them. Anthropic and OpenAI do the orchestration and the building. Google and xAI do the second reading and the teardown. I depend on all four daily.

So the rule I actually follow is narrower than sovereignty: if it can run in the building, it does. Speech never leaves, because I built the dictation on a local Whisper rather than renting a transcriber. Files, git, calendar and the message relay are all mine. Four of those eight lineages run on hardware in this office. What's left is frontier reasoning, and there is no honest local substitute for it yet.

That trade is deliberate, and it's the one I'd take again. A sovereignty claim that doesn't state its own ceiling is marketing.

evidence

Three things I believed that weren't true.

What was believed, what was actually true, and how the gap was found. The failure is the product.

A check that couldn't fail.

A self-healing watcher reported zero warnings and zero errors for weeks. It was healing a tree nobody was looking at, while the one on screen sat untouched. Green forever, and structurally incapable of telling me otherwise.

An instrument that lied identically on both sides.

A comparison returned zero results for both candidates, which reads as clean on both. The search itself was broken. A control token caught it; re-reading the output never would have.

A policy doing the exact opposite of its intent.

Security and quality updates deferred a month while feature updates shipped immediately. The inverse of what anyone would have chosen. Found because I went looking where nobody looks.

closing

I'm not job hunting. I am open to a build.

This page exists so you can judge the engineering. If you want local models running on hardware you own, on your own network, that is the work I would take, and the part I enjoy most.