Skip to content

System Design - Engineering POV

Building a Personal Knowledge Hub

Sep 2026


A personal automation project rarely announces the moment it becomes a system.

It may begin as a script, a quick experiment or a small collection of utilities built to eliminate some repetitive work. That was how this particular project began for me. I wanted to create some automation to extract useful information from some bookmarks, and use that elsewhere.

The early goals were simple: Get information to flow from one place to another, enrich it along the way and reduce the amount of manual effort required to do it repetitively. The first version did exactly that. And, that was enough for a while. Then the project became useful enough that I started depending on it.

Once a workflow matters, it is no longer enough for it to work on a good day - it needs to behave predictably in most situations. And, it develops legs when you start thinking about what else can be done, now that you're done with the initial ask.

That is the point when a personal project starts transforming from a collection of working scripts to a purpose-built piece of infrastructure.

From useful automation to connected workflows

The early work grew incrementally and in a somewhat disjoint manner. One workflow handled saved material. Another enriched notes. Another helped prepare content for later use. A separate utility dealt with backups. Each seemed like a reasonable response to a specific need.

The difficulty was not in adding another script. It was in the relationships between them.

What should happen first? Which output could be trusted as an input to the next stage? What should happen if one stage completed and another failed? How could I tell whether a later run was processing new material or repeating old work? These questions were not part of the original idea, but they became unavoidable as the project expanded.

This is one of the less obvious costs of automation. Every successful shortcut creates a little more responsibility. Once a process is repeated regularly, its assumptions need to be made visible. Once several processes depend on one another, the boundaries between them need to be deliberate.

The hidden cost of success

The project gradually accumulated the familiar symptoms of a growing system: duplicate processing, stale state, partial runs, unclear logs and small differences between how a task behaved manually and how it behaved on a schedule.

None of these problems was especially dramatic. That was part of the challenge. They appeared as small annoyances, occasional inconsistencies or questions that took too long to answer. But together they created uncertainty.

Had the workflow completed? Had it changed anything? Was it safe to run again? Was a failure caused by the input, the network, the model, the environment or my own assumptions?

The more I used AI-assisted coding, the more quickly I could churn out another implementation. But speed made the need for judgment more obvious, not less. A generated function could be perfectly plausible and still fit poorly into the larger system. A new feature could solve the immediate problem while quietly creating another state to track or another edge case to recover from.

The hard part was no longer writing code. It was deciding what the system should promise, and what it should not.

The project timeline

June 2026 -> Personal automation workflows begin
Late June -> Integrating more sources and complex workflows introduces challenges
Early July -> Pipeline hardening adds status tracking, locks and failure handling
Mid-July -> Enrichment gains batching, metadata and backlog handling
Late July -> The codebase is refactored into functional engines and utilities
Early August -> Related functionality is consolidated into the canonical project
Mid-August -> Visual navigation and connected views make the collection easier to explore
Late August -> The project moves to native Linux and local scheduling
Early September -> A central orchestrator unifies all the key workflows
Present day -> Scheduled runs, backups and selective automation now support a human-guided engine

When reliability becomes a feature...

The next step was not to make the project more complicated for its own sake, but to resolve inter-dependencies and make key assumptions explicit.

Runs needed clear boundaries. Processing needed sensible limits. Repeating a successful job should not create unnecessary duplicates. A dry run should be genuinely safe, rather than a label attached to a command that still changes state. Logs should help answer what happened, not merely prove that something ran.

Backups were always part of the original design, but now they played a more critical role. So did locks, status tracking, incremental updates and recovery paths. These are not particularly glamorous features, but they are the features that make automation trustworthy.

Scheduled runs also needed to be made more robust. After all, a scheduled task is not just a command with a timer attached to it. It is a small operational agreement: what is allowed to run, in what order, how often, with what safeguards, and what happens when the surrounding environment is not ready.

Reliability is not the absence of failure. It is the ability to understand failure, limit its consequences and resume without losing confidence in the whole system.

... the project changes shape

At a certain point, the collection of utilities needed a clearer centre. Individual engines were reorganized around the work they performed, while a central orchestrator became responsible for running them in meaningful groups. This was more than a directory cleanup. It was a change in the mental model.

The central Orchestrator engine could now invoke specific stages of the workflow through various engines: Ingest, Enrich, Publish and Maintain. Each stage had a clearer purpose. The system could be run interactively when I wanted to inspect it, or through scheduled workflows when repetition was needed.

The distinction between previewing a change and applying it also became more important. So did the ability to run a small sample before processing a larger backlog. A new feature should have an obvious place to live. A failure should have a visible boundary. A future version should not require remembering every historical accident that led to the current one. With all these changes, the architecture became much easier to reason with, and one that I can depend on.

That is what good design looks like in a personal project: Not a grand, complicated diagram, but a structure that throws up fewer surprises with each iteration.

The environment matters

The project ultimately moved to a Linux-native environment that better suited the way I wanted it to operate.

The transition was partly technical, but it was also about ownership. I wanted the system to be understandable on the machine where it ran, use relevant tools as needed, have recoverable data and avoid dependence on a fragile series of manual steps.

After all, portability is not just about moving files from one computer to another. It is also about being able to understand what the system needs, how it can fail, and how it can be restored when it does. And, if those details exist only in memory, the system is portable in name only.

The details are less important than the principle: Infrastructure should suit the needs and constraints of its owner.

I am happy to report that (with a fair bit of effort and ample assist from AI tools) I was able to successfully migrate the entire setup to its new home, where it now runs smoothly on a multi-device setup.

Where it stands today

Somewhere along the way, my little automation project became a personal journey in the engineering required to make any system dependable...

A script answers the question, "Can this be done quickly and effectively?". A system has to answer a much harder one: "Can this engine keep running in a dependable manner, even when no one is watching it?"

That 'Systems Design' approach has always informed the way I have steered Technology projects in my past roles, and continues to do so. It has also made me slower in the moments that matter, and more suspicious of impressive shortcuts without clear boundaries.

The repo now includes a central orchestration engine, separate workflow stages, scheduled maintenance, backups, visual ways to explore the material and a growing body of documentation. It is considerably more capable than the collection of experiments from which it began. It is also more deliberate.

Some work remains manual because manual review is still the right choice. Some workflows are scheduled only after they have been tested carefully. Some ideas remain pending because adding them would increase the operational burden more than the value they provide. That restraint is not a sign that the project has stopped growing, but a part of its evolution.

In the end, the true measure of a personal system is not how much it can automate, but how it can reliably help the users who interact with it.


System Design - User POV - A business user's view of this project



This project captures ideas, decisions, and lessons I’ve learned while building with AI. It aims to help non-technical users understand and use these tools effectively. I also use AI at times to improve or refine the content.

Readers should use the commands and instructions here with care. The creator accepts no responsibility for system damage, data loss or other consequences resulting from their use.