hnq.me

Story

A long road toward technological independence.

I am not writing this story to make my life look larger than it is. I am writing it because there are people who still like to read slowly, people who care about the road behind a product, and people who know that technology is never only made of code. It is also made of hunger, doubt, debt, ordinary work, quiet rooms, unfinished attempts, and the small faith that if you keep learning honestly, something real may eventually appear.

This is the fuller version of my road. It is not a clean biography. It is a trace of how a self-taught developer from Vietnam moved through Blogger themes, C#, cross-platform dreams, failed startup hopes, delivery work, affiliate systems, self-hosted servers, Go, browser runtime JS, bytecode, and finally Kitwork.

The center of it is simple: I wanted to understand the systems I depended on. Not to control everything. Not to reject the world. Just to be less helpless in front of the tools that shape my life.

Some parts of this story are technical. Some parts are ordinary life. I keep both because they were never separate for me. The way I wrote code was shaped by the way I had to live. The way I thought about infrastructure was shaped by nights when I could not afford for things to break. The way I think about independence was shaped by years of learning what it feels like to depend on things I did not understand.


A small note

I do not think a true story has to make someone look successful. A true story only has to be honest enough that another person can feel the cost of each step. If this page has any value, I hope it is not the image of a person who built something, but the feeling that a long, imperfect road can still become meaningful when you refuse to abandon it.


The long version

01 / The first small question

It began with Blogger and a question: what is HTML?

Around 2015, after military service and while preparing for university again, I found programming through Blogger. That sounds small now, but at the time it was a door. I did not open a textbook and decide to become a developer. I touched a theme. I changed a color. I moved a piece of text. Then the page broke, and something in me became awake.

HTML was not yet a language to me. It was a strange structure behind the surface of a website. CSS looked like decoration, but it also felt like control. JavaScript looked like magic because the page could react. I did not understand much, but I understood one thing: there was a world behind what people saw, and that world could be changed by someone who was patient enough to read it.

That first curiosity was not grand. It was almost childish. Why did this box move? Why did this menu open? Why did this page load here but break there? I did not know the right words, so I searched badly. I copied snippets without fully understanding them. I refreshed the browser again and again. But every tiny result gave me a kind of proof: maybe I could learn this by touching it.

Many years later, I still think that was the real beginning. Not the first project. Not the first job. The beginning was the moment I stopped accepting the screen as a finished thing and started asking what it was made of.

That kind of beginning does not look impressive from the outside. There was no certificate, no mentor standing beside me, no clear title to give the effort. But it gave me something more important than confidence: it gave me a habit of looking underneath. I did not know it then, but almost everything I would build later came from that habit.

02 / Learning by rebuilding

C# made software feel real.

In university, C# became the first language that made software feel like something solid. Before that, the web had felt fluid and mysterious. With C#, I could build windows, forms, buttons, data tables, and small management systems. I built a shoe-store management application, and for the first time I felt the difference between code as an exercise and code as something another person might actually use.

I learned in an uneven way. I searched for examples, translated ideas from one context to another, converted code, broke things, fixed them, and slowly formed a sense of how programs breathe. There were many moments when I did not know if I was learning correctly. But I kept going because the act of rebuilding taught me what clean explanations often hide: a system is not understood by admiration. It is understood by taking it apart and paying the price of putting it back together.

People sometimes talk about self-learning as if it is romantic. For me, it was often lonely and messy. You do not always know whether the thing you are learning is important. You do not know which concepts will matter later. You only collect small pieces and trust that one day they may connect.

That period gave me an instinct I still carry: if I use something long enough, I eventually want to understand how it is made. I do not need to own every layer. But I need to know enough that the layer is not pure darkness.

My life before programming also mattered more than I understood at the time. I had been a student, then a soldier, then a student again. I had known the white shirt of school and the olive green of the army. I had known ordinary childhood days, games, rivers, internet shops, and the quiet confusion of a young person asking what kind of life he should build. None of that looked like a developer roadmap, but all of it gave me material: discipline, loneliness, patience, and the need to make something with my own hands.

There was also a quiet kind of shame in learning this way. When you teach yourself from scattered examples, you often feel late. You feel like everyone else has a map and you are walking through fog. You learn a concept today, then discover tomorrow that you misunderstood half of it. You rebuild something and realize the old version was naive. But that shame can become useful if it does not make you stop. It can become humility, and humility is a strong foundation for engineering.

I learned to respect slow understanding. Fast confidence breaks easily. Slow understanding becomes part of your hands.

03 / The cross-platform dream

I kept looking for one stack that could move everywhere.

From C#, I moved through WinForms, WPF, Xamarin, Firebase, Ionic, Angular, and PWA. The names changed, but the desire underneath stayed the same: I wanted one idea to travel across many places. Desktop, mobile, web, server, local machine, cloud. I was chasing a feeling before I had the technical vocabulary for it.

Cross-platform development was never only a matter of productivity to me. It was emotional. I came from a place where resources were limited, where being able to reuse knowledge mattered, where one person could not afford to rebuild everything from zero for every surface. The dream of one codebase was also the dream of giving a small builder more reach.

Later, when I began thinking about runtimes, bytecode, tenant isolation, and filesystem routing, I realized that the old cross-platform desire had not gone away. It had only moved deeper. At first I wanted UI to run everywhere. Then I wanted logic to become portable. Then I wanted the environment itself to become something I could understand and shape.

Looking back, I can see that I was always searching for a smaller surface between an idea and the place where it runs. Every extra layer felt like both help and distance. It helped me move faster, but it also moved the truth farther away. I did not know how to resolve that tension yet. I only knew that I wanted software to travel without becoming impossible to understand.

04 / Da Nang

A city, a startup attempt, and a dream that collapsed.

Da Nang gave me the first taste of professional software, long working days, and startup ambition. I worked with Angular. I saw how production code behaved when it had users, deadlines, and business pressure around it. I began to understand that software was not only a technical object. It was a social object too. It had clients, expectations, money, time, and consequences.

I also carried a fragile belief that I could build something large enough to change my life. That belief is hard to explain without making it sound naive. But when you are young and hungry, a startup is not only a company. It is an exit from a smaller version of yourself. It is a promise that your effort might become a door.

Then the attempt failed. The dream did not disappear in a dramatic moment. It became quieter. That kind of failure is strange. The world does not stop for it. You still have to eat. You still have to answer messages. You still have to go home. But inside, something rearranges itself.

I returned to Tam Ky with empty hands, with fatigue, and with a small flame I did not know how to explain. At the time, it felt like I had gone backward. Later, I understood that sometimes going home is not a retreat. Sometimes it is where the noisy dream becomes quiet enough to become real work.

Failure also taught me to separate the dream from the form it first appeared in. The startup failed, but the need underneath it did not fail. The need to build, to become useful, to create something that could stand outside my own head: that remained. When one shape broke, I had to learn not to bury the whole dream with it.

This was painful, but valuable. A person who has never watched a plan collapse may mistake excitement for direction. After Da Nang, I became more careful. I still wanted to build, but I wanted the work to be rooted in something deeper than the feeling of beginning.

05 / Returning home

By day I delivered packages. By night I wrote code.

After returning home, life became small but honest. I worked as a shipper. I earned little. I carried packages through ordinary roads, then came back and wrote code in the quiet hours. There is no glamour in that image, but there is truth in it. Some parts of a builder are not formed in a coworking space. They are formed in the gap between physical tiredness and the choice to open the editor anyway.

Those days changed how I looked at software. I stopped seeing code as something that belonged only to clean rooms, offices, or people with perfect paths. Software became a tool for survival. It could help someone sell. It could help someone organize. It could create a small income stream. It could make a lonely person less powerless.

Working outside software also made me more practical. I learned that the world does not reward complexity just because complexity is impressive. A tool has to serve life. If it cannot help a person move one step forward, its elegance is not enough. This lesson stayed with me whenever I built systems later. A beautiful abstraction is only meaningful when it returns something honest to the person using it.

The dream changed shape there. I no longer wanted only a startup. I wanted a system that could create value even when I was alone, tired, unknown, and without funding. I wanted to build something that did not require permission before it could begin.

In the spring of 2020, with very little money left, I looked at my family and began to understand how hard ordinary life really was. I did not need a beautiful speech then. I needed something practical. I built a Facebook page called Giao Vat Tam Ky, trying to create small local work and keep myself moving. It was not a grand product, but it was an honest attempt to survive without letting the dream die.

That period taught me a sentence I still feel in my body: an empty stomach does not lie. Passion is real, but life still asks for food, rent, family, and responsibility. When people talk about dreams, they often forget the physical weight of them. A dream is easier to praise after it succeeds. Before that, it has to survive ordinary days.

Delivery work also taught me rhythm. You learn distance, waiting, heat, rain, repetition, and the strange dignity of finishing small tasks. A package does not care whether you feel inspired. It has to arrive. Later, I brought that feeling into code. A feature does not become real because the idea is beautiful. It becomes real because enough small, unromantic steps are completed.

Those years made me less interested in pretending. I did not want a story that looked clean. I wanted work that could survive contact with life.

06 / Systems that create value

Affiliate, SEO, Samdy, and the discipline of small improvements.

Affiliate marketing was not only a way to make money. It was where I learned system thinking in the real world. Traffic, conversion, content, data, tracking, page speed, search intent, product feeds, small commissions, tiny bottlenecks: all of it mattered. Nothing was abstract. If the page was slow, fewer people stayed. If the title was wrong, search did not understand it. If the data was messy, the product felt weak.

Samdy became a living experiment. A price comparison website built with Go, SEO, and constant optimization. It taught me that a system grows not from one heroic rewrite, but from hundreds of small decisions that compound over time. One page. One query. One cache. One title. One schema. One performance fix. Alone, each change feels small. Together, they become a machine.

Underneath many of those experiments was Kitstack, my private platform. Samdy was not only a standalone website. The shortlink and tracking system was not only a small utility. Affiliate modules, landing pages, data tools, routing experiments, and customer-facing sites all grew on top of the same private foundation. Kitstack was where I tested ideas under real pressure before I had the language to explain them cleanly.

That period gave me a different kind of confidence. Not the confidence of knowing everything, but the confidence that if I could build, host, measure, and improve my own system, I could create a small economy around my own hands. I did not need the world to fully understand what I was doing before the work became useful.

It also gave me respect for boring details. Logs, redirects, indexing, sitemap structure, caching, uptime, small UI changes, and strange search behavior all became part of the craft. Later, when I built Kitwork, that respect for boring details mattered. A runtime is not only a clever idea. It has to serve pages, handle paths, cache safely, isolate tenants, and keep running.

SEO especially taught me patience. You can publish a page today and wait for the world to notice it later. You can improve something invisible and see the result only after time has passed. That kind of work is good for a builder because it reduces vanity. You stop asking only whether the work feels exciting today. You start asking whether it compounds.

Affiliate systems also taught me that software has to meet reality where reality is. The user may not care about your architecture. Search engines may not care about your intention. A slow server does not care how hard you worked. In that world, the truth is measured by behavior. Does it load? Does it index? Does it convert? Does it survive tomorrow?

With Samdy, that truth became concrete. I aggregated product data from large Vietnamese e-commerce platforms, wrote pages for search, seeded links manually in communities, and waited. Shopee, Tiki, Lazada, Accesstrade, product feeds, search intent, tracking links: these were no longer buzzwords. They became pieces of a working machine. My first commissions were tiny. One month could be only around 14,000 VND, another month 500,000 VND, later 1.7 million. But every click felt like a signal from the world: the system worked. It was small, but it was real.

Over time, Samdy grew from tiny commissions to meaningful monthly revenue and even reached the Top 100 e-commerce websites in Vietnam. At its peak, it could reach around 10 million VND a month. There was no advertising budget, no marketing team, no investor money. It was code, SEO, data, patience, and a lot of manual work. That success did not make me rich, but it changed my inner standard. It proved that a small builder, working quietly, could create value beyond his own room.

Then the cost of that growth appeared. At one point I was running Samdy and many other websites on a very small VPS: one CPU core, two gigabytes of RAM, and a small disk. Traffic grew, the server struggled, uptime suffered, and payment cycles did not move as quickly as infrastructure bills. Eventually the rankings collapsed with the system. That hurt, but it taught me a lesson no success could teach: growth without a strong foundation becomes another kind of dependency.

07 / The Firebase night

In 2018, one sleepless night taught me what dependency meant.

There is one memory I keep returning to because it explains more than a technical preference. In 2018, I was helping a friend with a small coffee shop he was building. During the day, we worked with the physical place. At night, I came home and continued writing software for it. It was the kind of season where life and code were not separate. The dust, the coffee, the screen, the deployment: all of it belonged to the same fragile attempt to make something real.

I do not want to decorate that memory with details that are not true. It was not my coffee shop, and it was not a clean startup story. It was simply a period when I was close to someone else's small place, helping where I could, then returning to the computer at night. That is enough. Sometimes the honest shape of a memory is more valuable than making it sound beautiful.

Then one night, the product was ready to launch and Firebase released an update. The deployment broke. The problem was not caused by my code, but the launch still could not move. I stayed awake the entire night trying to solve something I did not own. Around ten o'clock the next morning, another update arrived, the deployment worked again, and only then could I finally sleep.

On the surface, the issue disappeared. In life, it did not. That night stayed inside me. It was probably the first time I felt dependency not as an architecture diagram, but as a physical experience: tired eyes, a blocked launch, a tool changing outside my control, and a long night spent waiting for someone else's layer to become stable again.

I did not become anti-cloud because of that night. That would be too simple. What changed was deeper. I began to understand that convenience always has a hidden contract. When the contract is invisible, the cost appears only when something breaks. From that point on, I wanted to know more about the layers below me. I wanted fewer parts of my life to depend on systems I could not reason about.

08 / Self-hosting

Five years of keeping my own infrastructure alive.

Self-hosting changed my relationship with technology more than almost anything else. It forced me to learn servers, Linux, DNS, SSL, deployment, monitoring, backups, failure, and patience. It also forced me to face dependency honestly. When you keep your own services alive, you stop seeing infrastructure as a background. You begin to feel it as responsibility.

I remember nights when something broke and there was no team to call. No support desk, no senior engineer, no clean incident process. Just logs, terminal output, tired eyes, and the need to understand enough to bring the thing back. Those moments are frustrating, but they are also educational in a way that polished tutorials can never be. A server teaches by refusing to care about your confidence.

In 2019, I wrote Go for my first real-world project and was introduced to Ubuntu Server. I learned my first CLI commands and slowly fell in love with the feeling of operating infrastructure with my own hands. It was intimidating at first, but it also felt honest. A command either worked or it did not. A process either ran or it did not. A port was open or closed. The machine did not flatter me, but it taught me.

I do not think independence means avoiding every platform or refusing every managed service. That would be another kind of prison. To me, independence means knowing where the ground is. It means understanding enough that when a tool fails, changes, becomes expensive, or disappears, you still have a path.

Self-hosting also made me more honest about fear. There is a particular fear that appears when something is down and you are the only person responsible for bringing it back. At first, that fear feels like a weakness. Over time, it becomes a teacher. It shows you which parts of your system you never truly understood. It points to the next layer you have to learn.

This is one reason I care about infrastructure so much. It is not because servers are glamorous. They are not. It is because infrastructure reveals your relationship with responsibility. When the system is yours, even a small failure asks you to grow up a little.

09 / Golang

I chose Go because it felt honest.

Go did not attract me because it looked clever. It attracted me because it felt direct. One binary. Simple syntax. Clear deployment. Fewer rituals. A program could become a file, and that file could run. After years of chasing stacks that promised to do everything, this simplicity felt almost moral.

With Go, I could think about servers, templates, data, concurrency, routing, streaming files, and performance without needing a heavy ceremony around every decision. It did not remove difficulty, but it made difficulty visible. That mattered to me. I would rather face a visible problem than live inside invisible magic that only becomes visible when it breaks.

Go also matched my temperament. I like tools that leave room for the builder to think. I like systems that do not demand attention for themselves. Go felt like that: quiet, practical, sometimes strict, but reliable. Over time it became the language I trusted when I wanted to build foundations.

It also changed my ambition. Before Go, I often thought in terms of applications. After Go, I began thinking more seriously about engines, servers, protocols, and the invisible parts that make applications possible. A language can change the size of the questions you allow yourself to ask. Go made lower layers feel reachable.

Around 2020, I began treating my work less like a list of projects and more like a set of core problems I had to solve. DNS distribution. A root pointer idea, like a system-level root that could be called across a project. The difficulty of hierarchy and inheritance in Go. Routing, rendering, data flow, and the shape of a platform. I did not solve these problems because someone asked me to. I solved them because they kept standing between me and the kind of system I wanted to build.

I remember 2020 as a strange year of quiet joy. Life outside was uncertain, but inside the work I felt unusually alive. I was trying to solve four core problems in my own platform thinking: DNS distribution, Root Pointer, the Diamond Problem around hierarchy and inheritance, and the larger architecture that connected routing, templates, data, and modules. Maybe those ideas sounded too ambitious for one person. But they gave me peace because they gave shape to the future I wanted.

Some of those attempts looked ridiculous from the outside. I once spent nearly six months trying to make a DNS routing feature work for tenant/customer management. Six months for what could look like a single identifier on a screen. But that is the strange truth of infrastructure: the visible part is often tiny because the invisible part carries the real weight.

I also studied template engines and routing systems from many places: Shopify Liquid, ASP.NET, Angular Pipes, Vue and React routing ideas. I was not trying to copy their surface. I was trying to understand why different systems made different trade-offs. Every framework I studied left behind a question. Every question eventually became part of my own engine.

10 / Kit JS

Before Kitwork, I tried to understand runtime JS in the browser.

Kit JS came from another obsession: how should UI logic move? I explored Web Components, custom elements, direct DOM manipulation, JavaScript Proxy, directives, binding, and runtime JS behavior. I wanted to know what was really happening between data, DOM, and user interaction.

I was not satisfied with using client-side behavior as a black box. I wanted to feel the mechanism. When a value changes, who knows? When the DOM updates, who decides? When an event happens, where does the logic live? These questions were small on the surface, but they opened a deeper concern: if the interface is alive, then the runtime underneath it is part of the design.

Kit JS did not end the journey. It prepared the next one. It taught me that runtime JS is not only a frontend feature. It is a way of thinking about state, cause, effect, and responsibility. The browser was one place where I studied that movement. Kitwork later became another.

There was a personal lesson in that work too. I learned that I do not only want to consume abstractions. I want to understand the pressure that created them. A directive is not just syntax. A binding is not just convenience. A runtime update is a decision about how much of the system should know when something changes. These questions made me more sensitive to the design of runtime behavior.

11 / Kitwork

Before Kitwork, there was a private platform I could not share.

The story of Kitwork also begins with something I could not open-source. Before it, I had built a full platform for myself, a system I often thought of through the name Kitstack. It helped me deploy websites quickly: create a profile, copy a template folder to the server, connect the pieces, and the project could run. It carried many years of work: DNS ideas, routing, templates, proxy behavior, APIs, customer logic, security functions, and the private needs of real projects.

A younger sibling once asked me why I did not open-source the things I had built. That question stayed with me. The honest answer was that I could not simply publish Kitstack. Too much of it was tied to customers, private APIs, and business-specific security decisions. But the question opened another door: maybe I could not share the whole old system, but I could extract the essence from it.

That extraction became one of the emotional origins of Kitwork. I did not want to publish a messy private platform and call it open source. I wanted to make something cleaner, smaller, more teachable, and more honest. Something another person could clone, read, run, and slowly understand. Something that carried the lessons of five years without carrying the private weight of those five years.

In its earliest public imagination, Kitwork looked almost like a README that wanted to become a system. A roadmap, a dream, a text file holding the life of a programmer who wanted workflows, tasks, APIs, and backends to become simpler. I looked at tools like GitHub Actions, n8n, serverless functions, Docker, and low-code workflows, then asked a question that would not leave me alone: what if a small builder could run useful services from simple files without carrying an entire cloud-shaped machine on his back?

The idea kept changing shape. At one stage, I imagined JavaScript logic running in a self-contained way without Node.js. At another stage, I thought about V8 and embedded execution. But the deeper I went, the more I wanted a stricter path. The current Kitwork became something more personal and more difficult: not V8, not Node.js, not a wrapper around the usual runtime, but a small JavaScript subset compiled to bytecode and executed by a hand-written stack VM in Go.

That decision matters because it carries the whole story. If Firebase taught me the cost of dependency, if self-hosting taught me the responsibility of infrastructure, and if Go taught me the beauty of simple foundations, then Kitwork is the place where those lessons became architecture. It is not only a way to serve pages. It is my attempt to make the relationship between folder, route, logic, tenant, and runtime visible again.

12 / Kitwork engine

Kitwork is where the old questions became a runtime.

Kitwork did not appear from nowhere. It came from Blogger, C#, Xamarin, Firebase, Angular, SEO, Samdy, self-hosting, Go, Kit JS, and many nights wondering why logic had to be trapped inside heavy stacks. It is not only a project. It is the shape my questions took after they had lived with me for years.

In Kitwork, a site is a folder. A folder is a runtime node. A small JavaScript subset is compiled into bytecode. The bytecode runs on a stack VM written in Go. Each tenant is isolated. Static assets can be served without entering the VM. The filesystem is not just storage. It becomes a map of behavior.

This folder idea is important to me because it removes a layer of ceremony. A route does not have to begin as an abstract table somewhere far away. It can begin as a place. The URL, the folder, the page, the router, and the local environment can live near each other. When the engine walks a path, it is not only matching strings. It is entering a small world with its own logic, state, and boundaries.

Multi-tenancy also carries a life lesson for me. A system should allow many small worlds to exist without swallowing one another. Each tenant has its own folder, its own environment, its own compiled bytecode, its own isolation. I like that. It feels close to how I think about independent builders too: many small lives, each with its own context, sharing the same engine without losing their own boundary.

This matters to me because I have always been searching for a way to make software feel closer to the hands again. Not easier in a shallow way. Closer. More visible. More understandable. Less dependent on layers that cannot be questioned. I wanted a system where the path, the file, the logic, the runtime, and the boundary between tenants all made sense together.

I know Kitwork is still a work in progress. That is part of its truth. It is not a finished monument or a slogan. It is a workshop where I keep testing the same values that shaped the road before it: simplicity, control, isolation, honesty, and the belief that a small builder can still learn deep infrastructure slowly.

I also know that building a runtime can look unreasonable from the outside. Why not just use what already exists? Why build a compiler, a bytecode format, a VM, a JIT CSS engine, routing, rendering, hydration, icons, and tenant isolation? My answer is not that existing tools are bad. My answer is that some questions can only be answered by building the layer yourself. You do not learn what a runtime is by naming it. You learn it when your own mistakes have to execute.

Kitwork is therefore not only a project. It is also a record of what I had to learn in order to trust my own system. Every piece carries a question from somewhere earlier in the road.

The JIT parts also came from that same pressure. I did not want icons, CSS, and client behavior to become another heavy pile of files that every tenant carries whether it needs them or not. JIT CSS, JIT icons, JIT client behavior, and Kitwork Drive are all attempts to make the page receive only the behavior it actually uses. It is a small idea, but it fits the larger philosophy: keep the system close, inspectable, and shaped by real usage.

There were many unglamorous nights in this work. Compiler errors that made no sense. VM loops that had to be traced instruction by instruction. Captured values, stack frames, native imports, bytecode caches, tenant reloads, and small parser rules that broke a page in surprising ways. Those nights were difficult, but they were also the nights when Kitwork became real to me. A runtime stops being an idea when your own bug has nowhere left to hide.

Before this shape became Kitwork, some of the thinking lived in other names and experiments: modular SaaS ideas, small APIs, tracking tools, URL shorteners, affiliate modules, template engines, routing experiments, and platform pieces that were useful but too tied to private business logic to be shared cleanly. Kitwork is my attempt to extract the essence from those years and make it understandable, portable, and open enough for others to learn from.

That distinction matters to me. Kitstack was the private workshop where Samdy, shortlink systems, affiliate flows, customer pages, and many small services were actually built. Kitwork is the later standardization of the engine idea: the part I could clean, document, open, and let other people inspect without exposing the private logic that belonged to old projects.

13 / Bytecode

Bytecode became a way to think about life.

When I went deeper into compilers, runtimes, and virtual machines, I began to see bytecode differently. It was no longer only an intermediate representation. It felt like compiled thought: the moment an idea becomes instructions that a machine can carry.

There is something beautiful about that middle place. Human intention is too large and messy. Machine execution is too strict and small. Bytecode sits between them. It reduces an idea into steps without pretending the idea was never human. It shows that every high-level dream must eventually pay the cost of becoming specific.

Maybe that is why I care about it so much. Bytecode asks you to stop hiding behind abstractions and look at what your logic really becomes. It is not emotional, but it can teach emotional honesty. You say you want something. Then the compiler asks: what exactly? In what order? With what value? Under what condition?

That question feels close to life. A dream is easy when it is still a sentence. It becomes harder when it must become daily action. In that sense, a life also becomes bytecode. Not because we are machines, but because sincerity eventually has to become instructions, habits, choices, and repeated work.

Some nights debugging the VM felt almost unreasonable. I would follow the flow of values through instructions, stack frames, calls, returns, and closures until the morning came. Then suddenly, after months of exhaustion, an idea would appear like lightning. Those moments are hard to explain. They are not commercial happiness. They are the happiness of seeing invisible logic become alive.

14 / Building in public

Sharing the work is also part of understanding it.

I do not build in public because I want to look busy. I build in public because public traces help memory survive. A commit, a note, a small repository, a rough explanation: these are ways of leaving evidence that a question existed and someone tried to answer it.

When something is shared, it becomes less private and more accountable. Not accountable in the sense of performance, but accountable in the sense of clarity. If I cannot explain what I am building, maybe I do not understand it yet. If I can explain it simply, maybe the idea has started to become real.

There is also generosity in publishing unfinished understanding. Many people only see the polished result of technology. They do not see the confusion, the wrong turns, the small discoveries, or the nights when the builder is not sure whether the idea is worth continuing. I want my work to keep some of that truth visible.

That is why I care about small public repositories, notes, guides, and explanations. Publishing something on the internet is like giving an idea a URL. It becomes addressable. Someone can find it, return to it, disagree with it, learn from it, or build from it. For a person who has spent many years learning alone, that matters. Public work turns private confusion into shared material.

15 / What I mean by independence

Independence is not isolation. It is responsibility.

The word independence can sound proud if it is misunderstood. I do not mean that I want to do everything alone forever. I do not mean that outside tools are bad or that depending on others is weakness. No one builds anything meaningful without receiving knowledge from somewhere.

What I mean is simpler: I want to reduce helplessness. I want to understand enough to make choices with open eyes. I want to know what happens when a request enters my server, when a template renders, when a script compiles, when a tenant runs, when a cache is used, when a file is served, when an error appears.

Independence is not the absence of dependency. It is the ability to see dependency clearly. It is the willingness to own the consequences of your tools. It is the humility to learn the layer below the one you are standing on.

In that sense, technological independence is not a destination. It is a practice. It appears when you read the error instead of only fearing it, when you write the small tool instead of waiting for a perfect one, when you learn why the server failed, when you simplify something because you finally understand it, when you choose a dependency with respect instead of blind trust.

I am still dependent on many things. Everyone is. But I want my dependency to become conscious. I want to know what I am borrowing from the world, what I can replace if I must, and what I should build myself because the act of building it will change me.

16 / The next surface

Even localhost on a phone can become a question about the future.

As AI began entering daily life, I found myself thinking again about surfaces, devices, and where programming can happen. A localhost running on a phone sounds small, almost playful. But to me it points to a bigger question: what happens when the space between idea, device, infrastructure, and deployment becomes thinner?

I do not believe developers should cling too tightly to old titles. Frontend, backend, full-stack, vibe coding, agents, AI: all of these names will keep changing. What matters is whether we keep learning how systems behave. If the surface changes, the honest builder adapts. The goal is not to protect an identity. The goal is to keep the ability to create.

This is why my story keeps moving between life and infrastructure. The future does not arrive only as a headline. Sometimes it arrives as a phone, a local server, a generated app, an agent, or a strange new workflow that makes old categories feel too small. I want to stay close enough to the work that I can change with it.

At 30, I no longer see the next ten years as something I can conquer with noise. I see them as something I have to live carefully. The younger me wanted proof. The older me wants depth. I still want to build ambitious things, but I want them to be attached to a life I can actually respect.

17 / Who this is for

I am writing for people who still believe in honest work.

I know this page is long. That is intentional. The internet often rewards short statements, fast opinions, and polished images of success. But some stories need space because the value is not only in what happened. The value is in the slow relationship between each event and the person it formed.

I am writing for people who like to read the full path, not just the highlight. For people who understand that a quiet year can matter. That a failed project can become part of a later system. That a job outside software can still teach a developer how to build for real life. That a small website, a server, a broken deploy, a strange bug, or an old dream can all leave useful marks.

I am not trying to make my life sound heroic. I only want the story to keep its texture. If someone reads it and feels less alone in their own unfinished road, then the page has done enough.

18 / What remains

I am still walking.

I do not see myself as a title. I am a builder still trying to understand things deeply enough to make them simpler. Some days that feels noble. Many days it simply feels difficult. But difficulty is not proof that the road is wrong. Sometimes it is proof that the road is real.

The road is not clean. It contains debt, mistakes, failed ideas, old dreams, quiet rooms, coffee shops, delivery roads, servers, code, and a lot of starting over. I do not want to erase those parts. They are not decorations around the work. They are the soil that made the work possible.

If there is one sentence that holds the whole journey, it is this: I want to build technology that I can understand, operate, and trust with my own hands.

I was never only trying to build a startup. I was trying to build a life. A life where I can wake up, buy breakfast, eat with my wife, water my plants, write code, sit in a coffee shop, build products I love, and live peacefully in a small town without giving up the depth of my dreams.

And if this story reaches someone who is still learning in a quiet place, still building after work, still unsure whether the road counts because it does not look like anyone else's, I hope it says something simple: keep going honestly. A life does not need to be perfect to become useful. A system does not need to be famous to be real. A long road can still become a home if you keep walking with clean hands.

Search