← All lab notes

Home assistant architecture

An always-on AI home assistant: what should run on your server?

A home server does not need to be a miniature AI datacenter to become useful. Its best role is often to remain awake, close to your data, and in control of what happens next. The language model is only one component—and it does not have to run on the same machine.

The useful product is the assistant, not the local model

“Local AI server” makes the model sound like the whole product. That framing creates the wrong test: can this NAS run the largest model, and is it as fast as a hosted service? For an ordinary home server without a substantial supported GPU, the honest answer is usually that it can run some quantized models, but not with the capability and responsiveness people expect from the strongest hosted assistants.

An always-on home assistant is a different system. It watches for approved events, gathers local context, chooses a narrow tool or model, asks for approval when needed, performs an action, and records what happened. Most of those responsibilities benefit more from reliability, storage, and network proximity than from raw inference speed.

That makes a home server a strong control plane even when a cloud API supplies some of the reasoning. The server stays valuable because it owns the workflow and the data boundary instead of being reduced to a slow chat box.

What belongs on the always-on server

Keep the durable parts at home: schedules, webhooks, device events, document indexes, household preferences, automation state, audit logs, secrets, and the allowlist of actions the assistant may take. These are the pieces that need to survive a laptop closing or a cloud conversation ending.

The server should also decide what context is necessary for each job. A calendar-summary workflow may need today’s appointments and travel time, not an unrestricted copy of every calendar. A document assistant may retrieve three relevant notes, not upload the whole archive. Context selection is both a privacy control and a quality control.

Finally, keep side effects behind explicit tools. The model can propose a thermostat change, draft a message, or classify a new file. Deterministic code validates the proposal and decides whether it can run automatically, needs confirmation, or must stop.

event or schedule
→ collect the minimum approved context
→ choose rule, local model, or cloud model
→ validate a structured proposal
→ approve if the action is consequential
→ execute through an allowlisted tool
→ store the result and audit trail

What can realistically run locally

CPU inference is real, and projects such as llama.cpp support quantized models across ordinary x86 and ARM hardware. Quantization reduces memory use and can improve speed, but it also trades away some accuracy. Whether a model feels usable depends on the exact CPU, memory bandwidth, model size, quantization, context length, and workload. A vendor name or total RAM figure is not enough to predict the experience.

Small local models are most convincing when the task is narrow: classify an incoming note, extract fields from predictable text, route a request, rewrite a short passage, or decide which deterministic tool should be considered. They are less convincing when the assistant needs broad knowledge, long-context synthesis, difficult planning, high-quality coding, or consistently natural conversation.

A home server with a supported discrete GPU or a machine with high-bandwidth unified memory changes the boundary considerably. A typical storage-focused NAS does not. The right conclusion is not that local inference never works; it is that every local model needs a measured job description instead of being treated as a universal brain.

Use a deliberate local, cloud, and rules router

Start with deterministic code. If a temperature exceeds a threshold or a backup has failed, a rule is cheaper, faster, and easier to test than an LLM. Use a local model for bounded ambiguity involving private or routine data. Escalate to a cloud model only when the job needs additional capability and the selected context is allowed to leave the house.

The router should be visible in every run record. Store which path handled the request, which model and version were used, what context categories were included, how long it took, and whether a human changed the result. Silent fallback is dangerous: a local privacy promise is meaningless if the system quietly sends a failed request to the cloud.

Routing also keeps the architecture replaceable. You can test a better local model without rebuilding calendar access, notification delivery, or the approval interface. You can change cloud providers without moving the assistant’s memory and automation history out of the home.

fixed rule       → known, testable conditions
small local model → private classification or extraction
cloud model       → approved difficult reasoning
human             → irreversible, sensitive, or uncertain action

Build the first assistant around one recurring job

A general household agent is too vague for a first deployment. Choose one event with a clear output: prepare a morning brief, triage documents added to an inbox folder, explain a server alert, or draft a weekly household plan. Define what success looks like before choosing a model.

For a morning brief, the server could run at a fixed time, read only today’s approved calendar and weather inputs, create a structured draft, and send it to one private destination. The first version should not reschedule events, contact people, or browse arbitrary accounts. Those powers can be added individually after the read-only path is dependable.

Run the workflow without an LLM first wherever possible. That exposes missing permissions, unreliable inputs, and delivery failures before probabilistic output makes debugging harder. Then add a model only to the step that benefits from language understanding.

Treat permissions and failure handling as product features

An assistant that is always on is also always capable of making the same mistake repeatedly. Give each workflow a narrow service identity, minimum data access, an action budget, a retry limit, and a kill switch. Do not place a general administrator credential in the same environment as an experimental model.

Keep internal services private by default. A private network overlay can provide remote access without publishing every dashboard to the internet, but access policies still need review. For containers, set resource limits and restart behavior intentionally; Docker notes that containers are unconstrained by default, so one inference workload can otherwise compete with storage and other essential services.

Record failures somewhere a person will actually see them. An invisible error in a container log is not a handled failure. The useful assistant should be quiet when all is well and precise when it needs help.

Measure usefulness before buying inference hardware

The first scorecard should track completed jobs, corrections, approvals, failures, latency, cloud spend, and maintenance time. If the workflow is not used or does not save effort, a faster GPU will not fix the product. If a cloud-backed prototype becomes valuable and inference cost or privacy is the limiting factor, then local acceleration has a concrete business case.

Benchmark the exact prompts and inputs from the real workflow. Compare a deterministic baseline, the smallest acceptable local model, and the cloud model you would otherwise use. Include cold starts, long inputs, malformed outputs, and recovery after a restart. Average tokens per second alone does not reveal whether the assistant completes the job correctly.

This is the architecture I am pursuing for the home lab: an always-on server that owns the assistant, with local inference as one replaceable capability rather than the identity of the whole system. Future build logs will replace these design decisions with measured results as each component goes live.

Follow the lab.

See what is running on the workbench, or suggest an always-on assistant workflow worth testing.