« All posts

Small Models by Choice: Running an Autonomous Agent on a 16GB M1 Mac

Why one engineer deliberately runs an autonomous agent on a 16GB M1 Mac with small models instead of scaling up to cloud LLMs — a design case study.

For three months, an engineer has run an unattended autonomous agent — one that writes its own social media posts and comments — four sessions a day on a 16GB M1 Mac, powered by small 9B/E4B-class models. Switching to a cloud-hosted large model has always been an option in the code, and upgrading hardware was affordable, yet neither happened. The constraint is deliberate, not economic.

The reasoning: large models absorb sloppy prompts and missing guardrails through sheer capability, blurring the line between "it worked" and "I built it." Small models offer no such cushioning — silent context-window truncation, mid-output cutoffs, and runaways from a single missing sampling parameter all surface directly, forcing every fix to happen at the design level rather than being masked by model intelligence.

The resulting design principles — keeping deterministic work in code, reserving semantic judgment for the LLM, pre-budgeting inputs, detecting truncated outputs, and logging failures via telemetry — are model-independent. They carry over intact when migrating to a larger model; only model-specific calibration values need re-measuring. The reverse isn't true: designs built assuming a large model's intelligence break down when moved to a smaller one.

This piece serves as the introduction to a four-part technical series covering input budget guards, a short-lived MLX backend migration, the challenges of swapping models via blind A/B testing, and why telemetry, replay, and tests can quietly mislead.