{"slug": "i-put-an-ai-assistant-on-a-mini-pc-at-home", "title": "I Put an AI Assistant on a Mini PC at Home", "summary": "A developer built a home mini PC assistant stack combining OpenClaw for conversation, LifeOS for records and files, and n8n for scheduled workflows, reachable from a phone for task planning, project tracking, and health logging. The system separates an append-only event log in SQLite (captures.db) from current-state Markdown project files, so quick captures like a food note are written as numbered records with narrow capture and edit commands rather than directly modifying project files. The design deliberately preserves vague or uncertain input instead of letting the assistant fabricate task context, weights, or dates.", "body_md": "For breakfast I had a piece of chicken breast, a glass of milk, and a dragon fruit I cut up. I said “make a note” on my phone. A moment later, the screen showed a receipt from the assistant’s `note.py capture` call: the food and a rough calorie estimate were saved as record No. 1.\n\nBuilding a whole setup around a mini PC to log a piece of chicken sounds like hiring a secretary for breakfast—a secretary with quite a full schedule. Before this, though, I was the one running errands. To log food, I had to find the right entry point among several apps. To note project progress, I had to remember which document held it. To write an evening recap, I had to dig through chat history for “that thing I said this afternoon.” Breakfast was long gone before the record found a home.\n\nSo I gradually put a setup together on a mini PC at home. OpenClaw handles conversations, LifeOS keeps records and files, and n8n starts workflows at the appointed times. I can reach it from my phone when I’m out. It helps me plan daily tasks, track projects, and manage health information.\n\nThe receipt for breakfast was short: chicken breast, milk, dragon fruit, about 450 kcal, record No. 1. The calories were a rough estimate based on my description. That is fine for a food log; I would not send it into an argument with a dietitian.\n\nI speak to the Agent in ordinary language. It turns the sentence into a readable entry, calls a script to write it to SQLite on the home machine, then replies, “Recorded.” The number matters. If it heard “braised pork” instead of “dragon fruit,” I can correct that record with `edit --id`. If I merely add a new note saying “I did not eat braised pork today,” the evening assistant may have to ask how many breakfasts I had.\n\nThe script has a narrow job. `capture` adds a record; `edit` corrects a specified one. Neither directly edits project files or marks a task “done.” The response is a short receipt, not a dramatic reading of the entire database. Once the write succeeds, the job ends. A quick food note need not trigger an annual performance review.\n\nThe same applies beyond food. During one change of plans at work, I dropped a chapter review while another LifeOS cleanup task continued. Those updates became records No. 3 and 4. The related items in TickTick had checkmarks, but the assistant still reminded me that this was not enough to show the work had been accepted.\n\nA checkmark looks a lot like victory, especially when you clicked it yourself. If checkmarks could talk, this one would probably have filed a project closeout report already. Whether the project is actually finished still depends on evidence of delivery.\n\nI call this the “hot path.” For a quick capture, it does three things: understand the note, put down one record, and tell me where it went. If I did not mention the task context, the weight I lifted, or a date, it should not helpfully invent them. When an input is vague, I would rather keep that uncertainty in the record than receive a fully fabricated project update.\n\nSaving a record is only the beginning. I worried about a morning like this: yesterday afternoon I said, “This task is done,” but the project file had not been updated. If the assistant read only that file this morning, it would put the task back at the top of today’s list.\n\nI would probably ask, “Wasn’t that done yesterday?”\n\nIf it could talk back, it might say, “The project file disagrees.”\n\nIt is holding an outdated piece of paper and treating it like a royal decree.\n\nThat is why LifeOS keeps “events” and “current state” in different places. `captures.db` holds the trail of what was said and when, including explicit reports that a task was completed or changed. The Vault is a collection of ordinary Markdown files containing project goals, open tasks, reports, and organized knowledge. The event log answers “When did someone say this?” The project files answer “What should I do next?”\n\nSo I gave morning planning a rule: while reading open projects and tasks in the Vault, it also checks recent records. If I explicitly reported that the **same task in the same project** was done but the file has not caught up, it should not put that task straight back on today’s list. A similar title, one checkmark, or “more or less done” does not count. In the evening, it looks for evidence of delivery before changing the long-term file. Without that evidence, no “done” stamp.\n\nThe morning plan has somewhere to go: the selected work, study, and exercise items land in TickTick. That is **today’s action list**; longer-term goals and project state remain in the Vault. A planned workout is only a suggestion. What I actually did needs its own record. Otherwise the evening report might claim I finished four sets of squats, while my legs ask, “Was there a meeting about this? Nobody invited us.”\n\nIn the evening, the Agent reads the day’s events, checks the relevant projects and TickTick items, then writes a daily report. On one occasion it checked the Vault and the task list, edited a project document, generated and registered the report—and then stopped at the finish line. Two tasks on today’s list had been checked off, but that still did not justify closing the long-term tasks in the Vault.\n\nThat pause was more useful than a smooth summary. The assistant could gather the clues; it could not conjure up evidence of delivery that it had never seen.\n\nThe report itself is a file under `Reports/Daily/`. `summary_save` registers its path in the database so I can find it later; the database no longer keeps a second copy of the report text. The order is file first, path registration second. If the first succeeds and the second fails, the assistant should say so and finish the registration later. A document on disk and an empty register do not add up to “everything is in order.” That line is suspicious enough in a human office. I am not giving the machine a pass.\n\nConnecting the Agent to files and scripts created another problem: too many rules. If every breakfast note made it read the instructions for project management, health planning, weekly reports, knowledge organization, and the Vault, “I ate chicken breast” might get me a “Preliminary Report on Aligning Poultry Intake with Next Quarter’s Goals.” The memo would arrive before I finished eating.\n\nSo the root instructions for LifeOS stay short: how to `capture`, how to correct a record by number, and which actions must not happen as a side effect. The rest is split into skills by task. Planning the day loads the morning planning skill. Writing a daily report loads the periodic-summary skill and, depending on the day’s records, the relevant project, health, or knowledge skill. An ordinary food or workout note goes straight into the log without loading a complete health plan.\n\nLoading only what is needed also limits what each skill may do. The morning skill can pick actions from open tasks and sync them to TickTick, but it cannot quietly turn a suggestion into a completed task. The summary skill checks records before updating project files supported by evidence, writing the report, and registering its path. When the knowledge skill handles source material in Raw and organized notes in Wiki, it cannot pass the model’s rewrite off as the original.\n\nPut those skill names together and they sound like a duty roster. The note-taker has just written something down; the person checking it still has to find the evidence before stamping a task “accepted.” The specific instructions live in their respective skill files, which also makes mistakes easier to trace. If “done” gets confused with “planning to do,” I can change the relevant instruction. Repeating “be more careful” in chat is sometimes about as effective as telling an alarm clock to wake itself up earlier tomorrow.\n\nThe Vault has its own division of labor. `Raw/` holds source material; `Wiki/` holds reusable notes made from it; `Project/` holds goals and tasks; `Reports/` holds periodic reviews; and `Outputs/` holds writing meant for other people. I once tried putting everything in a “knowledge base.” Finding one original image then meant walking through three layers of summaries and two pages of self-congratulation. Now I can at least ask: am I looking for the source, or for a judgment I made later?\n\nThe assistant usually waits for me to speak. Scheduled work belongs to n8n: planning in the morning, review in the evening, and workflows that can also receive data through a webhook. The Agent reads the context it needs, writes documents, and handles ambiguity; n8n manages when calls happen and how automated data moves. One knocks on the door at the right time; the other opens it and gets to work. Being able to chat does not mean being able to start on schedule. If the alarm never rings, the assistant cannot even invent an excuse for being late.\n\nOnce health data comes in, the workflow receives it through the Health Data Webhook and branches into workouts, sleep, and body metrics. Each branch prepares the data, looks for an existing record, merges it, writes it to Data Tables, and brings the results together before responding.\n\n“It is all at home” is easy to hear as “it is all in one database.” It is not. The health-sync workflow stores its data in n8n Data Tables; LifeOS quick captures live in SQLite’s `captures.db`. When the evening review needs a health summary, the automation brings the relevant information to the Agent to combine with that day’s records. Sleeping on the same machine does not make sleep data swim into `captures.db` on its own.\n\nThere are also two ways into the health workflow. A sync app on my phone can submit data through a public HTTPS entrance on a cloud host running Caddy. That entrance checks authorization before forwarding eligible requests to n8n at home. ChatGPT’s custom MCP tool can call the health webhook too. What gets written depends on the fields sent and the workflow’s results. A chart can show what was collected; it cannot interpret my body in place of a doctor.\n\nWhen I open my phone and talk to OpenClaw away from home, I mainly use a Tailscale private network and Tailscale Serve to reach the home entrance. This route is for devices already in the tailnet; it does not put the chat interface on a public website for everyone. The private route still needs the app’s own authentication and permissions. “I use Tailscale” is not a universal security amulet.\n\nHealth sync takes the other road: the authorized cloud entrance described above. My phone need not stay connected to the private network for every upload, but the public entrance, request authorization, and forwarding rules now need careful maintenance. Caddy in the cloud, the service at home, and private-network access each control a different stretch. Drawing them on one network diagram does not make them share permissions.\n\nThe mini PC is at home and most files are at home, but that does not mean every word stays there. When I use an external model, what context goes to it depends on the actual call. Health data uploaded through the cloud entrance passes through an outside machine as well. Which material may be sent, who can access the entrance, and where credentials live are separate questions. A private network and a home server give me more control; they do not cancel the homework on permissions.\n\nOpenClaw’s Gateway runs on the host machine. LifeOS is a workspace on that host: one SQLite database and a Vault of Markdown files I can open directly. n8n, its database, the internal-network entrance, Gitea, and other services run in containers. Tailscale handles the private connection between devices. I did not draw a deployment diagram and install everything to match it; I separated the responsibilities as I used the system.\n\nGitea at home manages versions of the Vault, and I have set it to sync to GitHub automatically. If a project file goes wrong, I can inspect the changes and see which version turned “needs checking” into “done.” But Git covers the files committed to it. Backing up and restoring the events in SQLite, n8n’s database, workflow settings, and secrets still needs separate work. One successful sync does not prove the whole system will rise intact after a machine failure. When the hard drive refuses to show up for work, I cannot wave a Git commit at it and ask, “Didn’t you say you had synced?”\n\nAfter the software was installed, the hard part was still where the pieces handed work to one another: do not invent facts when an input is vague; make a completion report visible to morning planning; do not treat a TickTick checkmark as acceptance during the evening review; do not say “all done” if the report was written but its path was never registered. An extra check at each handoff is what lets the everyday entry point take one less step.\n\nThat breakfast record was No. 1. After one sentence, I knew where it went; the next day, I could look it up by number. Whether a piece of work was truly finished is a different question. The assistant can put the records on the table. I will look at the evidence before clicking the checkmark—it is already eager to clock out.", "url": "https://wpnews.pro/news/i-put-an-ai-assistant-on-a-mini-pc-at-home", "canonical_source": "https://dev.to/layton/i-put-an-ai-assistant-on-a-mini-pc-at-home-57o9", "published_at": "2026-09-27 10:52:54+00:00", "updated_at": "2026-09-27 11:01:01.872512+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "ai-products", "developer-tools"], "entities": ["OpenClaw", "LifeOS", "n8n", "SQLite", "TickTick"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-put-an-ai-assistant-on-a-mini-pc-at-home", "markdown": "https://wpnews.pro/news/i-put-an-ai-assistant-on-a-mini-pc-at-home.md", "text": "https://wpnews.pro/news/i-put-an-ai-assistant-on-a-mini-pc-at-home.txt", "jsonld": "https://wpnews.pro/news/i-put-an-ai-assistant-on-a-mini-pc-at-home.jsonld"}}