Local-first AI: when it's worth the constraint
Why running everything on a CPU and 16GB of RAM ended up being the right choice for an internal document extraction system.

Local-first AI feels like a step backward until you build with it for a few weeks.
Most tutorials assume you'll call a hosted model - OpenAI, Anthropic, Gemini. That works for a lot of products. It does not work for HR document workflows where the data can't leave the building. So I spent my Innodata internship building everything CPU-only, 16GB RAM, no outbound calls. Here's what I'd tell someone considering the same path.
What you give up
You give up the absolute frontier of model quality. There's no way around that. A local 7B model is not going to match GPT-4 on hard reasoning tasks. If your problem requires that level of capability, local-first is the wrong fit and you should stop reading.
What you gain
You gain predictability. The model doesn't get deprecated. The pricing doesn't change. The latency doesn't fluctuate based on someone else's outage. For a tool that has to run reliably as part of a daily workflow, those properties are worth more than peak quality.
You also gain better task design. Local models force you to break work into smaller, more deterministic steps. That's annoying for the first week and then it becomes one of the better things about the architecture. When the model is smaller, you're forced to think about which parts genuinely need a model and which parts can be handled by ordinary code.
The pattern that worked
OCR for text recognition (PaddleOCR runs well on CPU). Deterministic parsing for the structured fields. A small local LLM for the few decisions that need natural language understanding. Validation logic everywhere. The model is the smallest part of the system, not the centerpiece.
When to choose it
Local-first AI is the right choice when data sensitivity is real, when the workflow has to run without internet, or when ongoing API costs would matter. It's the wrong choice when you need the latest model behavior and the team can absorb the cost. The honest answer is usually somewhere in between.