[{"data":1,"prerenderedAt":3733},["ShallowReactive",2],{"/indulge/continuous-integration-for-licensed-software":3,"series-Distributed Systems Field Notes":390,"indulge-all-posts":838},{"id":4,"title":5,"body":6,"coverImage":366,"date":367,"description":368,"draft":369,"extension":370,"featured":371,"group":372,"initial":369,"meta":373,"navigation":371,"path":374,"rank":375,"rawbody":376,"readTime":377,"seo":378,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":381,"subtitle":382,"tags":383,"__hash__":389},"indulge/indulge/continuous-integration-for-licensed-software.md","CI/CD for Licensed Software You Don't Host",{"type":7,"value":8,"toc":354},"minimark",[9,27,35,38,41,46,49,52,55,57,70,72,76,79,98,101,103,107,110,124,137,146,149,151,160,162,166,184,187,200,203,206,209,211,215,220,231,234,237,240,242,251,253,257,260,263,266,268,273,289,302,304,313,315,321,324,330,333,342,345,348,351],[10,11,12,13,20,21,26],"p",{},"We are three weeks away from shipping ",[14,15,19],"a",{"href":16,"rel":17},"https://navengine.encha.cloud/",[18],"nofollow","NavEngine v4",", an echo from the previous piece on ",[14,22,25],{"href":23,"rel":24},"https://www.marvinkweyu.net/indulge/business-minded-development",[18],"Business Driven development",".",[10,28,29,30,34],{},"I say \"",[31,32,33],"em",{},"shipping","\" loosely. There is no deployment script I run, no SSH session I open, no Kubernetes rollout I watch. The software lives on infrastructure I have never seen, behind firewalls I cannot reach, on machines whose specs I do not know. Shipping, in this context, means pushing an image to a registry and trusting that a process running inside a container on a customer's server will eventually notice and do something about it.",[10,36,37],{},"That gap - between what I push and what the customer runs - is what this piece is about.",[39,40],"hr",{},[42,43,45],"h3",{"id":44},"the-assumption-collapse","The Assumption Collapse",[10,47,48],{},"Every CI/CD tool I have ever used was built on a premise so foundational that nobody thought to state it: you control the deployment target. You own the server. You have the keys. Deployment, in the conventional sense, is just automation wrapped around access you already have.",[10,50,51],{},"NavEngine is quite the opposite. It exists as a custom image - qcow2 - shipped onto the customer's infrastructure. The customer owns the machine. I do not have SSH access unless I go through DWService and even then, that is a support channel, not a deployment one. Yet somehow, we need to continuously deliver updates to machines we cannot reach, across connections we cannot guarantee, without breaking software that is actively in use.",[10,53,54],{},"So the question became: if you cannot push, how do you deliver?",[39,56],{},[58,59,60],"blockquote",{},[10,61,62,66,67],{},[63,64,65],"strong",{},"Indulge"," ",[31,68,69],{},"The moment you decide to ship software you don't host, you have made a decision with consequences that will follow you for the life of the product. Not just operationally. Architecturally. Every assumption your codebase makes about the environment it runs in now belongs to someone else's infrastructure. That is not a deployment problem. It is a design problem that shows up at deployment time.",[39,71],{},[42,73,75],{"id":74},"the-answer-is-pull","The Answer is Pull",[10,77,78],{},"Watchtower. It runs as a container alongside the rest of the stack, polls the Docker registry on a configured interval, and when it detects a new image digest on the tag it is watching, it pulls and restarts the relevant containers. No webhook, no push, no SSH. The installation phones home for updates and takes what it finds.",[10,80,81,82,86,87,90,91,94,95,97],{},"The key design decision here was the floating tag. Every customer's Butane config ships with ",[83,84,85],"code",{},"core:stable",". Not ",[83,88,89],{},"core:v3.0.39",". Not a digest pin. ",[83,92,93],{},"stable",". When Watchtower polls the registry and sees that ",[83,96,93],{}," now resolves to a different digest than what is currently running, it pulls. What \"stable\" points to is entirely under my control, from the registry side, without touching anything on the customer's machine.",[10,99,100],{},"This sounds obvious once you say it. It took longer than I would like to admit to get there.",[39,102],{},[42,104,106],{"id":105},"two-registries-two-floating-tags-one-gate","Two Registries, Two floating tags, One gate",[10,108,109],{},"Here is the full pipeline as it actually runs.",[10,111,112,113,116,117,120,121,123],{},"Every push to ",[83,114,115],{},"main"," triggers a build on the dev registry. The image gets tagged with a version identifier and a floating tag - ",[83,118,119],{},"staging",". A staging environment - running the same Compose stack, same Butane configuration, same structure as a customer installation - pulls from ",[83,122,119],{},". This is where the image lives until I am satisfied it works.",[10,125,126,127,130,131,133,134,136],{},"When staging looks good, I create a release. The production registry builds from that release, tags the image with the version (",[83,128,129],{},"v3.0.40",") and overwrites the floating ",[83,132,93],{}," tag. Customer installations, on their next Watchtower poll interval, see a new digest on ",[83,135,93],{}," and update.",[10,138,139,140,142,143,145],{},"The critical detail: ",[83,141,93],{}," is never overwritten by a push to ",[83,144,115],{},". Only by a release. The staging gate is the only thing standing between a broken image and a customer's running installation. There is no automated rollout percentage, no canary fleet, no gradual traffic shift. The gate is a human decision, made after watching staging run and deciding it is ready.",[10,147,148],{},"For a solo-operated product at this stage, that is the right call. Complexity in release infrastructure that you do not need is just surface area for things to go wrong.",[39,150],{},[58,152,153],{},[10,154,155,66,157],{},[63,156,65],{},[31,158,159],{},"A staging environment that does not accurately reflect production is a very expensive placebo. It gives you confidence without giving you information. The hardest thing about shipping self-hosted software is that your staging environment runs on infrastructure you understand, with data you created, on a network you control. Your customer's environment is none of those things. No pipeline fully closes that gap. The best you can do is know exactly where your confidence ends.",[39,161],{},[42,163,165],{"id":164},"what-happens-when-stable-is-broken","What Happens When stable is broken",[167,168,174],"div",{"className":169},[170,171,172,173],"max-w-2xl","mx-auto","text-center","text-xs",[10,175,176,181],{},[177,178],"img",{"alt":179,"src":180},"backups","/continuous-integration/backups.png",[31,182,183],{},"Backups(monkeyuser.com).",[10,185,186],{},"It will happen. An image that passes staging will break in a customer environment for a reason that staging did not surface - a schema migration that assumed a clean database, a dependency that behaves differently on older hardware, a configuration value that was present in staging and absent in the field.",[10,188,189,190,192,193,196,197,199],{},"The recovery flow is: fix on ",[83,191,115],{},", watch it pass staging, cut a new release. ",[83,194,195],{},"v3.0.41"," overwrites ",[83,198,93],{},". Watchtower picks it up on the next poll interval. The customer, who may or may not have noticed anything, is now running the fixed image.",[10,201,202],{},"The window between the broken image landing and the fix arriving is real. Depending on how fast the hotfix moves through staging and how long the Watchtower poll interval is, a customer could be running broken software for anywhere from minutes to hours. There is no remote kill switch. There is no way to reach in and restart a service. There is DWService if the situation is bad enough to warrant it, but that is a support escalation, not a deployment tool.",[10,204,205],{},"This is the honest cost of not controlling the deployment target. You accept a recovery latency that you cannot compress below a certain floor. The mitigation is not a cleverer pipeline. It is investing deeply in staging fidelity and in making sure the image fails loudly rather than silently - health checks that surface problems immediately, startup validation that refuses to run on bad configuration rather than running badly.",[10,207,208],{},"A system that fails loudly is a system that can be fixed. A system that degrades quietly is a system that erodes trust before anyone knows there is a problem.",[39,210],{},[42,212,214],{"id":213},"enterprise-and-standard-different-cadences-same-pattern","Enterprise and standard: different cadences, same pattern",[10,216,217],{},[31,218,219],{},"How do we manage customers that diverge from the main product line with an enterprise license?",[10,221,222,223,226,227,230],{},"NavEngine has two license tiers. Enterprise customers are on a separate release cadence from standard customers. The mechanism is straightforward: separate floating tags on the production registry. ",[83,224,225],{},"core-enterprise:stable"," and ",[83,228,229],{},"core-standard:stable",". The Butane config shipped to each customer points at the appropriate tag. Enterprise releases can go out on a different schedule, carry different feature sets, and move more cautiously than standard releases.",[10,232,233],{},"What prevents a standard customer from pointing Watchtower at the enterprise tag? Mostly friction. The Compose file is baked into the Butane config at provisioning time. There is no SSH access to change it. A customer would need console access and the motivation to go looking - unlikely for most, impossible to rule out for all.",[10,235,236],{},"The proper answer is registry-level access control: pull tokens scoped to the tags each customer is entitled to, issued at license activation and revoked at expiry. This means the registry enforces entitlement, not just the application. An expired license means an expired pull token means no updates, enforced at the point of delivery rather than after the fact.",[10,238,239],{},"This is on the roadmap. For v4, the answer is friction and trust.",[39,241],{},[58,243,244],{},[10,245,246,66,248],{},[63,247,65],{},[31,249,250],{},"License enforcement in self-hosted software is a negotiation between what you can technically control and what you have to trust. You cannot fully control what runs on a machine you do not own. At some point, a sufficiently motivated customer can circumvent almost any enforcement mechanism you build. The goal is not to make circumvention impossible. It is to make compliance easier than circumvention, and to make the value proposition strong enough that the question rarely comes up.",[39,252],{},[42,254,256],{"id":255},"the-license-server-is-not-in-the-update-path","The license server is not in the update path",[10,258,259],{},"One decision I am glad we made early: the licensing server and the Docker registry are separate infrastructure. They do not share a failure domain.",[10,261,262],{},"Watchtower polls the registry. The license server is called from within one of the running containers as part of normal application operation. If the registry is unreachable, the software keeps running. If the license server is unreachable, the backend falls back to its last known state - persisted to disk, not held in memory, so it survives a container restart. The check runs periodically. The grace window is generous enough that a license server outage does not immediately affect customers, but not so generous that expired licenses can run indefinitely.",[10,264,265],{},"This matters because the failure modes compound. A product update that requires a license check to proceed has just made the license server a dependency of your deployment pipeline. Any outage that hits your license infrastructure also hits your ability to ship updates to paying customers. Keeping these paths separate means they fail independently, and independent failures are recoverable in ways that cascading ones are not.",[39,267],{},[10,269,270],{},[63,271,272],{},"What the pipeline actually looks like",[167,274,276],{"className":275},[170,171,172,173],[10,277,278,282],{},[177,279],{"alt":280,"src":281},"continuous","/continuous-integration/navengine_cicd.svg",[31,283,284,285,288],{},"CI/CD flow diagram (",[63,286,287],{},"drawio",").",[10,290,291,292,294,295,298,299,301],{},"The immutable version tags are not just for auditing. They are the rollback reference. If ",[83,293,129],{}," breaks everything, ",[83,296,297],{},"v3.0.39"," still exists in the registry. I can retag it as ",[83,300,93],{}," manually and customers will roll back on the next poll. This has not been needed yet. It is there for the day it is.",[39,303],{},[58,305,306],{},[10,307,308,66,310],{},[63,309,65],{},[31,311,312],{},"Most CI/CD writing treats deployment as the end of the story. Ship it, watch the metrics, move on. Self-hosted software inverts this. Deployment is the beginning of a period during which software you cannot reach is running in an environment you cannot see, on behalf of a customer whose experience you will only hear about if something goes wrong. The pipeline is not a delivery mechanism. It is a trust mechanism. Every decision in it is a decision about how much you trust the image before it leaves your hands.",[39,314],{},[42,316,318],{"id":317},"three-weeks-out",[63,319,320],{},"Three Weeks Out",[10,322,323],{},"NavEngine v4 is three weeks away. The pipeline is running. Staging has held. The tags are in place.",[10,325,326,327],{},"None of that answers the only question that matters: ",[31,328,329],{},"what happens when the software leaves you?",[10,331,332],{},"It will run on machines you have never touched, against data you have never seen, in environments that do not care about your assumptions. By the time it fails, if it fails, it will already be someone else’s problem - and still entirely yours. The customer notices before you do. That is the thing. I am shit scared.",[10,334,335,336,341],{},"I suppose that this is the essence of ",[14,337,340],{"href":338,"rel":339},"https://www.marvinkweyu.net/indulge/why-distributed-systems-field-notes",[18],"these notes"," - to document real systems in real time. This is the inversion self-hosted systems force on you: treating deployment not as the end of control but as the beginning of its absence. ",[10,343,344],{},"So you design for that absence.",[10,346,347],{},"You design for recovery over prevention.",[10,349,350],{},"For visibility over certainty and trust over control.",[10,352,353],{},"Everything else is just what it takes to make that possible.",{"title":355,"searchDepth":356,"depth":356,"links":357},"",2,[358,360,361,362,363,364,365],{"id":44,"depth":359,"text":45},3,{"id":74,"depth":359,"text":75},{"id":105,"depth":359,"text":106},{"id":164,"depth":359,"text":165},{"id":213,"depth":359,"text":214},{"id":255,"depth":359,"text":256},{"id":317,"depth":359,"text":320},"continuous-integration/online_package_tracking.png","04/06/2026","Three weeks from shipping NavEngine v4. No SSH access. No deployment target. Here's how updates reach machines behind a customer's firewall.",false,"md",true,"Distributed Systems Field Notes",{},"/indulge/continuous-integration-for-licensed-software",1,"---\ntitle: CI/CD for Licensed Software You Don't Host\ncoverImage: continuous-integration/online_package_tracking.png\ndate: 04/06/2026\ndescription: Three weeks from shipping NavEngine v4. No SSH access. No deployment target. Here's how updates reach machines behind a customer's firewall.\ndraft: false\nfeatured: true\ngroup: Distributed Systems Field Notes\ninitial: false\nrank: 1\nreadTime: 5\nseo:\n  title: CI/CD for Licensed Software You Don't Host\n  description: How to continuously deliver updates to on-premise software you can't SSH into - floating Docker tags, Watchtower, dual-registry pipelines, and license-gated updates from the field.\nseries: true\nseriesCover: false\nsubtitle: Floating tags, Watchtower, and the trust contract hidden inside every update\ntags:\n  - distributed systems\n  - software licensing\n  - devops\n  - self-hosted\n  - docker\n---\n\nWe are three weeks away from shipping [NavEngine v4](https://navengine.encha.cloud/), an echo from the previous piece on [Business Driven development](https://www.marvinkweyu.net/indulge/business-minded-development).\n\nI say \"_shipping_\" loosely. There is no deployment script I run, no SSH session I open, no Kubernetes rollout I watch. The software lives on infrastructure I have never seen, behind firewalls I cannot reach, on machines whose specs I do not know. Shipping, in this context, means pushing an image to a registry and trusting that a process running inside a container on a customer's server will eventually notice and do something about it.\n\nThat gap - between what I push and what the customer runs - is what this piece is about.\n\n---\n\n### The Assumption Collapse\n\nEvery CI/CD tool I have ever used was built on a premise so foundational that nobody thought to state it: you control the deployment target. You own the server. You have the keys. Deployment, in the conventional sense, is just automation wrapped around access you already have.\n\nNavEngine is quite the opposite. It exists as a custom image - qcow2 - shipped onto the customer's infrastructure. The customer owns the machine. I do not have SSH access unless I go through DWService and even then, that is a support channel, not a deployment one. Yet somehow, we need to continuously deliver updates to machines we cannot reach, across connections we cannot guarantee, without breaking software that is actively in use.\n\nSo the question became: if you cannot push, how do you deliver?\n\n---\n\n> **Indulge** _The moment you decide to ship software you don't host, you have made a decision with consequences that will follow you for the life of the product. Not just operationally. Architecturally. Every assumption your codebase makes about the environment it runs in now belongs to someone else's infrastructure. That is not a deployment problem. It is a design problem that shows up at deployment time._\n\n---\n\n### The Answer is Pull\n\nWatchtower. It runs as a container alongside the rest of the stack, polls the Docker registry on a configured interval, and when it detects a new image digest on the tag it is watching, it pulls and restarts the relevant containers. No webhook, no push, no SSH. The installation phones home for updates and takes what it finds.\n\nThe key design decision here was the floating tag. Every customer's Butane config ships with `core:stable`. Not `core:v3.0.39`. Not a digest pin. `stable`. When Watchtower polls the registry and sees that `stable` now resolves to a different digest than what is currently running, it pulls. What \"stable\" points to is entirely under my control, from the registry side, without touching anything on the customer's machine.\n\nThis sounds obvious once you say it. It took longer than I would like to admit to get there.\n\n---\n\n### Two Registries, Two floating tags, One gate\n\nHere is the full pipeline as it actually runs.\n\nEvery push to `main` triggers a build on the dev registry. The image gets tagged with a version identifier and a floating tag - `staging`. A staging environment - running the same Compose stack, same Butane configuration, same structure as a customer installation - pulls from `staging`. This is where the image lives until I am satisfied it works.\n\nWhen staging looks good, I create a release. The production registry builds from that release, tags the image with the version (`v3.0.40`) and overwrites the floating `stable` tag. Customer installations, on their next Watchtower poll interval, see a new digest on `stable` and update.\n\nThe critical detail: `stable` is never overwritten by a push to `main`. Only by a release. The staging gate is the only thing standing between a broken image and a customer's running installation. There is no automated rollout percentage, no canary fleet, no gradual traffic shift. The gate is a human decision, made after watching staging run and deciding it is ready.\n\nFor a solo-operated product at this stage, that is the right call. Complexity in release infrastructure that you do not need is just surface area for things to go wrong.\n\n---\n\n> **Indulge** _A staging environment that does not accurately reflect production is a very expensive placebo. It gives you confidence without giving you information. The hardest thing about shipping self-hosted software is that your staging environment runs on infrastructure you understand, with data you created, on a network you control. Your customer's environment is none of those things. No pipeline fully closes that gap. The best you can do is know exactly where your confidence ends._\n\n---\n\n### What Happens When stable is broken\n\n::div{.max-w-2xl.mx-auto.text-center.text-xs}\n![backups](/continuous-integration/backups.png)_Backups(monkeyuser.com)._\n::\n\nIt will happen. An image that passes staging will break in a customer environment for a reason that staging did not surface - a schema migration that assumed a clean database, a dependency that behaves differently on older hardware, a configuration value that was present in staging and absent in the field.\n\nThe recovery flow is: fix on `main`, watch it pass staging, cut a new release. `v3.0.41` overwrites `stable`. Watchtower picks it up on the next poll interval. The customer, who may or may not have noticed anything, is now running the fixed image.\n\nThe window between the broken image landing and the fix arriving is real. Depending on how fast the hotfix moves through staging and how long the Watchtower poll interval is, a customer could be running broken software for anywhere from minutes to hours. There is no remote kill switch. There is no way to reach in and restart a service. There is DWService if the situation is bad enough to warrant it, but that is a support escalation, not a deployment tool.\n\nThis is the honest cost of not controlling the deployment target. You accept a recovery latency that you cannot compress below a certain floor. The mitigation is not a cleverer pipeline. It is investing deeply in staging fidelity and in making sure the image fails loudly rather than silently - health checks that surface problems immediately, startup validation that refuses to run on bad configuration rather than running badly.\n\nA system that fails loudly is a system that can be fixed. A system that degrades quietly is a system that erodes trust before anyone knows there is a problem.\n\n---\n\n### Enterprise and standard: different cadences, same pattern\n\n_How do we manage customers that diverge from the main product line with an enterprise license?_\n\nNavEngine has two license tiers. Enterprise customers are on a separate release cadence from standard customers. The mechanism is straightforward: separate floating tags on the production registry. `core-enterprise:stable` and `core-standard:stable`. The Butane config shipped to each customer points at the appropriate tag. Enterprise releases can go out on a different schedule, carry different feature sets, and move more cautiously than standard releases.\n\nWhat prevents a standard customer from pointing Watchtower at the enterprise tag? Mostly friction. The Compose file is baked into the Butane config at provisioning time. There is no SSH access to change it. A customer would need console access and the motivation to go looking - unlikely for most, impossible to rule out for all.\n\nThe proper answer is registry-level access control: pull tokens scoped to the tags each customer is entitled to, issued at license activation and revoked at expiry. This means the registry enforces entitlement, not just the application. An expired license means an expired pull token means no updates, enforced at the point of delivery rather than after the fact.\n\nThis is on the roadmap. For v4, the answer is friction and trust.\n\n---\n\n> **Indulge** _License enforcement in self-hosted software is a negotiation between what you can technically control and what you have to trust. You cannot fully control what runs on a machine you do not own. At some point, a sufficiently motivated customer can circumvent almost any enforcement mechanism you build. The goal is not to make circumvention impossible. It is to make compliance easier than circumvention, and to make the value proposition strong enough that the question rarely comes up._\n\n---\n\n### The license server is not in the update path\n\nOne decision I am glad we made early: the licensing server and the Docker registry are separate infrastructure. They do not share a failure domain.\n\nWatchtower polls the registry. The license server is called from within one of the running containers as part of normal application operation. If the registry is unreachable, the software keeps running. If the license server is unreachable, the backend falls back to its last known state - persisted to disk, not held in memory, so it survives a container restart. The check runs periodically. The grace window is generous enough that a license server outage does not immediately affect customers, but not so generous that expired licenses can run indefinitely.\n\nThis matters because the failure modes compound. A product update that requires a license check to proceed has just made the license server a dependency of your deployment pipeline. Any outage that hits your license infrastructure also hits your ability to ship updates to paying customers. Keeping these paths separate means they fail independently, and independent failures are recoverable in ways that cascading ones are not.\n\n---\n\n**What the pipeline actually looks like**\n\n::div{.max-w-2xl.mx-auto.text-center.text-xs}\n![continuous](/continuous-integration/navengine_cicd.svg)_CI/CD flow diagram (**drawio**)._\n::\n\nThe immutable version tags are not just for auditing. They are the rollback reference. If `v3.0.40` breaks everything, `v3.0.39` still exists in the registry. I can retag it as `stable` manually and customers will roll back on the next poll. This has not been needed yet. It is there for the day it is.\n\n---\n\n> **Indulge** _Most CI/CD writing treats deployment as the end of the story. Ship it, watch the metrics, move on. Self-hosted software inverts this. Deployment is the beginning of a period during which software you cannot reach is running in an environment you cannot see, on behalf of a customer whose experience you will only hear about if something goes wrong. The pipeline is not a delivery mechanism. It is a trust mechanism. Every decision in it is a decision about how much you trust the image before it leaves your hands._\n\n---\n\n### **Three Weeks Out**\n\nNavEngine v4 is three weeks away. The pipeline is running. Staging has held. The tags are in place.\n\nNone of that answers the only question that matters: _what happens when the software leaves you?_\n\nIt will run on machines you have never touched, against data you have never seen, in environments that do not care about your assumptions. By the time it fails, if it fails, it will already be someone else’s problem - and still entirely yours. The customer notices before you do. That is the thing. I am shit scared.\n\nI suppose that this is the essence of [these notes](https://www.marvinkweyu.net/indulge/why-distributed-systems-field-notes) - to document real systems in real time. This is the inversion self-hosted systems force on you: treating deployment not as the end of control but as the beginning of its absence. \n\nSo you design for that absence.\n\nYou design for recovery over prevention.\n\nFor visibility over certainty and trust over control.\n\nEverything else is just what it takes to make that possible.\n",5,{"title":5,"description":379},"How to continuously deliver updates to on-premise software you can't SSH into - floating Docker tags, Watchtower, dual-registry pipelines, and license-gated updates from the field.",null,"indulge/continuous-integration-for-licensed-software","Floating tags, Watchtower, and the trust contract hidden inside every update",[384,385,386,387,388],"distributed systems","software licensing","devops","self-hosted","docker","zDxEKJdu3zG8f6RghmshJ9z0L84nbnqzUgL2iw3YPLc",[391,629,686,823],{"id":4,"title":5,"body":392,"coverImage":366,"date":367,"description":368,"draft":369,"extension":370,"featured":371,"group":372,"initial":369,"meta":626,"navigation":371,"path":374,"rank":375,"rawbody":376,"readTime":377,"seo":627,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":381,"subtitle":382,"tags":628,"__hash__":389},{"type":7,"value":393,"toc":617},[394,402,406,408,410,412,414,416,418,420,428,430,432,434,444,446,448,450,452,460,468,474,476,478,486,488,490,499,501,509,511,513,515,517,519,523,529,531,533,535,537,545,547,549,551,553,555,557,561,572,580,582,590,592,596,598,602,604,609,611,613,615],[10,395,12,396,20,399,26],{},[14,397,19],{"href":16,"rel":398},[18],[14,400,25],{"href":23,"rel":401},[18],[10,403,29,404,34],{},[31,405,33],{},[10,407,37],{},[39,409],{},[42,411,45],{"id":44},[10,413,48],{},[10,415,51],{},[10,417,54],{},[39,419],{},[58,421,422],{},[10,423,424,66,426],{},[63,425,65],{},[31,427,69],{},[39,429],{},[42,431,75],{"id":74},[10,433,78],{},[10,435,81,436,86,438,90,440,94,442,97],{},[83,437,85],{},[83,439,89],{},[83,441,93],{},[83,443,93],{},[10,445,100],{},[39,447],{},[42,449,106],{"id":105},[10,451,109],{},[10,453,112,454,116,456,120,458,123],{},[83,455,115],{},[83,457,119],{},[83,459,119],{},[10,461,126,462,130,464,133,466,136],{},[83,463,129],{},[83,465,93],{},[83,467,93],{},[10,469,139,470,142,472,145],{},[83,471,93],{},[83,473,115],{},[10,475,148],{},[39,477],{},[58,479,480],{},[10,481,482,66,484],{},[63,483,65],{},[31,485,159],{},[39,487],{},[42,489,165],{"id":164},[167,491,493],{"className":492},[170,171,172,173],[10,494,495,497],{},[177,496],{"alt":179,"src":180},[31,498,183],{},[10,500,186],{},[10,502,189,503,192,505,196,507,199],{},[83,504,115],{},[83,506,195],{},[83,508,93],{},[10,510,202],{},[10,512,205],{},[10,514,208],{},[39,516],{},[42,518,214],{"id":213},[10,520,521],{},[31,522,219],{},[10,524,222,525,226,527,230],{},[83,526,225],{},[83,528,229],{},[10,530,233],{},[10,532,236],{},[10,534,239],{},[39,536],{},[58,538,539],{},[10,540,541,66,543],{},[63,542,65],{},[31,544,250],{},[39,546],{},[42,548,256],{"id":255},[10,550,259],{},[10,552,262],{},[10,554,265],{},[39,556],{},[10,558,559],{},[63,560,272],{},[167,562,564],{"className":563},[170,171,172,173],[10,565,566,568],{},[177,567],{"alt":280,"src":281},[31,569,284,570,288],{},[63,571,287],{},[10,573,291,574,294,576,298,578,301],{},[83,575,129],{},[83,577,297],{},[83,579,93],{},[39,581],{},[58,583,584],{},[10,585,586,66,588],{},[63,587,65],{},[31,589,312],{},[39,591],{},[42,593,594],{"id":317},[63,595,320],{},[10,597,323],{},[10,599,326,600],{},[31,601,329],{},[10,603,332],{},[10,605,335,606,341],{},[14,607,340],{"href":338,"rel":608},[18],[10,610,344],{},[10,612,347],{},[10,614,350],{},[10,616,353],{},{"title":355,"searchDepth":356,"depth":356,"links":618},[619,620,621,622,623,624,625],{"id":44,"depth":359,"text":45},{"id":74,"depth":359,"text":75},{"id":105,"depth":359,"text":106},{"id":164,"depth":359,"text":165},{"id":213,"depth":359,"text":214},{"id":255,"depth":359,"text":256},{"id":317,"depth":359,"text":320},{},{"title":5,"description":379},[384,385,386,387,388],{"id":630,"title":631,"body":632,"coverImage":380,"date":676,"description":677,"draft":369,"extension":370,"featured":369,"group":372,"initial":369,"meta":678,"navigation":371,"path":679,"rank":377,"rawbody":680,"readTime":377,"seo":681,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":682,"subtitle":683,"tags":684,"__hash__":685},"indulge/indulge/why-distributed-systems-field-notes.md","Why These Notes Exist",{"type":7,"value":633,"toc":674},[634,637,640,643,665,668,671],[10,635,636],{},"Distributed systems are rarely built in one clean leap. They evolve through compromises, deadlines, partial rewrites and decisions made with incomplete information. Documentation often captures what was built, but almost never why it was built that way- or what broke along the way.",[10,638,639],{},"Distributed Systems Field Notes is a collection of essays drawn from building and operating production systems across IaaS, SaaS and data-intensive platforms. I focus less on ideal architectures and more on the realities of shipping software: trade-offs, constraints and the second-order effects that only surface once users, data and failure modes arrive.",[10,641,642],{},"The series covers topics such as:",[644,645,646,650,653,656,659,662],"ul",{},[647,648,649],"li",{},"Service boundaries and control planes",[647,651,652],{},"Containerization and OCI image packaging",[647,654,655],{},"Event-driven and message-based architectures",[647,657,658],{},"Multi-tenancy and isolation strategies",[647,660,661],{},"Deployment models and operational simplicity",[647,663,664],{},"Patterns that held up under pressure-and those that didn’t",[10,666,667],{},"Most examples are grounded in real products I’ve worked on, including infrastructure platforms, applied AI systems and multi-tenant SaaS. Names and details may change, but the architectural pressures remain the same.",[10,669,670],{},"This is not a tutorial series. You won’t find step-by-step guides or “best practices” divorced from context. Instead, these field notes aim to document decision-making in motion: what seemed reasonable at the time, what failed later and what I would do differently with hindsight.",[10,672,673],{},"If you’re building systems that need to survive growth, team changes, and real operational load, I hope these notes save you a few painful lessons - or at least help you recognize them earlier.",{"title":355,"searchDepth":356,"depth":356,"links":675},[],"2026-03-01T10:58:15.409Z","Hard-won insights from architecting and operating systems at scale. Patterns, anti-patterns and war stories.",{},"/indulge/why-distributed-systems-field-notes","---\ntitle: Why These Notes Exist\ndate: 2026-03-01T10:58:15.409Z\ndescription: Hard-won insights from architecting and operating systems at scale. Patterns, anti-patterns and war stories.\ndraft: false\nfeatured: false\ngroup: Distributed Systems Field Notes\ninitial: false\nrank: 5\nreadTime: 5\nseries: true\nseriesCover: false\nsubtitle: Documenting decisions, trade-offs, and second-order effects\ntags:\n  - distributed systems\n---\n\nDistributed systems are rarely built in one clean leap. They evolve through compromises, deadlines, partial rewrites and decisions made with incomplete information. Documentation often captures what was built, but almost never why it was built that way- or what broke along the way.\n\nDistributed Systems Field Notes is a collection of essays drawn from building and operating production systems across IaaS, SaaS and data-intensive platforms. I focus less on ideal architectures and more on the realities of shipping software: trade-offs, constraints and the second-order effects that only surface once users, data and failure modes arrive.\n\nThe series covers topics such as:\n\n- Service boundaries and control planes\n- Containerization and OCI image packaging\n- Event-driven and message-based architectures\n- Multi-tenancy and isolation strategies\n- Deployment models and operational simplicity\n- Patterns that held up under pressure-and those that didn’t\n\nMost examples are grounded in real products I’ve worked on, including infrastructure platforms, applied AI systems and multi-tenant SaaS. Names and details may change, but the architectural pressures remain the same.\n\nThis is not a tutorial series. You won’t find step-by-step guides or “best practices” divorced from context. Instead, these field notes aim to document decision-making in motion: what seemed reasonable at the time, what failed later and what I would do differently with hindsight.\n\nIf you’re building systems that need to survive growth, team changes, and real operational load, I hope these notes save you a few painful lessons - or at least help you recognize them earlier.\n",{"title":631,"description":677},"indulge/why-distributed-systems-field-notes","Documenting decisions, trade-offs, and second-order effects",[384],"gKw_srX8OMGJe39Ys3TUr5ERURt-sjfdFmIEIBUKDLw",{"id":687,"title":688,"body":689,"coverImage":810,"date":811,"description":812,"draft":369,"extension":370,"featured":369,"group":372,"initial":369,"meta":813,"navigation":371,"path":814,"rank":375,"rawbody":815,"readTime":377,"seo":816,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":817,"subtitle":818,"tags":819,"__hash__":822},"indulge/indulge/business-minded-development.md","Business-driven Development",{"type":7,"value":690,"toc":805},[691,694,697,703,706,709,715,718,722,731,743,746,749,753,756,759,762,765,768,771,775,778,781,784,793,796,799,802],[10,692,693],{},"What if your multi-tenant application could be shipped as a distributed SaaS? What if you could have a licensed version of your product as an installable on some corner of the internet? What if we could break the barrier of what it meant to be a revenue generating company? Let's begin.",[10,695,696],{},"Software is the means by which businesses achieve mass distribution. Beyond technical acumen and efficiency, software is the bus through which businesses achieve scale.",[10,698,699,700],{},"Over the quarter, I have been working on software distribution. Specifically: licensing. Think of it in terms of introducing a new avenue of revenue. We dare ask: Do the businesses that ",[31,701,702],{},"value this solution want control over where their data lives? Are they willing to pay a premium over this control?",[10,704,705],{},"The answer, in both cases, was yes and that opened a door I had not thought to knock on before.",[10,707,708],{},"I had to stop thinking about features and lean towards markets and distribution surfaces. Distribution, in this sense, is not about deployments and pipelines. It is about understanding that different buyers have fundamentally different relationships with trust, compliance, and infrastructure ownership. Your architecture either accommodates those differences or silently forecloses them.",[10,710,711,712],{},"Being technical helped me deploy features product needed. Being business-minded led me to more questions. ",[31,713,714],{},"What would it take to ship this as a product someone else operates? What are we assuming about shared infrastructure that a regulated industry, a government agency, or a security-conscious enterprise would never accept?",[10,716,717],{},"The answers to those questions are not found in a ticket or a sprint. They surface when you sit long enough with the business model to let it ask questions back at you.",[42,719,721],{"id":720},"licensing-as-a-pricing-model","Licensing as a pricing model",[10,723,724,725,730],{},"For ",[14,726,729],{"href":727,"rel":728},"https://navengine.encha.cloud",[18],"Navengine",", the questions came back as licensing. Once you accept that a buyer might want to run your software in their own environment - air-gapped, on-premise, inside a VPS they control - you need a mechanism that lets the software know it is legitimate without phoning home in ways that violate their security posture. You need entitlements, activation flows, machine-bound licenses and expiry.",[167,732,734],{"className":733},[170,171,172,173],[10,735,736,740],{},[177,737],{"alt":738,"src":739},"forbidden","/business-dev/forbidden-problems.webp",[31,741,742],{},"It turns out the problem I was solving was not purely technical.",[10,744,745],{},"Somewhere in the middle of designing the activation flow, I realised the license schema was not a technical artifact. It was a pricing model. The fields I was choosing - seats, features, expiry dates, activation limits - were decisions about how we intended to capture value, just expressed as database columns. It was literally us deciding how we wanted to make money, written in schema form. And no product manager or founder had handed me a neat spec sheet. I was the one typing those business decisions into code.",[10,747,748],{},"That kind of realisation doesn’t land with a dramatic “aha!” moment and applause. It creeps in quietly. You’re just fiddling with fields one afternoon… and then, almost without noticing, the way you look at your own codebase has already changed. You start reading the same migrations and models like they’re business strategy documents instead of “just” backend plumbing.",[42,750,752],{"id":751},"the-second-order-effects-arrive","The second-order effects arrive",[10,754,755],{},"When you decide to support self-hosted deployment, you are not making a DevOps decision. You are ratifying a set of architectural choices that were either made deliberately or inherited by accident. Configuration that was hardcoded because \"we only have one environment\" now needs to be externalized. Database assumptions that worked fine in a shared-infrastructure model now need isolation boundaries. Upgrade paths that were previously your problem - a migration you ran on a schedule you controlled - become your customer's problem, which means they become your support problem, which means they were always your design problem.",[10,757,758],{},"The business-minded engineer understands this before the contract is signed. They look at a feature and ask not just \"how do we build this\" but \"how does this behave when someone else is operating it?\" That is a different question and it produces different code. It produces code that fails loudly with actionable errors instead of silently with corrupted state. It produces configuration schema that are documented because they have to be, not because someone found time. It produces container images that carry their dependencies rather than assuming a shared environment that may not exist on the other side of a firewall.",[10,760,761],{},"Containerizing Navengine using Flatcar images was not primarily a reliability choice - it was a distribution choice. The image had to be self-contained because I could not know what the environment on the other side looked like. Keygen had to be reachable at activation but not required at runtime, because an installation behind a firewall cannot tolerate a dependency on an external service it may never reach. None of that came from an architecture review. It came from thinking hard about the buyer and working backwards from their constraints.",[10,763,764],{},"That backward motion - from buyer to architecture - is the discipline that business-minded engineers practice. It is less intuitive than building forward from requirements, and it is rarely taught, because most engineering education treats the business as a context for the technical problem rather than as a force that shapes the technical solution. But the shape of a system tells you exactly what assumptions its builders made about how it would be used, and by whom, and under what conditions.",[10,766,767],{},"If Navengine could only really be operated, understood, or debugged by the people who built it… it would cease to be a product. It would be a service that’s been dressed up in product clothing.",[10,769,770],{},"The distinction matters because services and products scale differently. A service scales with people - support engineers, customer success managers, implementation specialists. A product scales with copies. When you ship a licensed, self-hosted deployment, you are betting that the copy can stand on its own. That bet is won or lost in the architecture, long before the first installation.",[42,772,774],{"id":773},"none-of-this-is-free","None of this is free.",[10,776,777],{},"I will not pretend this is clean. Supporting two distribution surfaces - a managed SaaS and a self-hosted licensed product - means every feature has to answer for itself in both worlds. Every abstraction either holds across deployment models or eventually creates a seam you will debug at the worst possible time. The surface area grows and so does the discipline required to keep it coherent.",[10,779,780],{},"This is why most teams never do it. Not because it is technically beyond them, but because it requires a kind of thinking that does not come naturally when you are moving fast and the backlog is full. It requires you to slow down and ask what you are actually building - not in terms of features, but in terms of the thing a customer would take ownership of, operate independently, and stake their own reputation on. That is a different standard than passing your test suite. It is a harder one.",[10,782,783],{},"But it is also where engineering becomes interesting in a way that pure technical depth rarely matches. When you understand the business well enough to make architectural decisions that preserve future revenue options, you are no longer just implementing someone else's vision. You are shaping the product's possible futures. That is leverage of a different kind - not the leverage of writing faster code or designing more elegant abstractions, but the leverage of making choices today that compound into distribution tomorrow.",[10,785,786,787,792],{},"John Carmack once said the most important thing an engineer can do is ",[14,788,791],{"href":789,"rel":790},"https://x.com/ID_AA_Carmack/status/1637087219591659520",[18],"build full product skills",". I used to read that as advice about career positioning. Working through this, I think it means something more specific: learn to see the economic system your technical system lives in. Features are temporary. Architectural commitments are long. A business model encoded in a data structure outlasts the engineer who designed it.",[10,794,795],{},"The business-minded engineer does not stop caring about the craft. If anything, they care more - because they understand what the craft is in service of. Every clean abstraction is a future operator's sanity. Every well-chosen failure mode is a support ticket that never gets filed. Every deployment boundary that was thought through carefully is a market that remains reachable.",[10,797,798],{},"Software is the means by which businesses achieve mass distribution. You already knew that. The question is whether the software you are writing is ready to be distributed - not just deployed, not just maintained, but handed to someone else, in a corner of the internet you will never see, running a business you will never fully understand, solving a problem you helped make solvable.",[10,800,801],{},"Becoming a business-minded engineer doesn't mean every engineer should be writing pricing decks. It means understanding that every architectural choice is also a business choice - and that some of the most impactful technical work you'll do is quietly expanding the distribution surface of the thing you're building.",[10,803,804],{},"That is the bar. Build to it.",{"title":355,"searchDepth":356,"depth":356,"links":806},[807,808,809],{"id":720,"depth":359,"text":721},{"id":751,"depth":359,"text":752},{"id":773,"depth":359,"text":774},"business-dev/adding-more-people-to-a-project.webp","2026-03-01T11:58:15.409Z","The mindset shift - from builder to distributor.",{},"/indulge/business-minded-development","---\ntitle: Business-driven Development\ncoverImage: business-dev/adding-more-people-to-a-project.webp\ndate: 2026-03-01T11:58:15.409Z\ndescription: The mindset shift - from builder to distributor.\ndraft: false\nfeatured: false\ngroup: Distributed Systems Field Notes\ninitial: false\nrank: 1\nreadTime: 5\nseries: true\nseriesCover: false\nsubtitle: What licensing Navengine taught me about distribution\ntags:\n  - distributed systems\n  - product engineering\n  - infrastructure as code\n---\n\nWhat if your multi-tenant application could be shipped as a distributed SaaS? What if you could have a licensed version of your product as an installable on some corner of the internet? What if we could break the barrier of what it meant to be a revenue generating company? Let's begin.\n\nSoftware is the means by which businesses achieve mass distribution. Beyond technical acumen and efficiency, software is the bus through which businesses achieve scale.\n\nOver the quarter, I have been working on software distribution. Specifically: licensing. Think of it in terms of introducing a new avenue of revenue. We dare ask: Do the businesses that *value this solution want control over where their data lives? Are they willing to pay a premium over this control?*\n\nThe answer, in both cases, was yes and that opened a door I had not thought to knock on before.\n\nI had to stop thinking about features and lean towards markets and distribution surfaces. Distribution, in this sense, is not about deployments and pipelines. It is about understanding that different buyers have fundamentally different relationships with trust, compliance, and infrastructure ownership. Your architecture either accommodates those differences or silently forecloses them.\n\nBeing technical helped me deploy features product needed. Being business-minded led me to more questions. _What would it take to ship this as a product someone else operates? What are we assuming about shared infrastructure that a regulated industry, a government agency, or a security-conscious enterprise would never accept?_\n\nThe answers to those questions are not found in a ticket or a sprint. They surface when you sit long enough with the business model to let it ask questions back at you.\n\n### Licensing as a pricing model\n\nFor [Navengine](https://navengine.encha.cloud), the questions came back as licensing. Once you accept that a buyer might want to run your software in their own environment - air-gapped, on-premise, inside a VPS they control - you need a mechanism that lets the software know it is legitimate without phoning home in ways that violate their security posture. You need entitlements, activation flows, machine-bound licenses and expiry.\n\n::div{.max-w-2xl.mx-auto.text-center.text-xs}\n![forbidden](/business-dev/forbidden-problems.webp)_It turns out the problem I was solving was not purely technical._\n::\n\nSomewhere in the middle of designing the activation flow, I realised the license schema was not a technical artifact. It was a pricing model. The fields I was choosing - seats, features, expiry dates, activation limits - were decisions about how we intended to capture value, just expressed as database columns. It was literally us deciding how we wanted to make money, written in schema form. And no product manager or founder had handed me a neat spec sheet. I was the one typing those business decisions into code.\n\nThat kind of realisation doesn’t land with a dramatic “aha!” moment and applause. It creeps in quietly. You’re just fiddling with fields one afternoon… and then, almost without noticing, the way you look at your own codebase has already changed. You start reading the same migrations and models like they’re business strategy documents instead of “just” backend plumbing.\n\n### The second-order effects arrive\n\nWhen you decide to support self-hosted deployment, you are not making a DevOps decision. You are ratifying a set of architectural choices that were either made deliberately or inherited by accident. Configuration that was hardcoded because \"we only have one environment\" now needs to be externalized. Database assumptions that worked fine in a shared-infrastructure model now need isolation boundaries. Upgrade paths that were previously your problem - a migration you ran on a schedule you controlled - become your customer's problem, which means they become your support problem, which means they were always your design problem.\n\nThe business-minded engineer understands this before the contract is signed. They look at a feature and ask not just \"how do we build this\" but \"how does this behave when someone else is operating it?\" That is a different question and it produces different code. It produces code that fails loudly with actionable errors instead of silently with corrupted state. It produces configuration schema that are documented because they have to be, not because someone found time. It produces container images that carry their dependencies rather than assuming a shared environment that may not exist on the other side of a firewall.\n\nContainerizing Navengine using Flatcar images was not primarily a reliability choice - it was a distribution choice. The image had to be self-contained because I could not know what the environment on the other side looked like. Keygen had to be reachable at activation but not required at runtime, because an installation behind a firewall cannot tolerate a dependency on an external service it may never reach. None of that came from an architecture review. It came from thinking hard about the buyer and working backwards from their constraints.\n\nThat backward motion - from buyer to architecture - is the discipline that business-minded engineers practice. It is less intuitive than building forward from requirements, and it is rarely taught, because most engineering education treats the business as a context for the technical problem rather than as a force that shapes the technical solution. But the shape of a system tells you exactly what assumptions its builders made about how it would be used, and by whom, and under what conditions.\n\nIf Navengine could only really be operated, understood, or debugged by the people who built it… it would cease to be a product. It would be a service that’s been dressed up in product clothing.\n\nThe distinction matters because services and products scale differently. A service scales with people - support engineers, customer success managers, implementation specialists. A product scales with copies. When you ship a licensed, self-hosted deployment, you are betting that the copy can stand on its own. That bet is won or lost in the architecture, long before the first installation.\n\n### None of this is free.\n\nI will not pretend this is clean. Supporting two distribution surfaces - a managed SaaS and a self-hosted licensed product - means every feature has to answer for itself in both worlds. Every abstraction either holds across deployment models or eventually creates a seam you will debug at the worst possible time. The surface area grows and so does the discipline required to keep it coherent.\n\nThis is why most teams never do it. Not because it is technically beyond them, but because it requires a kind of thinking that does not come naturally when you are moving fast and the backlog is full. It requires you to slow down and ask what you are actually building - not in terms of features, but in terms of the thing a customer would take ownership of, operate independently, and stake their own reputation on. That is a different standard than passing your test suite. It is a harder one.\n\nBut it is also where engineering becomes interesting in a way that pure technical depth rarely matches. When you understand the business well enough to make architectural decisions that preserve future revenue options, you are no longer just implementing someone else's vision. You are shaping the product's possible futures. That is leverage of a different kind - not the leverage of writing faster code or designing more elegant abstractions, but the leverage of making choices today that compound into distribution tomorrow.\n\nJohn Carmack once said the most important thing an engineer can do is [build full product skills](https://x.com/ID_AA_Carmack/status/1637087219591659520). I used to read that as advice about career positioning. Working through this, I think it means something more specific: learn to see the economic system your technical system lives in. Features are temporary. Architectural commitments are long. A business model encoded in a data structure outlasts the engineer who designed it.\n\nThe business-minded engineer does not stop caring about the craft. If anything, they care more - because they understand what the craft is in service of. Every clean abstraction is a future operator's sanity. Every well-chosen failure mode is a support ticket that never gets filed. Every deployment boundary that was thought through carefully is a market that remains reachable.\n\nSoftware is the means by which businesses achieve mass distribution. You already knew that. The question is whether the software you are writing is ready to be distributed - not just deployed, not just maintained, but handed to someone else, in a corner of the internet you will never see, running a business you will never fully understand, solving a problem you helped make solvable.\n\nBecoming a business-minded engineer doesn't mean every engineer should be writing pricing decks. It means understanding that every architectural choice is also a business choice - and that some of the most impactful technical work you'll do is quietly expanding the distribution surface of the thing you're building.\n\nThat is the bar. Build to it.\n",{"title":688,"description":812},"indulge/business-minded-development","What licensing Navengine taught me about distribution",[384,820,821],"product engineering","infrastructure as code","m0XQN8kMlDk4H0ul6HmJobxeX86OeqD6a_zxcb5rLTA",{"id":824,"title":372,"body":825,"coverImage":380,"date":829,"description":677,"draft":369,"extension":370,"featured":369,"group":372,"initial":369,"meta":830,"navigation":371,"path":831,"rank":377,"rawbody":832,"readTime":377,"seo":833,"series":371,"seriesCover":371,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":834,"subtitle":835,"tags":836,"__hash__":837},"indulge/indulge/distributed_systems_field_notes.md",{"type":7,"value":826,"toc":827},[],{"title":355,"searchDepth":356,"depth":356,"links":828},[],"2026-04-06T21:25:00.176Z",{},"/indulge/distributed_systems_field_notes","---\ntitle: Distributed Systems Field Notes\nseries: true\nseriesCover: true\ngroup: Distributed Systems Field Notes\ndescription: Hard-won insights from architecting and operating systems at scale. Patterns, anti-patterns and war stories.\nfeatured: false\ndraft: false\nrank: 5\nsubtitle: Scalability\ntags:\n  - distributed systems\n---\n",{"title":372,"description":677},"indulge/distributed_systems_field_notes","Scalability",[384],"H9AYbhaTFhaIKdKQPHDtgoPQvkksqsHlWiaRna-bWk0",[839,963,1047,1285,1409,1714,2506,2557,2662,2767,3075,3181,3362,3401,3511,3647,3681],{"id":840,"title":841,"body":842,"coverImage":380,"date":950,"description":951,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":952,"navigation":371,"path":953,"rank":954,"rawbody":955,"readTime":377,"seo":956,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":957,"subtitle":958,"tags":959,"__hash__":962},"indulge/indulge/a-call-to-dream.md","A call to dream",{"type":7,"value":843,"toc":948},[844,847,850,853,858,865,868,876,890,898,901,904,907,928,930,935,940],[10,845,846],{},"Orville and Wilbur Wright are known for their invention of, amongst other things, the first airplane. Less known, however, are their lives before this pinnacle of achievement - the people they were and the circumstances that led them to be who they were.",[10,848,849],{},"An observation I have made from the most diligent and creative individuals the world has ever seen is that they are highly imaginative and stay persistent - knowing how to handle hard well. These are individuals that stay true to their inner selves and keep their minds in a constant state of wanderlust.",[10,851,852],{},"In 2021, we witnessed the launch of the first human-carrying reusable rocket - an undeniable feat in human achievement. To quote a news reporter at the time:",[58,854,855],{},[10,856,857],{},"The next people we're going to fly to Space are the artists and poets. People who can tell the story.",[10,859,860,861,864],{},"Or in lay terms: ‘",[31,862,863],{},"we shall take the people that shall inspire the next generation of convention breakers","’.",[10,866,867],{},"In the 1960s, television premiered the birth of Star Trek - a fictional film that depicted man at war with other worlds. Along with it, came an induction of the creator’s thoughts and visions to the minds of young scientists - a preview of the possibilities ahead. From communicators, voice interactive computers, telepresence to bionic eyes, the generation of outliers that watched the show and others like it would later breath these items to life. Motorolla’s flip phone and Google’s echo bot are all examples of what started as a pipe dream. As if to crown it, we now have voice-driven development(VDD) as part and parcel of the modern software engineer’s build process.",[58,869,870],{},[10,871,872,873],{},"“Before the cylinder fell there was a general persuasion that through all the deep of space no life existed beyond the petty surface of our minute sphere. Now we see further. If the Martians can reach Venus, there is no reason to suppose that the thing is impossible for men.”\n~ ",[63,874,875],{},"Herbert George Wells, War of Worlds, 1898",[10,877,878,879,226,884,889],{},"Ask any child in the 1980s what their favourite toys were and 7 out of 10 would have spurted a lightsaber - an adaptation from the 1977 film, Star Wars - filled with descriptions of sliding doors and holographic projections. Less than a century later, whole industries; be it the military - R&D missile deflector in 2017, ",[14,880,883],{"href":881,"rel":882},"https://www.am-cb.net/en/projets/equinoxe",[18],"museums and works of art",[14,885,888],{"href":886,"rel":887},"https://www.smithsonianmag.com/smart-news/german-circus-uses-stunning-holograms-instead-live-animal-performers-180972376/",[18],"entertainment"," would all thrive from a ‘once far-fetched’. All of this; realization of what humanity could achieve when it is truly inspired; using technology to chase our imagination, knowing we shall never catch it.",[58,891,892],{},[10,893,894,895],{},"“And in her ears the little seashells, the thimble radios tamped tight, and an electronic ocean of sound, of music and talk and music and talk coming in, coming in on the shore of her unsleeping mind.” ",[63,896,897],{},"Fahrenheit, Ray Bradbury, 1950",[10,899,900],{},"(The earbuds were invented 30 years later)",[10,902,903],{},"Often, history will remember the leaps of scientific advancements but fail to acknowledge the influence of fiction and the creators of such fiction on the achievement of superior craftsmanship.",[10,905,906],{},"Like it or not, the future is here and it is up to you to choose whether or not you will answer the call - a choice of how you look at art and fiction. It is time to create more artists and teach our young about poetry and the art of storytelling. If history has taught us anything, they are the ones that drive the next era of human innovation.",[58,908,909,914],{},[10,910,911],{},[63,912,913],{},"Indulge:",[10,915,916,921,922,927],{},[14,917,920],{"href":918,"rel":919},"https://base-xperiential.com/",[18],"Base Hologram"," made a world tour of ",[14,923,926],{"href":924,"rel":925},"https://www.instagram.com/p/B5GFQH_HB6K/",[18],"Roy Orbinson"," streamed across multiple countries back in 2018. A re-living of artists beyond their time.",[39,929],{},[10,931,932],{},[63,933,934],{},"Updates",[10,936,937],{},[63,938,939],{},"13th May 2023",[58,941,942],{},[10,943,944,945],{},"We’ve progressed from a society of farmers to a society of factory workers to a society of knowledge workers. And now we’re progressing yet again—to a society of creators and empathizers, of pattern recognizers and meaning makers. We’ve moved from an economy built on people’s backs to an economy built on people’s left-brains to what is emerging today: an economy and society built more and more on people’s right-brains. - ",[31,946,947],{},"Daniel Pink, A Whole New Mind: Why Right-Brainers Will Rule The Future",{"title":355,"searchDepth":356,"depth":356,"links":949},[],"12/12/2024","Bridging science and the realm of fiction. Understanding the great inventors of old and the paths that led them to who they were.",{},"/indulge/a-call-to-dream",15,"---\ntitle: A call to dream\nsubtitle: The place of imagination in science\ndescription: Bridging science and the realm of fiction. Understanding the great\n  inventors of old and the paths that led them to who they were.\ndate: 12/12/2024\nfeatured: false\nrank: 15\ntags: [technology, science]\n---\n\nOrville and Wilbur Wright are known for their invention of, amongst other things, the first airplane. Less known, however, are their lives before this pinnacle of achievement - the people they were and the circumstances that led them to be who they were.\n\nAn observation I have made from the most diligent and creative individuals the world has ever seen is that they are highly imaginative and stay persistent - knowing how to handle hard well. These are individuals that stay true to their inner selves and keep their minds in a constant state of wanderlust.\n\nIn 2021, we witnessed the launch of the first human-carrying reusable rocket - an undeniable feat in human achievement. To quote a news reporter at the time:\n\n> The next people we're going to fly to Space are the artists and poets. People who can tell the story.\n\nOr in lay terms: ‘*we shall take the people that shall inspire the next generation of convention breakers*’.\n\nIn the 1960s, television premiered the birth of Star Trek - a fictional film that depicted man at war with other worlds. Along with it, came an induction of the creator’s thoughts and visions to the minds of young scientists - a preview of the possibilities ahead. From communicators, voice interactive computers, telepresence to bionic eyes, the generation of outliers that watched the show and others like it would later breath these items to life. Motorolla’s flip phone and Google’s echo bot are all examples of what started as a pipe dream. As if to crown it, we now have voice-driven development(VDD) as part and parcel of the modern software engineer’s build process.\n\n> “Before the cylinder fell there was a general persuasion that through all the deep of space no life existed beyond the petty surface of our minute sphere. Now we see further. If the Martians can reach Venus, there is no reason to suppose that the thing is impossible for men.”\n> \\~ **Herbert George Wells, War of Worlds, 1898**\n\nAsk any child in the 1980s what their favourite toys were and 7 out of 10 would have spurted a lightsaber - an adaptation from the 1977 film, Star Wars - filled with descriptions of sliding doors and holographic projections. Less than a century later, whole industries; be it the military - R\\&D missile deflector in 2017, [museums and works of art](https://www.am-cb.net/en/projets/equinoxe) and [entertainment](https://www.smithsonianmag.com/smart-news/german-circus-uses-stunning-holograms-instead-live-animal-performers-180972376/) would all thrive from a ‘once far-fetched’. All of this; realization of what humanity could achieve when it is truly inspired; using technology to chase our imagination, knowing we shall never catch it.\n\n> “And in her ears the little seashells, the thimble radios tamped tight, and an electronic ocean of sound, of music and talk and music and talk coming in, coming in on the shore of her unsleeping mind.” **Fahrenheit, Ray Bradbury, 1950**\n\n(The earbuds were invented 30 years later)\n\nOften, history will remember the leaps of scientific advancements but fail to acknowledge the influence of fiction and the creators of such fiction on the achievement of superior craftsmanship.\n\nLike it or not, the future is here and it is up to you to choose whether or not you will answer the call - a choice of how you look at art and fiction. It is time to create more artists and teach our young about poetry and the art of storytelling. If history has taught us anything, they are the ones that drive the next era of human innovation.\n\n> **Indulge:**\n>\n> [Base Hologram](https://base-xperiential.com/) made a world tour of [Roy Orbinson](https://www.instagram.com/p/B5GFQH_HB6K/) streamed across multiple countries back in 2018. A re-living of artists beyond their time.\n\n---\n\n**Updates**\n\n**13th May 2023**\n\n> We’ve progressed from a society of farmers to a society of factory workers to a society of knowledge workers. And now we’re progressing yet again—to a society of creators and empathizers, of pattern recognizers and meaning makers. We’ve moved from an economy built on people’s backs to an economy built on people’s left-brains to what is emerging today: an economy and society built more and more on people’s right-brains. - *Daniel Pink, A Whole New Mind: Why Right-Brainers Will Rule The Future*\n",{"title":841,"description":951},"indulge/a-call-to-dream","The place of imagination in science",[960,961],"technology","science","kjVnbRLLs3NYyoGLohTO5j3rdCF7jdVD5HONIAxYacM",{"id":687,"title":688,"body":964,"coverImage":810,"date":811,"description":812,"draft":369,"extension":370,"featured":369,"group":372,"initial":369,"meta":1044,"navigation":371,"path":814,"rank":375,"rawbody":815,"readTime":377,"seo":1045,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":817,"subtitle":818,"tags":1046,"__hash__":822},{"type":7,"value":965,"toc":1039},[966,968,970,974,976,978,982,984,986,991,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026,1031,1033,1035,1037],[10,967,693],{},[10,969,696],{},[10,971,699,972],{},[31,973,702],{},[10,975,705],{},[10,977,708],{},[10,979,711,980],{},[31,981,714],{},[10,983,717],{},[42,985,721],{"id":720},[10,987,724,988,730],{},[14,989,729],{"href":727,"rel":990},[18],[167,992,994],{"className":993},[170,171,172,173],[10,995,996,998],{},[177,997],{"alt":738,"src":739},[31,999,742],{},[10,1001,745],{},[10,1003,748],{},[42,1005,752],{"id":751},[10,1007,755],{},[10,1009,758],{},[10,1011,761],{},[10,1013,764],{},[10,1015,767],{},[10,1017,770],{},[42,1019,774],{"id":773},[10,1021,777],{},[10,1023,780],{},[10,1025,783],{},[10,1027,786,1028,792],{},[14,1029,791],{"href":789,"rel":1030},[18],[10,1032,795],{},[10,1034,798],{},[10,1036,801],{},[10,1038,804],{},{"title":355,"searchDepth":356,"depth":356,"links":1040},[1041,1042,1043],{"id":720,"depth":359,"text":721},{"id":751,"depth":359,"text":752},{"id":773,"depth":359,"text":774},{},{"title":688,"description":812},[384,820,821],{"id":4,"title":5,"body":1048,"coverImage":366,"date":367,"description":368,"draft":369,"extension":370,"featured":371,"group":372,"initial":369,"meta":1282,"navigation":371,"path":374,"rank":375,"rawbody":376,"readTime":377,"seo":1283,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":381,"subtitle":382,"tags":1284,"__hash__":389},{"type":7,"value":1049,"toc":1273},[1050,1058,1062,1064,1066,1068,1070,1072,1074,1076,1084,1086,1088,1090,1100,1102,1104,1106,1108,1116,1124,1130,1132,1134,1142,1144,1146,1155,1157,1165,1167,1169,1171,1173,1175,1179,1185,1187,1189,1191,1193,1201,1203,1205,1207,1209,1211,1213,1217,1228,1236,1238,1246,1248,1252,1254,1258,1260,1265,1267,1269,1271],[10,1051,12,1052,20,1055,26],{},[14,1053,19],{"href":16,"rel":1054},[18],[14,1056,25],{"href":23,"rel":1057},[18],[10,1059,29,1060,34],{},[31,1061,33],{},[10,1063,37],{},[39,1065],{},[42,1067,45],{"id":44},[10,1069,48],{},[10,1071,51],{},[10,1073,54],{},[39,1075],{},[58,1077,1078],{},[10,1079,1080,66,1082],{},[63,1081,65],{},[31,1083,69],{},[39,1085],{},[42,1087,75],{"id":74},[10,1089,78],{},[10,1091,81,1092,86,1094,90,1096,94,1098,97],{},[83,1093,85],{},[83,1095,89],{},[83,1097,93],{},[83,1099,93],{},[10,1101,100],{},[39,1103],{},[42,1105,106],{"id":105},[10,1107,109],{},[10,1109,112,1110,116,1112,120,1114,123],{},[83,1111,115],{},[83,1113,119],{},[83,1115,119],{},[10,1117,126,1118,130,1120,133,1122,136],{},[83,1119,129],{},[83,1121,93],{},[83,1123,93],{},[10,1125,139,1126,142,1128,145],{},[83,1127,93],{},[83,1129,115],{},[10,1131,148],{},[39,1133],{},[58,1135,1136],{},[10,1137,1138,66,1140],{},[63,1139,65],{},[31,1141,159],{},[39,1143],{},[42,1145,165],{"id":164},[167,1147,1149],{"className":1148},[170,171,172,173],[10,1150,1151,1153],{},[177,1152],{"alt":179,"src":180},[31,1154,183],{},[10,1156,186],{},[10,1158,189,1159,192,1161,196,1163,199],{},[83,1160,115],{},[83,1162,195],{},[83,1164,93],{},[10,1166,202],{},[10,1168,205],{},[10,1170,208],{},[39,1172],{},[42,1174,214],{"id":213},[10,1176,1177],{},[31,1178,219],{},[10,1180,222,1181,226,1183,230],{},[83,1182,225],{},[83,1184,229],{},[10,1186,233],{},[10,1188,236],{},[10,1190,239],{},[39,1192],{},[58,1194,1195],{},[10,1196,1197,66,1199],{},[63,1198,65],{},[31,1200,250],{},[39,1202],{},[42,1204,256],{"id":255},[10,1206,259],{},[10,1208,262],{},[10,1210,265],{},[39,1212],{},[10,1214,1215],{},[63,1216,272],{},[167,1218,1220],{"className":1219},[170,171,172,173],[10,1221,1222,1224],{},[177,1223],{"alt":280,"src":281},[31,1225,284,1226,288],{},[63,1227,287],{},[10,1229,291,1230,294,1232,298,1234,301],{},[83,1231,129],{},[83,1233,297],{},[83,1235,93],{},[39,1237],{},[58,1239,1240],{},[10,1241,1242,66,1244],{},[63,1243,65],{},[31,1245,312],{},[39,1247],{},[42,1249,1250],{"id":317},[63,1251,320],{},[10,1253,323],{},[10,1255,326,1256],{},[31,1257,329],{},[10,1259,332],{},[10,1261,335,1262,341],{},[14,1263,340],{"href":338,"rel":1264},[18],[10,1266,344],{},[10,1268,347],{},[10,1270,350],{},[10,1272,353],{},{"title":355,"searchDepth":356,"depth":356,"links":1274},[1275,1276,1277,1278,1279,1280,1281],{"id":44,"depth":359,"text":45},{"id":74,"depth":359,"text":75},{"id":105,"depth":359,"text":106},{"id":164,"depth":359,"text":165},{"id":213,"depth":359,"text":214},{"id":255,"depth":359,"text":256},{"id":317,"depth":359,"text":320},{},{"title":5,"description":379},[384,385,386,387,388],{"id":1286,"title":1287,"body":1288,"coverImage":380,"date":1398,"description":1399,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":1400,"navigation":371,"path":1401,"rank":377,"rawbody":1402,"readTime":377,"seo":1403,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":1404,"subtitle":1405,"tags":1406,"__hash__":1408},"indulge/indulge/futurism.md","Futurism",{"type":7,"value":1289,"toc":1396},[1290,1317,1328,1331,1336,1339,1344,1347,1352,1357,1364,1373,1376,1379,1386],[10,1291,1292,1293,1298,1299,1304,1305,1308,1309,1312,1313,1316],{},"I first got into technology from reading books such as ",[14,1294,1297],{"href":1295,"rel":1296},"https://www.goodreads.com/book/show/945577.The_Random_House_Book_of_1001_Wonders_of_Science",[18],"1001 Wonders of Science"," by Brian and Brenda Williams and ",[14,1300,1303],{"href":1301,"rel":1302},"https://www.goodreads.com/book/show/29427784-366-questions-and-answers",[18],"366 Questions and Answers"," by Brown Watson. My childhood was filled with stories such as Hero of Alexandria, the fastest planes that existed at the time, dinosaurs and Sunday afternoon narrations from David Attenborough. It was fascinating how everything seemed to mesh and collapse into each other. A kind of retrofuturism that I admired. This was in the early 2000's and right after the 1999 IT debacle where there was a muddle of '",[31,1306,1307],{},"everything is possible","' , '",[31,1310,1311],{},"we need to be cautious","' and '",[31,1314,1315],{},"the world has gone to doom","'.",[10,1318,1319,1320,1323,1324,1327],{},"Rightly so, play, for me, translated to toying with magnets, using magnifying lenses as cookers, charcoal coolers, some DIY water filters and every once in a while, mixing up concoctions to inject into plants to see ",[31,1321,1322],{},"what could possibly happen"," - an echo of ",[31,1325,1326],{},"Letters to a Young Scientist"," by Edward O. Wilson. These early experiences molded my mental fortitude in chasing scientific evidence, going against the grain and building a new, effectively guiding my choices on what I wanted to do.",[10,1329,1330],{},"The concept of futurism has been in existence ever since the industrial revolution ( steampunk, archeofuturism, atom-futurism, solar-punk and cyberpunk). Consequently, each generation has had its brush and influence based on the time period. For once, steampunk celebrated the mechanical ingenuity of steam power, archeofuturism longed for a fusion of ancient wisdom with modern ambition, while cyberpunk questioned the ethics of unchecked progress and solarpunk imagined harmony between nature and technology. I find myself drawn to these visions — not because they predict the future accurately but because they expose our collective hopes and anxieties - AGI placed in frame.",[58,1332,1333],{},[10,1334,1335],{},"What do we foresee in our near future ? Does technology have any say into what we see or choose not to?",[10,1337,1338],{},"Not withstanding, our advancement has led to just as many problems as the alleviation it has created. For one, we created printing that helped diffuse the work of Issac Newton just as much as Luther's Theses contributed to the St. Bartholomew’s Day Massacre and the Thirty Years’ War. Similarly, we created intelligence to help speed up solving climate change in the same breath as we cut down our forests to create data centers. Should you dare go back a step, soar the air to explore just as much as we started using planes for warfare barely a decade later.",[10,1340,1341],{},[177,1342],{"alt":1287,"src":1343},"https://res.cloudinary.com/dlxhllkxl/image/upload/v1761311914/Indulge/futurism_gghort.png",[1345,1346],"h4",{"id":355},[58,1348,1349],{},[10,1350,1351],{},"Indulge: Do we march forward with wisdom from the past, anchor ourselves in myth and tradition - or run to a future 1001 possibilities?",[10,1353,1354],{},[31,1355,1356],{},"We are left to ponder. What path do we lean on today? What impact does it have on our futures? How essential is it to the future we want?",[10,1358,1359,1360,1363],{},"As I have come to learn from science so far, scientists that '",[31,1361,1362],{},"make it'"," are those that take the unbeaten path. Those that seek science for curiosity sake. As Wilson would have it:",[58,1365,1366],{},[10,1367,1368,1369,1372],{},"\" ",[31,1370,1371],{},"If a subject is already receiving a great deal of attention, if it has a glamorous aura, if its practitioners are prizewinners who receive large grants, stay away from that subject. Listen to the news coming from the current hubbub, learn how and why the subject became prominent, but in making your own long-term plans be aware it is already crowded with talented people. You would be a newcomer, a private amid bemedaled first sergeants and generals. Take a subject instead that interests you and looks promising, and where established experts are not yet conspicuously competing with one another, where few if any prizes and academy memberships have been given, and where the annals of research are not yet layered with superfluous data and mathematical models. You may feel lonely and insecure in your first endeavors, but, all other things being equal, your best chance to make your mark and to experience the thrill of discovery will be there.","\"",[10,1374,1375],{},"Charting your future in the plethora of choices requires a certain gusto. It requires avid dreaming and imagination. Your task is to waddle through the noise to find what you want and pursue it as long as it gives you personal fulfillment. The best way to do this? Perform small , informal experiments. The risk of time is small but the mine that you might stumble upon ... Your task is to disturb nature and see if she reveals her secrets - a direct correlation to futurism not required.",[10,1377,1378],{},"Obey your passion for as long as it lasts , sample other subjects and be smart enough to switch to a greater love should one appear. You, in the end, are a summation of the content you consume, the circles you engage and the adventures you pursue. Perhaps the future has always been less about what we build, and more about what we dare to believe is possible - what tickles our curiosity.",[10,1380,1381,1382,1385],{},"Amidst the punk and futurism lies the next philosophy: one that acknowledges the algorithm without surrendering the soul. One that honors the data but still seeks meaning beyond it. One that does not drown in ",[31,1383,1384],{},"et al."," I choose to live as a research scientist at the fault line of wonder and consequence — chasing the same awe that once lit my childhood, now tempered by the weight of knowing what it costs to build.",[10,1387,1388,1391,1392,1395],{},[63,1389,1390],{},"PS:"," Despite all circumstances, you ",[31,1393,1394],{},"author"," your future.",{"title":355,"searchDepth":356,"depth":356,"links":1397},[],"11/1/2025","A meditation on science, technology and imagination - weaving childhood wonder with the evolving futurism. Exploring invention as a mirror of our values and curiosity as a tool.",{},"/indulge/futurism","---\ntitle: Futurism\ndate: 11/1/2025\ndescription: A meditation on science, technology and imagination - weaving childhood wonder with the evolving futurism. Exploring invention as a mirror of our values and curiosity as a tool.\nfeatured: false\nrank: 5\nreadTime: 5\nsubtitle: My Letter to the Young Scientist\ntags:\n  - futurism\n---\n\nI first got into technology from reading books such as [1001 Wonders of Science](https://www.goodreads.com/book/show/945577.The_Random_House_Book_of_1001_Wonders_of_Science) by Brian and Brenda Williams and [366 Questions and Answers](https://www.goodreads.com/book/show/29427784-366-questions-and-answers) by Brown Watson. My childhood was filled with stories such as Hero of Alexandria, the fastest planes that existed at the time, dinosaurs and Sunday afternoon narrations from David Attenborough. It was fascinating how everything seemed to mesh and collapse into each other. A kind of retrofuturism that I admired. This was in the early 2000's and right after the 1999 IT debacle where there was a muddle of '*everything is possible*' , '*we need to be cautious*' and '*the world has gone to doom*'.\n\nRightly so, play, for me, translated to toying with magnets, using magnifying lenses as cookers, charcoal coolers, some DIY water filters and every once in a while, mixing up concoctions to inject into plants to see *what could possibly happen* - an echo of *Letters to a Young Scientist* by Edward O. Wilson. These early experiences molded my mental fortitude in chasing scientific evidence, going against the grain and building a new, effectively guiding my choices on what I wanted to do.\n\nThe concept of futurism has been in existence ever since the industrial revolution ( steampunk, archeofuturism, atom-futurism, solar-punk and cyberpunk). Consequently, each generation has had its brush and influence based on the time period. For once, steampunk celebrated the mechanical ingenuity of steam power, archeofuturism longed for a fusion of ancient wisdom with modern ambition, while cyberpunk questioned the ethics of unchecked progress and solarpunk imagined harmony between nature and technology. I find myself drawn to these visions — not because they predict the future accurately but because they expose our collective hopes and anxieties - AGI placed in frame.\n\n> What do we foresee in our near future ? Does technology have any say into what we see or choose not to?\n\nNot withstanding, our advancement has led to just as many problems as the alleviation it has created. For one, we created printing that helped diffuse the work of Issac Newton just as much as Luther's Theses contributed to the St. Bartholomew’s Day Massacre and the Thirty Years’ War. Similarly, we created intelligence to help speed up solving climate change in the same breath as we cut down our forests to create data centers. Should you dare go back a step, soar the air to explore just as much as we started using planes for warfare barely a decade later.\n\n![Futurism](https://res.cloudinary.com/dlxhllkxl/image/upload/v1761311914/Indulge/futurism_gghort.png)\n\n####\n\n> Indulge: Do we march forward with wisdom from the past, anchor ourselves in myth and tradition - or run to a future 1001 possibilities?\n\n*We are left to ponder. What path do we lean on today? What impact does it have on our futures? How essential is it to the future we want?*\n\nAs I have come to learn from science so far, scientists that '*make it'* are those that take the unbeaten path. Those that seek science for curiosity sake. As Wilson would have it:\n\n> \" *If a subject is already receiving a great deal of attention, if it has a glamorous aura, if its practitioners are prizewinners who receive large grants, stay away from that subject. Listen to the news coming from the current hubbub, learn how and why the subject became prominent, but in making your own long-term plans be aware it is already crowded with talented people. You would be a newcomer, a private amid bemedaled first sergeants and generals. Take a subject instead that interests you and looks promising, and where established experts are not yet conspicuously competing with one another, where few if any prizes and academy memberships have been given, and where the annals of research are not yet layered with superfluous data and mathematical models. You may feel lonely and insecure in your first endeavors, but, all other things being equal, your best chance to make your mark and to experience the thrill of discovery will be there.*\"\n\nCharting your future in the plethora of choices requires a certain gusto. It requires avid dreaming and imagination. Your task is to waddle through the noise to find what you want and pursue it as long as it gives you personal fulfillment. The best way to do this? Perform small , informal experiments. The risk of time is small but the mine that you might stumble upon ... Your task is to disturb nature and see if she reveals her secrets - a direct correlation to futurism not required.\n\nObey your passion for as long as it lasts , sample other subjects and be smart enough to switch to a greater love should one appear. You, in the end, are a summation of the content you consume, the circles you engage and the adventures you pursue. Perhaps the future has always been less about what we build, and more about what we dare to believe is possible - what tickles our curiosity.\n\nAmidst the punk and futurism lies the next philosophy: one that acknowledges the algorithm without surrendering the soul. One that honors the data but still seeks meaning beyond it. One that does not drown in *et al.* I choose to live as a research scientist at the fault line of wonder and consequence — chasing the same awe that once lit my childhood, now tempered by the weight of knowing what it costs to build.\n\n**PS:** Despite all circumstances, you *author* your future.\n",{"title":1287,"description":1399},"indulge/futurism","My Letter to the Young Scientist",[1407],"futurism","8ZsGOC4cRs5BVYlKG_ndxT_Uz_iPvbXAmnyI7BevJj0",{"id":1410,"title":1411,"body":1412,"coverImage":1702,"date":950,"description":1703,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":1704,"navigation":371,"path":1705,"rank":356,"rawbody":1706,"readTime":377,"seo":1707,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":1708,"subtitle":1709,"tags":1710,"__hash__":1713},"indulge/indulge/going-enterprise-and-its-aftermath.md","Going Enterprise and its Aftermath",{"type":7,"value":1413,"toc":1693},[1414,1417,1422,1425,1428,1433,1436,1442,1445,1448,1451,1454,1457,1460,1463,1466,1471,1474,1477,1482,1485,1488,1502,1505,1510,1513,1517,1520,1524,1528,1531,1535,1538,1541,1544,1548,1554,1557,1560,1563,1566,1571,1574,1579,1582,1585,1590,1593,1596,1599,1602,1605,1608,1611,1614,1617,1620,1623,1626,1629,1632,1635,1638,1642,1645,1649,1652,1655,1659,1668,1671,1676,1679,1684],[10,1415,1416],{},"I thought I knew what scalability was. Just the same way most of us thought we knew what distributed systems were.",[58,1418,1419],{},[10,1420,1421],{},"I realized I had to completely relearn these systems because of the cloud.\n~Satya Nadella",[10,1423,1424],{},"There are a number of considerations that you as a developer, architect or engineering team have to make as your user base grows. Going from products with 10 to say 30 or a million and so forth has its considerations. This, of course, depends on the user base we are talking about.",[10,1426,1427],{},"Remember astute reader, a customer can be an organisation with a plethora of other members inside it, or just as well be a single user called Jack.",[10,1429,1430],{},[63,1431,1432],{},"Explore with me",[10,1434,1435],{},"Imagine thousands, half a million and so forth people performing a search query against a server. If those queries land on your end, would it break? Would it be able to hold?",[10,1437,1438],{},[177,1439],{"alt":1440,"src":1441},"explore","/enterprise/explore.webp",[10,1443,1444],{},"We should be able to handle more data, more concurrent connections and higher interaction rates.",[10,1446,1447],{},"A note on interaction rate:",[10,1449,1450],{},"How often a user changes the interface on a blog application vs a game.",[10,1452,1453],{},"Before we begin, it is important to note that setting up our product for scalability should be as easy and cheap to grow 10x as it should at 0.2x as is common with startups whose needs change rapidly over a short period of time.",[10,1455,1456],{},"Foremost, there are two types of scaling we need to observe.",[10,1458,1459],{},"a) Vertical scalability",[10,1461,1462],{},"b) Horizontal scalability",[10,1464,1465],{},"Both of the aforementioned have their pros and cons - each with a use case which would be deemed fit. Let's narrow this down.",[10,1467,1468],{},[63,1469,1470],{},"Example :",[10,1472,1473],{},"For solo and relatively small ventures, you might opt for a VPS(virtual private server) which is essentially a physical machine holding multiple 'servers', yours included, each with its own OS and so forth. Once at a certain cap, you might see the need to increase resources and hence, the incremental hunt; more RAM, more storage, more CPU and so forth. almost everything gets more.",[10,1475,1476],{},"The example above, is one implementing vertical scaling, where, we upgrade the hardware and or the network throughput. In short, you do not need to modify your application architecture.",[1478,1479,1481],"h2",{"id":1480},"vertical-scalability","Vertical Scalability",[10,1483,1484],{},"Broken to bits, we resolve to a number of techniques.",[10,1486,1487],{},"Adding more drives in RAID arrays and thus distributing our reads and writes during database interaction.",[644,1489,1490,1493,1496,1499],{},[647,1491,1492],{},"Switching to solid-state drives from hard drives",[647,1494,1495],{},"Increasing the RAM",[647,1497,1498],{},"Adding more cores to the server to reduce the context switching.",[647,1500,1501],{},"Upgrading network adapters, especially for systems reliant on media file processing.",[10,1503,1504],{},"There are a number of drawbacks, however. For instance, the change to a solid-state drive might not show a significant difference if working with MySQL which uses its own data structures for sequential disk operations or Cassandra. At a certain point, lock contention is bound to catch up and here, more CPU does little to any good. Vertical scaling also comes with a steep financial cost as you add more and more given the cash input doubles or triples as a unit of resource is added.",[10,1506,1507],{},[63,1508,1509],{},"Example:",[10,1511,1512],{},"A RAM chip will double in cost as it grows in size. That is, x GB is $z , 2x GB is $2z and so forth. A reality check hits us once we get to a stage, say 128GB where the rules are not quite the same.",[1478,1514,1516],{"id":1515},"horizontal-scalability","Horizontal Scalability",[10,1518,1519],{},"The alternative and preferred method - horizontal scaling. While it may come at a steep cost initially, it does get significantly cheaper as your enterprise grows to reach more users. Let's see how.",[42,1521,1523],{"id":1522},"caching","Caching",[1345,1525,1527],{"id":1526},"use-of-content-delivery-networks-cdn","Use of content delivery networks (CDN)",[10,1529,1530],{},"To manage our assets, we save the hassle of having to perform the read and write operations on our own servers. Ever wondered why we have CDNs for most packages(Bootstrap, Material etc)?",[10,1532,1533],{},[63,1534,1509],{},[10,1536,1537],{},"We have our servers for, say UrbanDesk in South Africa. For access, an audacious Sergei (hint - thy knowest thyself) an enthusiastic early adopter from Germany, will hit the CDN(which are just data centres on their own). The CDN, acknowledging it lacks this data - images in our case, will hit our server for the resources it needs (CSS, images, javascript) and serve it to him while storing the same data and resources for further calls to the site. In this way, the next time, the call does not have to go a whole continent away.",[10,1539,1540],{},"Services like Cloudflare, Cloudinary or GoogleCloud CDN should ring a bell.",[10,1542,1543],{},"We have our static assets sorted out, but what about our data?",[1345,1545,1547],{"id":1546},"edge-cache-servers","Edge Cache Servers",[10,1549,1550],{},[177,1551],{"alt":1552,"src":1553},"edge cache servers","/enterprise/edge_cache.webp",[10,1555,1556],{},"I've expounded on the data server to include functional partitioning, yet , another enhancement to our scaling needs. The concept behind it is that our project should be decomposed into individual actions those components need to perform - to group components of our application based on what they do.",[10,1558,1559],{},"For instance, we have sections that address this page you are currently reading (thegreencodes.com), then others that speak to different types of users, say, those interested in merch (merch.thegreencodes.com), or the admin (admin.thegreencodes.com). Each of these sections has been compartmentalized.",[10,1561,1562],{},"We might also move the database to its own server and update our configs to point to it, hence to each its own, that is, the server the application runs and the server the database runs are different but still communicating.",[10,1564,1565],{},"You will notice that I also added the GeoDNS. It works very similarly to an ordinary DNS, the only difference being that it is ' geo-tagged '.",[10,1567,1568],{},[63,1569,1570],{},"The DNS",[10,1572,1573],{},"A Domain Name Server(DNS) is a way to identify your server's IP address on the web. In this way, if your server has an IP of say 127.0.0.1, it is displayed as example.com, to whoever else is looking at it.",[10,1575,1576],{},[63,1577,1578],{},"Back to GeoDNS",[10,1580,1581],{},"Essentially, when you attempt to connect to thegreencodes.com, the server IP will be resolved to the data centre closest to you.",[10,1583,1584],{},"Elaborately, once your product has a certain cap of users , serving all across the globe, having a single server in a single location might degrade the experience these very users get.",[10,1586,1587],{},[63,1588,1589],{},"Example",[10,1591,1592],{},"Google has multiple servers. While you might connect to its root domain from Australia and person B from Germany, these might not be served from the same server. The GeoDNS works to resolve the IP addresses of these servers/ data centers based on the location of the end user.",[10,1594,1595],{},"You will access the same data, only without knowledge of what IP the domain you are visiting is currently resolving to.",[10,1597,1598],{},"What makes horizontal scaling stand out is the basis on which it stands. At its core, horizontal scaling lets you deploy and maintain your project on several medium or small servers. A single server does not necessarily have to be extensive with vast amounts of resources - we split the load between different servers.",[10,1600,1601],{},"Of note, is that we need to consider whether our project is stateful or stateless. What this means is to identify whether the split needs data and whether that data needs to be synchronised.",[10,1603,1604],{},"Managing data in stateful horizontally scaled products",[10,1606,1607],{},"Behold, the CAP theorem and the ability to identify whether we need more reading or more writing of our database.",[10,1609,1610],{},"If we indeed have data that needs management, we might opt for three techniques.",[10,1612,1613],{},"a) Sharding by data",[10,1615,1616],{},"b) Sharding by hash",[10,1618,1619],{},"c) Data replication",[10,1621,1622],{},"On the one hand, we have sharding by data. In a case example similar to the one shown, we can have a database that holds data from those in Europe and another that holds data from those in America.",[10,1624,1625],{},"On the other hand, we can opt to use a consistent technique of hashing specific keys on our model and use those hashes to store data in different databases. For instance, hashing the profile_id and stating that data for users with the hash algorithm ABC will sit on this server and not the other.",[10,1627,1628],{},"The above are optimizations meant to prevent hitting the same database for all requests.",[10,1630,1631],{},"While not in-depth, I do intend to come back to this in future. So keep an eye up for this.",[10,1633,1634],{},"More than the type of scaling, we have to consider a number of techniques and practices to maintain.",[10,1636,1637],{},"As these platforms grow, the following have to be considered.",[1478,1639,1641],{"id":1640},"testing","Testing",[10,1643,1644],{},"There is more to testing than unit tests. Larger systems eventually comprise of larger subsystems. How these systems work together (integration testing), whether the application is behaving according to the specification(functional testing), whether it can handle different loads (performance testing) and so forth.",[1478,1646,1648],{"id":1647},"logging","Logging",[10,1650,1651],{},"The more the components, the more integration is needed and the more the system is prone to fail. The more servers we have, the higher the chances. We hope for the best, but prepare for the worst. Your team needs to know when a module went down, whether the data maintained its integrity, which modules are still up and so on.",[10,1653,1654],{},"Choose to go for the Crash-only approach; let the system always be ready for a crash and whenever it reboots, it should be able to continue without human interaction. An example of such a system is Netflix's Chaos Monkey which runs to kill random components of the system within working hours to test its reliability.",[1478,1656,1658],{"id":1657},"conclusion","Conclusion",[10,1660,1661,1662,1667],{},"The practices above are intertwined. Functional partitioning would lead to the decomposition of the project, decomposition would lead to a '",[14,1663,1666],{"href":1664,"rel":1665},"https://www.youtube.com/watch?v=GBTdnfD6s5Q",[18],"maybe","' use of microservices, this would bring a restructure of your team to smaller domain-driven teams, a change in how data is cached and managed and so forth. Build upon this. Go agile and iterate. This path is not linear, nor should it be treated as such.",[10,1669,1670],{},"Treat these principles as your northern star, but feel free to morph them based on the value they create for your business.",[10,1672,1673],{},[63,1674,1675],{},"Understand",[10,1677,1678],{},"In the creation of sustainable software applications, we place the business logic at the centre. The inverse, you'll find, will get you great code, rather than solving the need to be addressed.",[58,1680,1681],{},[10,1682,1683],{},"By placing technology first, we may get a great rails application, but it may not be a great pharmaceutical application ~ Robert C. Martin",[10,1685,1686,1687,1692],{},"Onto ",[14,1688,1691],{"href":1689,"rel":1690},"https://thegreencodes.com/series/architectural-patterns",[18],"Architecture"," - the stuff we wish we'd gotten right at the start of our project.",{"title":355,"searchDepth":356,"depth":356,"links":1694},[1695,1696,1699,1700,1701],{"id":1480,"depth":356,"text":1481},{"id":1515,"depth":356,"text":1516,"children":1697},[1698],{"id":1522,"depth":359,"text":1523},{"id":1640,"depth":356,"text":1641},{"id":1647,"depth":356,"text":1648},{"id":1657,"depth":356,"text":1658},"enterprise/cover.webp","Considerations in product scalability. An observation of software development from a business value model. Where code and business collide.",{},"/indulge/going-enterprise-and-its-aftermath","---\ntitle: Going Enterprise and its Aftermath\ncoverImage: enterprise/cover.webp\ndate: 12/12/2024\ndescription: Considerations in product scalability. An observation of software development from a business value model. Where code and business collide.\ndraft: false\nfeatured: false\ninitial: false\nrank: 2\nreadTime: 5\nseries: false\nseriesCover: false\nsubtitle: Up and away with scalability\ntags:\n  - software architecture\n  - system design\n---\n\nI thought I knew what scalability was. Just the same way most of us thought we knew what distributed systems were.\n\n> I realized I had to completely relearn these systems because of the cloud.\n> \\~Satya Nadella\n\nThere are a number of considerations that you as a developer, architect or engineering team have to make as your user base grows. Going from products with 10 to say 30 or a million and so forth has its considerations. This, of course, depends on the user base we are talking about.\n\nRemember astute reader, a customer can be an organisation with a plethora of other members inside it, or just as well be a single user called Jack.\n\n**Explore with me**\n\nImagine thousands, half a million and so forth people performing a search query against a server. If those queries land on your end, would it break? Would it be able to hold?\n\n![explore](/enterprise/explore.webp)\n\nWe should be able to handle more data, more concurrent connections and higher interaction rates.\n\nA note on interaction rate:\n\nHow often a user changes the interface on a blog application vs a game.\n\nBefore we begin, it is important to note that setting up our product for scalability should be as easy and cheap to grow 10x as it should at 0.2x as is common with startups whose needs change rapidly over a short period of time.\n\nForemost, there are two types of scaling we need to observe.\n\na) Vertical scalability\n\nb) Horizontal scalability\n\nBoth of the aforementioned have their pros and cons - each with a use case which would be deemed fit. Let's narrow this down.\n\n**Example :**\n\nFor solo and relatively small ventures, you might opt for a VPS(virtual private server) which is essentially a physical machine holding multiple 'servers', yours included, each with its own OS and so forth. Once at a certain cap, you might see the need to increase resources and hence, the incremental hunt; more RAM, more storage, more CPU and so forth. almost everything gets more.\n\nThe example above, is one implementing vertical scaling, where, we upgrade the hardware and or the network throughput. In short, you do not need to modify your application architecture.\n\n## Vertical Scalability\n\nBroken to bits, we resolve to a number of techniques.\n\nAdding more drives in RAID arrays and thus distributing our reads and writes during database interaction.\n\n- Switching to solid-state drives from hard drives\n- Increasing the RAM\n- Adding more cores to the server to reduce the context switching.\n- Upgrading network adapters, especially for systems reliant on media file processing.\n\nThere are a number of drawbacks, however. For instance, the change to a solid-state drive might not show a significant difference if working with MySQL which uses its own data structures for sequential disk operations or Cassandra. At a certain point, lock contention is bound to catch up and here, more CPU does little to any good. Vertical scaling also comes with a steep financial cost as you add more and more given the cash input doubles or triples as a unit of resource is added.\n\n**Example:**\n\nA RAM chip will double in cost as it grows in size. That is, x GB is $z , 2x GB is $2z and so forth. A reality check hits us once we get to a stage, say 128GB where the rules are not quite the same.\n\n## Horizontal Scalability\n\nThe alternative and preferred method - horizontal scaling. While it may come at a steep cost initially, it does get significantly cheaper as your enterprise grows to reach more users. Let's see how.\n\n### Caching\n\n#### Use of content delivery networks (CDN)\n\nTo manage our assets, we save the hassle of having to perform the read and write operations on our own servers. Ever wondered why we have CDNs for most packages(Bootstrap, Material etc)?\n\n**Example:**\n\nWe have our servers for, say UrbanDesk in South Africa. For access, an audacious Sergei (hint - thy knowest thyself) an enthusiastic early adopter from Germany, will hit the CDN(which are just data centres on their own). The CDN, acknowledging it lacks this data - images in our case, will hit our server for the resources it needs (CSS, images, javascript) and serve it to him while storing the same data and resources for further calls to the site. In this way, the next time, the call does not have to go a whole continent away.\n\nServices like Cloudflare, Cloudinary or GoogleCloud CDN should ring a bell.\n\nWe have our static assets sorted out, but what about our data?\n\n#### Edge Cache Servers\n\n![edge cache servers](/enterprise/edge_cache.webp)\n\nI've expounded on the data server to include functional partitioning, yet , another enhancement to our scaling needs. The concept behind it is that our project should be decomposed into individual actions those components need to perform - to group components of our application based on what they do.\n\nFor instance, we have sections that address this page you are currently reading (thegreencodes.com), then others that speak to different types of users, say, those interested in merch (merch.thegreencodes.com), or the admin (admin.thegreencodes.com). Each of these sections has been compartmentalized.\n\nWe might also move the database to its own server and update our configs to point to it, hence to each its own, that is, the server the application runs and the server the database runs are different but still communicating.\n\nYou will notice that I also added the GeoDNS. It works very similarly to an ordinary DNS, the only difference being that it is ' geo-tagged '.\n\n**The DNS**\n\nA Domain Name Server(DNS) is a way to identify your server's IP address on the web. In this way, if your server has an IP of say 127.0.0.1, it is displayed as example.com, to whoever else is looking at it.\n\n**Back to GeoDNS**\n\nEssentially, when you attempt to connect to thegreencodes.com, the server IP will be resolved to the data centre closest to you.\n\nElaborately, once your product has a certain cap of users , serving all across the globe, having a single server in a single location might degrade the experience these very users get.\n\n**Example**\n\nGoogle has multiple servers. While you might connect to its root domain from Australia and person B from Germany, these might not be served from the same server. The GeoDNS works to resolve the IP addresses of these servers/ data centers based on the location of the end user.\n\nYou will access the same data, only without knowledge of what IP the domain you are visiting is currently resolving to.\n\nWhat makes horizontal scaling stand out is the basis on which it stands. At its core, horizontal scaling lets you deploy and maintain your project on several medium or small servers. A single server does not necessarily have to be extensive with vast amounts of resources - we split the load between different servers.\n\nOf note, is that we need to consider whether our project is stateful or stateless. What this means is to identify whether the split needs data and whether that data needs to be synchronised.\n\nManaging data in stateful horizontally scaled products\n\nBehold, the CAP theorem and the ability to identify whether we need more reading or more writing of our database.\n\nIf we indeed have data that needs management, we might opt for three techniques.\n\na) Sharding by data\n\nb) Sharding by hash\n\nc) Data replication\n\nOn the one hand, we have sharding by data. In a case example similar to the one shown, we can have a database that holds data from those in Europe and another that holds data from those in America.\n\nOn the other hand, we can opt to use a consistent technique of hashing specific keys on our model and use those hashes to store data in different databases. For instance, hashing the profile\\_id and stating that data for users with the hash algorithm ABC will sit on this server and not the other.\n\nThe above are optimizations meant to prevent hitting the same database for all requests.\n\nWhile not in-depth, I do intend to come back to this in future. So keep an eye up for this.\n\nMore than the type of scaling, we have to consider a number of techniques and practices to maintain.\n\nAs these platforms grow, the following have to be considered.\n\n## Testing\n\nThere is more to testing than unit tests. Larger systems eventually comprise of larger subsystems. How these systems work together (integration testing), whether the application is behaving according to the specification(functional testing), whether it can handle different loads (performance testing) and so forth.\n\n## Logging\n\nThe more the components, the more integration is needed and the more the system is prone to fail. The more servers we have, the higher the chances. We hope for the best, but prepare for the worst. Your team needs to know when a module went down, whether the data maintained its integrity, which modules are still up and so on.\n\nChoose to go for the Crash-only approach; let the system always be ready for a crash and whenever it reboots, it should be able to continue without human interaction. An example of such a system is Netflix's Chaos Monkey which runs to kill random components of the system within working hours to test its reliability.\n\n## Conclusion\n\nThe practices above are intertwined. Functional partitioning would lead to the decomposition of the project, decomposition would lead to a '[maybe](https://www.youtube.com/watch?v=GBTdnfD6s5Q)' use of microservices, this would bring a restructure of your team to smaller domain-driven teams, a change in how data is cached and managed and so forth. Build upon this. Go agile and iterate. This path is not linear, nor should it be treated as such.\n\nTreat these principles as your northern star, but feel free to morph them based on the value they create for your business.\n\n**Understand**\n\nIn the creation of sustainable software applications, we place the business logic at the centre. The inverse, you'll find, will get you great code, rather than solving the need to be addressed.\n\n> By placing technology first, we may get a great rails application, but it may not be a great pharmaceutical application \\~ Robert C. Martin\n\nOnto [Architecture](https://thegreencodes.com/series/architectural-patterns) - the stuff we wish we'd gotten right at the start of our project.\n",{"title":1411,"description":1703},"indulge/going-enterprise-and-its-aftermath","Up and away with scalability",[1711,1712],"software architecture","system design","hpVpncnKxe813YCIsbIHczGEvWDaBL6_Zro1O9OiR-E",{"id":1715,"title":1716,"body":1717,"coverImage":380,"date":2494,"description":2495,"draft":369,"extension":370,"featured":369,"group":2496,"initial":369,"meta":2497,"navigation":371,"path":2498,"rank":2096,"rawbody":2499,"readTime":377,"seo":2500,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":2501,"subtitle":2502,"tags":2503,"__hash__":2505},"indulge/indulge/keeping-the-homelab-alive.md","Keeping the homelab Alive",{"type":7,"value":1718,"toc":2490},[1719,1722,1725,1728,1731,1734,1737,1743,1746,1749,1753,1759,1766,1785,1795,1852,1867,1889,1896,1909,1918,1921,1958,1963,1966,1979,1987,1993,1996,2020,2023,2026,2442,2452,2476,2479,2483,2486],[10,1720,1721],{},"One of the challenges that comes from getting yourself an enterprise minicomputer is the configuration set by the selling company. For my case, it was the BIOS lock - a toggle that inhibited my ability to have continuous uptime.",[10,1723,1724],{},"For this specific series, I had the following options to reset this:",[10,1726,1727],{},"1. Unplug and plug back in the CMOS battery, effectively resetting the BIOS lock.",[10,1729,1730],{},"2. Removing the PCMOS plug, holding the reset option and placing it back in.",[10,1732,1733],{},"3. Flushing the BIOS and installing a new one.",[10,1735,1736],{},"With option 1 and 2 not working for my particular use case and option 3 being out of my reach at that said time, I chose a fourth option. The workaround that came to mind was using wake on LAN. I figured, even if I lost power and it came back up, I should be able to power up the computer using another device on the same network.",[42,1738,1740],{"id":1739},"considerations",[63,1741,1742],{},"Considerations",[10,1744,1745],{},"1. What happens should I restart my homelab? Would it remember my configuration to wake up on LAN on command?",[10,1747,1748],{},"2. How would I connect to it within my home network?",[42,1750,1752],{"id":1751},"approach","Approach",[1345,1754,1756],{"id":1755},"create-a-daemon-to-autostart-wake-on-lan-for-the-homelab",[63,1757,1758],{},"Create a daemon to autostart wake on LAN for the homelab",[10,1760,1761,1762,1765],{},"I connected my setup to my router via ethernet as I would always be assured that that was on. Figuring the interface with which it connected to the home network was as simple as using ",[83,1763,1764],{},"ip",":",[1767,1768,1772],"pre",{"className":1769,"code":1770,"language":1771,"meta":355,"style":355},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ip link\n","bash",[83,1773,1774],{"__ignoreMap":355},[1775,1776,1778,1781],"span",{"class":1777,"line":375},"line",[1775,1779,1764],{"class":1780},"sBMFI",[1775,1782,1784],{"class":1783},"sfazB"," link\n",[10,1786,1787,1788,1791,1792,26],{},"From this, I would then pick the connection with ",[83,1789,1790],{},"\u003CBROADCAST,MULTICAST>"," to check its support. In my case, ",[83,1793,1794],{},"eno1",[1767,1796,1798],{"className":1769,"code":1797,"language":1771,"meta":355,"style":355},"sudo ethtool eno1\n\n# output contained\n\nSupports Wake-on: pumbg\n\nWake-on: g\n",[83,1799,1800,1811,1816,1822,1827,1838,1843],{"__ignoreMap":355},[1775,1801,1802,1805,1808],{"class":1777,"line":375},[1775,1803,1804],{"class":1780},"sudo",[1775,1806,1807],{"class":1783}," ethtool",[1775,1809,1810],{"class":1783}," eno1\n",[1775,1812,1813],{"class":1777,"line":356},[1775,1814,1815],{"emptyLinePlaceholder":371},"\n",[1775,1817,1818],{"class":1777,"line":359},[1775,1819,1821],{"class":1820},"sHwdD","# output contained\n",[1775,1823,1825],{"class":1777,"line":1824},4,[1775,1826,1815],{"emptyLinePlaceholder":371},[1775,1828,1829,1832,1835],{"class":1777,"line":377},[1775,1830,1831],{"class":1780},"Supports",[1775,1833,1834],{"class":1783}," Wake-on:",[1775,1836,1837],{"class":1783}," pumbg\n",[1775,1839,1841],{"class":1777,"line":1840},6,[1775,1842,1815],{"emptyLinePlaceholder":371},[1775,1844,1846,1849],{"class":1777,"line":1845},7,[1775,1847,1848],{"class":1780},"Wake-on:",[1775,1850,1851],{"class":1783}," g\n",[10,1853,1854,1855,1858,1859,1862,1863,1866],{},"Great, wake on LAN is supported ",[83,1856,1857],{},"wake-on: g",") and it can support multiple triggers",[83,1860,1861],{},"Wake-on: pumbg","). Should it have been ",[83,1864,1865],{},"Wake-on: d",") for not supported, I would have enabled it with:",[1767,1868,1870],{"className":1769,"code":1869,"language":1771,"meta":355,"style":355},"sudo ethtool -s eno1 wol g\n",[83,1871,1872],{"__ignoreMap":355},[1775,1873,1874,1876,1878,1881,1884,1887],{"class":1777,"line":375},[1775,1875,1804],{"class":1780},[1775,1877,1807],{"class":1783},[1775,1879,1880],{"class":1783}," -s",[1775,1882,1883],{"class":1783}," eno1",[1775,1885,1886],{"class":1783}," wol",[1775,1888,1851],{"class":1783},[10,1890,1891,1892,1895],{},"Because the NIC of the system will be reset to ",[83,1893,1894],{},"d"," - disabled) on each restart, I needed to enable this on reboot. I created an internal service for this as:",[1767,1897,1899],{"className":1769,"code":1898,"language":1771,"meta":355,"style":355},"nano /etc/systemd/system/wol.service\n",[83,1900,1901],{"__ignoreMap":355},[1775,1902,1903,1906],{"class":1777,"line":375},[1775,1904,1905],{"class":1780},"nano",[1775,1907,1908],{"class":1783}," /etc/systemd/system/wol.service\n",[1767,1910,1916],{"className":1911,"code":1913,"filename":1914,"language":1915,"meta":355},[1912],"language-text","[Unit]\n\nDescription=Enable Wake-on-LAN\nAfter=network.target\n\n[Service]\nType=oneshot\nExecStart=/sbin/ethtool -s eno1 wol g\n\n[Install]\nWantedBy=multi-user.target\n","wol.service","text",[83,1917,1913],{"__ignoreMap":355},[10,1919,1920],{},"Then I recognize and enable it with:",[1767,1922,1924],{"className":1769,"code":1923,"language":1771,"meta":355,"style":355},"sudo systemctl daemon-reload\nsudo systemctl enable wol.service\nsystemct start wol.service\n",[83,1925,1926,1936,1948],{"__ignoreMap":355},[1775,1927,1928,1930,1933],{"class":1777,"line":375},[1775,1929,1804],{"class":1780},[1775,1931,1932],{"class":1783}," systemctl",[1775,1934,1935],{"class":1783}," daemon-reload\n",[1775,1937,1938,1940,1942,1945],{"class":1777,"line":356},[1775,1939,1804],{"class":1780},[1775,1941,1932],{"class":1783},[1775,1943,1944],{"class":1783}," enable",[1775,1946,1947],{"class":1783}," wol.service\n",[1775,1949,1950,1953,1956],{"class":1777,"line":359},[1775,1951,1952],{"class":1780},"systemct",[1775,1954,1955],{"class":1783}," start",[1775,1957,1947],{"class":1783},[10,1959,1960],{},[63,1961,1962],{},"Pinging the homelab from other devices in the same home network:",[10,1964,1965],{},"Since the system is already on the home network with ethernet and always plugged in, I can call wake on lan using its MAC address. I would just need to install wake on LAN on my laptop or other device. On Arch:",[1767,1967,1969],{"className":1769,"code":1968,"filename":1771,"language":1771,"meta":355,"style":355},"yay wakeonlan\n",[83,1970,1971],{"__ignoreMap":355},[1775,1972,1973,1976],{"class":1777,"line":375},[1775,1974,1975],{"class":1780},"yay",[1775,1977,1978],{"class":1783}," wakeonlan\n",[10,1980,1981,1982,26],{},"On my android devices, I chose to install a ready made solution. I was not going to start building again ",[14,1983,1986],{"href":1984,"rel":1985},"https://play.google.com/store/apps/details?id=co.uk.mrwebb.wakeonlan",[18],"Wake On Lan",[10,1988,1989,1990,1992],{},"I then retrieved the MAC address using the same ",[83,1991,1764],{}," command from earlier.",[10,1994,1995],{},"Now, waking my computer from a power outage should work as simple as:",[1767,1997,1999],{"className":1769,"code":1998,"language":1771,"meta":355,"style":355},"wakeonlan \u003Cmac-address>\n",[83,2000,2001],{"__ignoreMap":355},[1775,2002,2003,2006,2010,2013,2017],{"class":1777,"line":375},[1775,2004,2005],{"class":1780},"wakeonlan",[1775,2007,2009],{"class":2008},"sMK4o"," \u003C",[1775,2011,2012],{"class":1783},"mac-addres",[1775,2014,2016],{"class":2015},"sTEyZ","s",[1775,2018,2019],{"class":2008},">\n",[10,2021,2022],{},"#### A step further",[10,2024,2025],{},"I took it a step further and updated my aliases. In this case, creating a bash script that would ping my home server when called and only stop after 30 minutes of failure or when it got its first successful response. For reference:",[1767,2027,2030],{"className":1769,"code":2028,"filename":2029,"language":1771,"meta":355,"style":355},"#!/bin/bash\n\n# wake-on-lan-script\nMAC_ADDRESS=\"mac-address\"\nHOSTNAME=\"homelab-hostname\"\nSERVER_IP=\"homelab-ip\"\n\necho \"Waking up $HOSTNAME ($MAC_ADDRESS)...\"\nwakeonlan \"$MAC_ADDRESS\"\n\nsleep 45\necho \"Checking if $HOSTNAME is up (will timeout after 30 minutes)...\"\n\nSTART_TIME=$(date +%s)\n\nTIMEOUT=$((30 * 60))  # 30 minutes in seconds\n\nwhile true; do\n   if ping -c 1 -W 1 \"$SERVER_IP\" &> /dev/null; then\n       echo \"$HOSTNAME is now online.\"\n       break\n   fi\n\n   NOW=$(date +%s)\n   ELAPSED=$((NOW - START_TIME))\n\n   if [ \"$ELAPSED\" -ge \"$TIMEOUT\" ]; then\n       echo \"Timeout reached. $HOSTNAME did not come online within 30 minutes.\"\n       break\n   fi\n   sleep 5\n\ndone\n","wake-on-lan-script",[83,2031,2032,2037,2041,2046,2062,2076,2090,2094,2121,2132,2137,2147,2164,2169,2187,2191,2227,2232,2248,2286,2301,2307,2313,2318,2335,2358,2363,2395,2412,2417,2422,2431,2436],{"__ignoreMap":355},[1775,2033,2034],{"class":1777,"line":375},[1775,2035,2036],{"class":1820},"#!/bin/bash\n",[1775,2038,2039],{"class":1777,"line":356},[1775,2040,1815],{"emptyLinePlaceholder":371},[1775,2042,2043],{"class":1777,"line":359},[1775,2044,2045],{"class":1820},"# wake-on-lan-script\n",[1775,2047,2048,2051,2054,2056,2059],{"class":1777,"line":1824},[1775,2049,2050],{"class":2015},"MAC_ADDRESS",[1775,2052,2053],{"class":2008},"=",[1775,2055,1372],{"class":2008},[1775,2057,2058],{"class":1783},"mac-address",[1775,2060,2061],{"class":2008},"\"\n",[1775,2063,2064,2067,2069,2071,2074],{"class":1777,"line":377},[1775,2065,2066],{"class":2015},"HOSTNAME",[1775,2068,2053],{"class":2008},[1775,2070,1372],{"class":2008},[1775,2072,2073],{"class":1783},"homelab-hostname",[1775,2075,2061],{"class":2008},[1775,2077,2078,2081,2083,2085,2088],{"class":1777,"line":1840},[1775,2079,2080],{"class":2015},"SERVER_IP",[1775,2082,2053],{"class":2008},[1775,2084,1372],{"class":2008},[1775,2086,2087],{"class":1783},"homelab-ip",[1775,2089,2061],{"class":2008},[1775,2091,2092],{"class":1777,"line":1845},[1775,2093,1815],{"emptyLinePlaceholder":371},[1775,2095,2097,2101,2104,2107,2110,2113,2116,2119],{"class":1777,"line":2096},8,[1775,2098,2100],{"class":2099},"s2Zo4","echo",[1775,2102,2103],{"class":2008}," \"",[1775,2105,2106],{"class":1783},"Waking up ",[1775,2108,2109],{"class":2015},"$HOSTNAME",[1775,2111,2112],{"class":1783}," (",[1775,2114,2115],{"class":2015},"$MAC_ADDRESS",[1775,2117,2118],{"class":1783},")...",[1775,2120,2061],{"class":2008},[1775,2122,2124,2126,2128,2130],{"class":1777,"line":2123},9,[1775,2125,2005],{"class":1780},[1775,2127,2103],{"class":2008},[1775,2129,2115],{"class":2015},[1775,2131,2061],{"class":2008},[1775,2133,2135],{"class":1777,"line":2134},10,[1775,2136,1815],{"emptyLinePlaceholder":371},[1775,2138,2140,2143],{"class":1777,"line":2139},11,[1775,2141,2142],{"class":1780},"sleep",[1775,2144,2146],{"class":2145},"sbssI"," 45\n",[1775,2148,2150,2152,2154,2157,2159,2162],{"class":1777,"line":2149},12,[1775,2151,2100],{"class":2099},[1775,2153,2103],{"class":2008},[1775,2155,2156],{"class":1783},"Checking if ",[1775,2158,2109],{"class":2015},[1775,2160,2161],{"class":1783}," is up (will timeout after 30 minutes)...",[1775,2163,2061],{"class":2008},[1775,2165,2167],{"class":1777,"line":2166},13,[1775,2168,1815],{"emptyLinePlaceholder":371},[1775,2170,2172,2175,2178,2181,2184],{"class":1777,"line":2171},14,[1775,2173,2174],{"class":2015},"START_TIME",[1775,2176,2177],{"class":2008},"=$(",[1775,2179,2180],{"class":1780},"date",[1775,2182,2183],{"class":1783}," +%s",[1775,2185,2186],{"class":2008},")\n",[1775,2188,2189],{"class":1777,"line":954},[1775,2190,1815],{"emptyLinePlaceholder":371},[1775,2192,2194,2197,2200,2203,2206,2209,2212,2215,2218,2221,2224],{"class":1777,"line":2193},16,[1775,2195,2196],{"class":2015},"TIMEOUT",[1775,2198,2199],{"class":2008},"=$((",[1775,2201,2202],{"class":1780},"30",[1775,2204,2205],{"class":2015}," *",[1775,2207,2208],{"class":2145}," 60",[1775,2210,2211],{"class":2008},"))",[1775,2213,2214],{"class":1780},"  #",[1775,2216,2217],{"class":2145}," 30",[1775,2219,2220],{"class":1783}," minutes",[1775,2222,2223],{"class":1783}," in",[1775,2225,2226],{"class":1783}," seconds\n",[1775,2228,2230],{"class":1777,"line":2229},17,[1775,2231,1815],{"emptyLinePlaceholder":371},[1775,2233,2235,2239,2242,2245],{"class":1777,"line":2234},18,[1775,2236,2238],{"class":2237},"s7zQu","while",[1775,2240,2241],{"class":2099}," true",[1775,2243,2244],{"class":2008},";",[1775,2246,2247],{"class":2237}," do\n",[1775,2249,2251,2254,2257,2260,2263,2266,2268,2270,2273,2275,2278,2281,2283],{"class":1777,"line":2250},19,[1775,2252,2253],{"class":1780},"   if",[1775,2255,2256],{"class":1783}," ping",[1775,2258,2259],{"class":1783}," -c",[1775,2261,2262],{"class":2145}," 1",[1775,2264,2265],{"class":1783}," -W",[1775,2267,2262],{"class":2145},[1775,2269,2103],{"class":2008},[1775,2271,2272],{"class":2015},"$SERVER_IP",[1775,2274,1372],{"class":2008},[1775,2276,2277],{"class":2008}," &>",[1775,2279,2280],{"class":2015}," /dev/null",[1775,2282,2244],{"class":2008},[1775,2284,2285],{"class":2237}," then\n",[1775,2287,2289,2292,2294,2296,2299],{"class":1777,"line":2288},20,[1775,2290,2291],{"class":1780},"       echo",[1775,2293,2103],{"class":2008},[1775,2295,2109],{"class":2015},[1775,2297,2298],{"class":1783}," is now online.",[1775,2300,2061],{"class":2008},[1775,2302,2304],{"class":1777,"line":2303},21,[1775,2305,2306],{"class":1780},"       break\n",[1775,2308,2310],{"class":1777,"line":2309},22,[1775,2311,2312],{"class":1780},"   fi\n",[1775,2314,2316],{"class":1777,"line":2315},23,[1775,2317,1815],{"emptyLinePlaceholder":371},[1775,2319,2321,2324,2326,2329,2331,2333],{"class":1777,"line":2320},24,[1775,2322,2323],{"class":1780},"   NOW",[1775,2325,2053],{"class":1783},[1775,2327,2328],{"class":2015},"$(",[1775,2330,2180],{"class":1783},[1775,2332,2183],{"class":1783},[1775,2334,2186],{"class":2015},[1775,2336,2338,2341,2343,2346,2349,2352,2355],{"class":1777,"line":2337},25,[1775,2339,2340],{"class":1780},"   ELAPSED",[1775,2342,2053],{"class":1783},[1775,2344,2345],{"class":2015},"$((",[1775,2347,2348],{"class":1783},"NOW",[1775,2350,2351],{"class":1783}," -",[1775,2353,2354],{"class":1783}," START_TIME",[1775,2356,2357],{"class":2015},"))\n",[1775,2359,2361],{"class":1777,"line":2360},26,[1775,2362,1815],{"emptyLinePlaceholder":371},[1775,2364,2366,2368,2371,2373,2376,2378,2381,2383,2386,2388,2391,2393],{"class":1777,"line":2365},27,[1775,2367,2253],{"class":1780},[1775,2369,2370],{"class":2015}," [ ",[1775,2372,1372],{"class":2008},[1775,2374,2375],{"class":2015},"$ELAPSED",[1775,2377,1372],{"class":2008},[1775,2379,2380],{"class":1783}," -ge",[1775,2382,2103],{"class":2008},[1775,2384,2385],{"class":2015},"$TIMEOUT",[1775,2387,1372],{"class":2008},[1775,2389,2390],{"class":1783}," ]",[1775,2392,2244],{"class":2008},[1775,2394,2285],{"class":2237},[1775,2396,2398,2400,2402,2405,2407,2410],{"class":1777,"line":2397},28,[1775,2399,2291],{"class":1780},[1775,2401,2103],{"class":2008},[1775,2403,2404],{"class":1783},"Timeout reached. ",[1775,2406,2109],{"class":2015},[1775,2408,2409],{"class":1783}," did not come online within 30 minutes.",[1775,2411,2061],{"class":2008},[1775,2413,2415],{"class":1777,"line":2414},29,[1775,2416,2306],{"class":1780},[1775,2418,2420],{"class":1777,"line":2419},30,[1775,2421,2312],{"class":1780},[1775,2423,2425,2428],{"class":1777,"line":2424},31,[1775,2426,2427],{"class":1780},"   sleep",[1775,2429,2430],{"class":2145}," 5\n",[1775,2432,2434],{"class":1777,"line":2433},32,[1775,2435,1815],{"emptyLinePlaceholder":371},[1775,2437,2439],{"class":1777,"line":2438},33,[1775,2440,2441],{"class":2237},"done\n",[10,2443,2444,2445,2448,2449],{},"I would then update my ",[83,2446,2447],{},"~/.zshrc"," with my alias call. I just called it ",[83,2450,2451],{},"home",[1767,2453,2456],{"className":1769,"code":2454,"filename":2455,"language":1771,"meta":355,"style":355},"alias home=\"path-to-wake-on-lan-script\"\n","zshrc",[83,2457,2458],{"__ignoreMap":355},[1775,2459,2460,2464,2467,2469,2471,2474],{"class":1777,"line":375},[1775,2461,2463],{"class":2462},"spNyl","alias",[1775,2465,2466],{"class":2015}," home",[1775,2468,2053],{"class":2008},[1775,2470,1372],{"class":2008},[1775,2472,2473],{"class":1783},"path-to-wake-on-lan-script",[1775,2475,2061],{"class":2008},[10,2477,2478],{},"That was pretty much it.",[1345,2480,2482],{"id":2481},"the-future","The future",[10,2484,2485],{},"My current setup works as I expect. I do, however, foresee a scenario where I would like to wake the system when not connected to my home network. I could either use wireguard with a rasberry pi or setup an ESP32 that would always try to ping it when plugged in.",[2487,2488,2489],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":355,"searchDepth":356,"depth":356,"links":2491},[2492,2493],{"id":1739,"depth":359,"text":1742},{"id":1751,"depth":359,"text":1752},"31/10/2025","Discover how to maintain uptime in your homelab with a BIOS lock workaround and wake on LAN setup","Infrastructure",{},"/indulge/keeping-the-homelab-alive","---\ntitle: Keeping the homelab Alive\nseries: true\ngroup: Infrastructure\nrank: 8\nsubtitle: Maintain a Reliable System\ndescription: Discover how to maintain uptime in your homelab with a BIOS lock\n  workaround and wake on LAN setup\ndate: 31/10/2025\ntags: [technology, homelabbing]\n---\n\nOne of the challenges that comes from getting yourself an enterprise minicomputer is the configuration set by the selling company. For my case, it was the BIOS lock - a toggle that inhibited my ability to have continuous uptime.\n\nFor this specific series, I had the following options to reset this:\n\n1\\. Unplug and plug back in the CMOS battery, effectively resetting the BIOS lock.\n\n2\\. Removing the PCMOS plug, holding the reset option and placing it back in.\n\n3\\. Flushing the BIOS and installing a new one.\n\nWith option 1 and 2 not working for my particular use case and option 3 being out of my reach at that said time, I chose a fourth option. The workaround that came to mind was using wake on LAN. I figured, even if I lost power and it came back up, I should be able to power up the computer using another device on the same network.\n\n### **Considerations**\n\n1\\. What happens should I restart my homelab? Would it remember my configuration to wake up on LAN on command?\n\n2\\. How would I connect to it within my home network?\n\n### Approach\n\n#### **Create a daemon to autostart wake on LAN for the homelab**\n\nI connected my setup to my router via ethernet as I would always be assured that that was on. Figuring the interface with which it connected to the home network was as simple as using `ip`:\n\n```bash\nip link\n```\n\nFrom this, I would then pick the connection with `\u003CBROADCAST,MULTICAST>` to check its support. In my case, `eno1`.\n\n```bash\nsudo ethtool eno1\n\n# output contained\n\nSupports Wake-on: pumbg\n\nWake-on: g\n```\n\nGreat, wake on LAN is supported `wake-on: g`) and it can support multiple triggers`Wake-on: pumbg`). Should it have been `Wake-on: d`) for not supported, I would have enabled it with:\n\n```bash\nsudo ethtool -s eno1 wol g\n```\n\nBecause the NIC of the system will be reset to `d` - disabled) on each restart, I needed to enable this on reboot. I created an internal service for this as:\n\n```bash\nnano /etc/systemd/system/wol.service\n```\n\n```text [wol.service]\n[Unit]\n\nDescription=Enable Wake-on-LAN\nAfter=network.target\n\n[Service]\nType=oneshot\nExecStart=/sbin/ethtool -s eno1 wol g\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThen I recognize and enable it with:\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable wol.service\nsystemct start wol.service\n```\n\n**Pinging the homelab from other devices in the same home network:**\n\nSince the system is already on the home network with ethernet and always plugged in, I can call wake on lan using its MAC address. I would just need to install wake on LAN on my laptop or other device. On Arch:\n\n```bash [bash]\nyay wakeonlan\n```\n\nOn my android devices, I chose to install a ready made solution. I was not going to start building again [Wake On Lan](https://play.google.com/store/apps/details?id=co.uk.mrwebb.wakeonlan).\n\nI then retrieved the MAC address using the same `ip` command from earlier.\n\nNow, waking my computer from a power outage should work as simple as:\n\n```bash\nwakeonlan \u003Cmac-address>\n```\n\n\\#### A step further\n\nI took it a step further and updated my aliases. In this case, creating a bash script that would ping my home server when called and only stop after 30 minutes of failure or when it got its first successful response. For reference:\n\n```bash [wake-on-lan-script]\n#!/bin/bash\n\n# wake-on-lan-script\nMAC_ADDRESS=\"mac-address\"\nHOSTNAME=\"homelab-hostname\"\nSERVER_IP=\"homelab-ip\"\n\necho \"Waking up $HOSTNAME ($MAC_ADDRESS)...\"\nwakeonlan \"$MAC_ADDRESS\"\n\nsleep 45\necho \"Checking if $HOSTNAME is up (will timeout after 30 minutes)...\"\n\nSTART_TIME=$(date +%s)\n\nTIMEOUT=$((30 * 60))  # 30 minutes in seconds\n\nwhile true; do\n   if ping -c 1 -W 1 \"$SERVER_IP\" &> /dev/null; then\n       echo \"$HOSTNAME is now online.\"\n       break\n   fi\n\n   NOW=$(date +%s)\n   ELAPSED=$((NOW - START_TIME))\n\n   if [ \"$ELAPSED\" -ge \"$TIMEOUT\" ]; then\n       echo \"Timeout reached. $HOSTNAME did not come online within 30 minutes.\"\n       break\n   fi\n   sleep 5\n\ndone\n```\n\nI would then update my `~/.zshrc` with my alias call. I just called it `home`\n\n```bash [zshrc]\nalias home=\"path-to-wake-on-lan-script\"\n```\n\nThat was pretty much it.\n\n#### The future\n\nMy current setup works as I expect. I do, however, foresee a scenario where I would like to wake the system when not connected to my home network. I could either use wireguard with a rasberry pi or setup an ESP32 that would always try to ping it when plugged in.\n",{"title":1716,"description":2495},"indulge/keeping-the-homelab-alive","Maintain a Reliable System",[960,2504],"homelabbing","fu-ZziX0fALMKnJOvF8Fb2faF6voj46jtSF55KXcFv8",{"id":2507,"title":2508,"body":2509,"coverImage":2546,"date":950,"description":2547,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":2548,"navigation":371,"path":2550,"rank":1845,"rawbody":2551,"readTime":377,"seo":2552,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":2553,"subtitle":2547,"tags":2554,"__hash__":2556},"indulge/indulge/learning-living-growing.md","Learning, living and growing",{"type":7,"value":2510,"toc":2544},[2511,2514,2517,2520,2523,2528,2534,2537,2541],[10,2512,2513],{},"Sometimes, it never happens as we had planned. Sometimes, it goes the exact opposite way. It is definitely not what we want but perhaps that's what we actually need.",[10,2515,2516],{},"I've spent a considerable amount of my career building - a continuous dash for the next big thing. Often times writing onto napkins or 'keeping in' to create something incredible the world might need. Studying the lives of great men, reading the books of the wise and practicing.",[10,2518,2519],{},"Looking back, its fair to assume that locked in this maze of thought of the greats before us, we can loose ourselves. We forget who we are in aspiring to be who we are not.",[10,2521,2522],{},"I don't think it comes from perfection but rather from an iteration towards what will make you. That just as nature has its seasons , so shall you. Evolving into who you intend to be. Knowing that it is all in your power and no one else's.",[58,2524,2525],{},[10,2526,2527],{},"Does it engage your imagination? Are you excited about the person you will turn out to be?",[10,2529,2530,2531],{},"At the end of the day, the most important question should be to thyself. ",[31,2532,2533],{},"Who am I?",[10,2535,2536],{},"Who are we? We are what we do. We are what we learn. We are what we do with what we learn.",[10,2538,2539],{},[63,2540,65],{},[10,2542,2543],{},"So I look to the stars and ask for my place in the universe. Yet again, casting myself into the stary night to discover a new. If one shall rule, let its name be curiosity.",{"title":355,"searchDepth":356,"depth":356,"links":2545},[],"https://res.cloudinary.com/dlxhllkxl/image/upload/v1697921655/Indulge/learning_cfrhye.png","Meditative thought",{"type":2549},"draft","/indulge/learning-living-growing","---\nrank: 7\ntitle: Learning, living and growing\nsubtitle: Meditative thought\ncoverImage: https://res.cloudinary.com/dlxhllkxl/image/upload/v1697921655/Indulge/learning_cfrhye.png\ndescription: Meditative thought\ndate: 12/12/2024\nfeatured: false\ntags: [indulge]\ntype: draft\n---\n\nSometimes, it never happens as we had planned. Sometimes, it goes the exact opposite way. It is definitely not what we want but perhaps that's what we actually need.\n\nI've spent a considerable amount of my career building - a continuous dash for the next big thing. Often times writing onto napkins or 'keeping in' to create something incredible the world might need. Studying the lives of great men, reading the books of the wise and practicing.\n\nLooking back, its fair to assume that locked in this maze of thought of the greats before us, we can loose ourselves. We forget who we are in aspiring to be who we are not.\n\nI don't think it comes from perfection but rather from an iteration towards what will make you. That just as nature has its seasons , so shall you. Evolving into who you intend to be. Knowing that it is all in your power and no one else's.\n\n> Does it engage your imagination? Are you excited about the person you will turn out to be?\n\nAt the end of the day, the most important question should be to thyself. *Who am I?*\n\nWho are we? We are what we do. We are what we learn. We are what we do with what we learn.\n\n**Indulge**\n\nSo I look to the stars and ask for my place in the universe. Yet again, casting myself into the stary night to discover a new. If one shall rule, let its name be curiosity.\n",{"title":2508,"description":2547},"indulge/learning-living-growing",[2555],"indulge","mqPc2U3xzUTfKw0-DEq1FEK1reH4Wc9gxcQKvKeKYNQ",{"id":2558,"title":2559,"body":2560,"coverImage":380,"date":2651,"description":2652,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":2653,"navigation":371,"path":2654,"rank":2134,"rawbody":2655,"readTime":377,"seo":2656,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":2657,"subtitle":2658,"tags":2659,"__hash__":2661},"indulge/indulge/necessity-versus-opportunity.md","Necessity versus Opportunity",{"type":7,"value":2561,"toc":2648},[2562,2565,2580,2582,2591,2594,2603,2608,2611,2614,2621,2626,2634,2639],[10,2563,2564],{},"Over the past few weeks, I have been exploring the world of entrepreneurship, attending various events where accelerators gather, joining breakfasts for entrepreneurial-minded individuals, and participating in debates on the subject. Throughout this journey, I have been focusing on funding opportunities, education, and mindset shifts that ultimately lead to the creation of successful businesses.",[10,2566,2567,2568,2573,2574,2579],{},"An opinion piece that caught my attention was one by Adam Molai entitled \"",[14,2569,2572],{"href":2570,"rel":2571},"https://www.businesslive.co.za/bd/opinion/2022-06-25-adam-molai-africa-has-entrepreneurs-just-not-the-right-kind/",[18],"Africa lacks the right kind of entrepreneurs",",\" along with the paper \"",[14,2575,2578],{"href":2576,"rel":2577},"https://www.afdb.org/en/documents/working-paper-336-jobs-economic-growth-and-capacity-development-youth-africa",[18],"Jobs, Economic Growth and Capacity Development for Youth in Africa",",\" both of which form the basis of my thoughts today.",[42,2581,65],{"id":2555},[10,2583,2584,2585,2590],{},"With the world at 8 billion persons as of ",[14,2586,2589],{"href":2587,"rel":2588},"https://www.un.org/en/dayof8billion",[18],"15th November 2022",", Africa remains one of the poorest continents on the globe, despite the fact that it will account for 2 out of 5 working-age individuals by the end of the 21st century. The peculiar part of this statement is the quality and purposes with which we build our ventures within the African economic zones.",[10,2592,2593],{},"The crux? Was this business built out of a pure innovative spirit - to create what once was not - or was it a means to an end?",[10,2595,2596,2597,2602],{},"Returning to the population question, with a 245.0% increase in population within the working age group, we expect a rise in the number of graduates and professionals alike. All this while, the market is not primed to absorb this number of individuals. If anything, the ",[14,2598,2601],{"href":2599,"rel":2600},"https://layoffs.fyi/",[18],"tech lay-offs"," that have happened over the last couple of months have been a testament to what happens when projects fail and companies are bloated.",[58,2604,2605],{},[10,2606,2607],{},"Was this business built out of a pure innovative spirit - to create what once was not - or was it a means to an end?",[10,2609,2610],{},"This raises the question, what does this mean for education?",[10,2612,2613],{},"Having been brought up in an African household and in relation to how we raise this generation of dreamers and builders alike, provided we exist in the space where entrepreneurship is treated as a ‘side-hustle’ for those incapable of being absorbed into the job market, we cease to create foundations upon which the future can stand.",[10,2615,2616,2620],{},[177,2617],{"alt":2618,"src":2619},"Creating a business","https://res.cloudinary.com/dlxhllkxl/image/upload/v1689505907/Portifolio/startups_ouwcpz.jpg",":br",[58,2622,2623],{},[10,2624,2625],{},"The next Bill Gates will not build an operating system. The next Larry Page or Sergey Brin won’t make a search engine. And the next Mark Zuckerberg won’t create a social network. If you are copying these guys, you aren’t learning from them. - Peter Thiel (Zero To One)",[10,2627,2628,2629,26],{},"It is high time we create sustainable solutions that navigate from bringing in the everyday meal to those that impart beyond sustenance. To leave you something to nibble and ponder, here is an article from TechCabal about ",[14,2630,2633],{"href":2631,"rel":2632},"https://techcabal.com/2022/11/08/african-tech-talent-emigration-jobs/",[18],"tech talent navigating its way back to Africa",[10,2635,2636],{},[63,2637,2638],{},"Thought:",[10,2640,2641,2642,2647],{},"Perhaps the danger of Artificial Intelligence is not in it taking away employment ( unless you champion for ",[14,2643,2646],{"href":2644,"rel":2645},"https://www.youtube.com/watch?v=uK3OBAxCi6k",[18],"bullshit jobs",") but that with the increased use of the same technology, AI relearns from itself and other old content rather than what is made a-new. The limit remains; Artificial Intelligence will only learn from what already exists.",{"title":355,"searchDepth":356,"depth":356,"links":2649},[2650],{"id":2555,"depth":359,"text":65},"04/11/2023","Navigating a mental mindshif on entrepreneurship",{},"/indulge/necessity-versus-opportunity","---\ntitle: Necessity versus Opportunity\nrank: 10\nsubtitle: Africa’s relationship to Entrepreneurship\ndescription: Navigating a mental mindshif on entrepreneurship\ndate: 04/11/2023\ntags: [technology, entrepreneurship]\n---\n\nOver the past few weeks, I have been exploring the world of entrepreneurship, attending various events where accelerators gather, joining breakfasts for entrepreneurial-minded individuals, and participating in debates on the subject. Throughout this journey, I have been focusing on funding opportunities, education, and mindset shifts that ultimately lead to the creation of successful businesses.\n\nAn opinion piece that caught my attention was one by Adam Molai entitled \"[Africa lacks the right kind of entrepreneurs](https://www.businesslive.co.za/bd/opinion/2022-06-25-adam-molai-africa-has-entrepreneurs-just-not-the-right-kind/),\" along with the paper \"[Jobs, Economic Growth and Capacity Development for Youth in Africa](https://www.afdb.org/en/documents/working-paper-336-jobs-economic-growth-and-capacity-development-youth-africa),\" both of which form the basis of my thoughts today.\n\n### Indulge\n\nWith the world at 8 billion persons as of [15th November 2022](https://www.un.org/en/dayof8billion), Africa remains one of the poorest continents on the globe, despite the fact that it will account for 2 out of 5 working-age individuals by the end of the 21st century. The peculiar part of this statement is the quality and purposes with which we build our ventures within the African economic zones.\n\nThe crux? Was this business built out of a pure innovative spirit - to create what once was not - or was it a means to an end?\n\nReturning to the population question, with a 245.0% increase in population within the working age group, we expect a rise in the number of graduates and professionals alike. All this while, the market is not primed to absorb this number of individuals. If anything, the [tech lay-offs](https://layoffs.fyi/) that have happened over the last couple of months have been a testament to what happens when projects fail and companies are bloated.\n\n> Was this business built out of a pure innovative spirit - to create what once was not - or was it a means to an end?\n\nThis raises the question, what does this mean for education?\n\nHaving been brought up in an African household and in relation to how we raise this generation of dreamers and builders alike, provided we exist in the space where entrepreneurship is treated as a ‘side-hustle’ for those incapable of being absorbed into the job market, we cease to create foundations upon which the future can stand.\n\n![Creating a business](https://res.cloudinary.com/dlxhllkxl/image/upload/v1689505907/Portifolio/startups_ouwcpz.jpg):br\n\n> The next Bill Gates will not build an operating system. The next Larry Page or Sergey Brin won’t make a search engine. And the next Mark Zuckerberg won’t create a social network. If you are copying these guys, you aren’t learning from them. - Peter Thiel (Zero To One)\n\nIt is high time we create sustainable solutions that navigate from bringing in the everyday meal to those that impart beyond sustenance. To leave you something to nibble and ponder, here is an article from TechCabal about [tech talent navigating its way back to Africa](https://techcabal.com/2022/11/08/african-tech-talent-emigration-jobs/).\n\n**Thought:**\n\nPerhaps the danger of Artificial Intelligence is not in it taking away employment ( unless you champion for [bullshit jobs](https://www.youtube.com/watch?v=uK3OBAxCi6k)) but that with the increased use of the same technology, AI relearns from itself and other old content rather than what is made a-new. The limit remains; Artificial Intelligence will only learn from what already exists.\n",{"title":2559,"description":2652},"indulge/necessity-versus-opportunity","Africa’s relationship to Entrepreneurship",[960,2660],"entrepreneurship","zPWh7XcP7rTXGncosJOKUG2_N4c3HPBdtoSMy3zZye8",{"id":2663,"title":2664,"body":2665,"coverImage":380,"date":2757,"description":2758,"draft":369,"extension":370,"featured":369,"group":2496,"initial":369,"meta":2759,"navigation":371,"path":2760,"rank":2123,"rawbody":2761,"readTime":377,"seo":2762,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":2763,"subtitle":2764,"tags":2765,"__hash__":2766},"indulge/indulge/owing-your-infrastructure.md","Owning Your Infrastructure",{"type":7,"value":2666,"toc":2755},[2667,2670,2676,2679,2682,2689,2709,2718,2721,2728,2731,2736,2739,2747],[10,2668,2669],{},"I have self-hosted a number of things so far , including photos, office, docker registry and chat applications for mine and my own use. This piece is a reflection on that journey, partly inspired by a recent incident where a user was banned from GitHub.",[10,2671,2672],{},[177,2673],{"alt":2674,"src":2675},"Celeste gets banned","https://res.cloudinary.com/dlxhllkxl/image/upload/v1761325142/Indulge/celeste_ban_xnxqkz.png",[10,2677,2678],{},"I started self-hosting because I was bored and wanted to do hard things. Not just any hard thing but hard things that I understood ins and outs of. I kicked off with the usual simple applications, went of to projects I actually built and use and started getting dirty with writing programs for my own router - go figure. Be as it may, I have always been a tinkerer and labbing as well as my recent work with DevOps has given me the freedom to do so. What a glorious adventure.",[10,2680,2681],{},"Everything works other than my password manager. Why? Because we all know that if the server that manages your passwords goes down then the world is truly ending.",[58,2683,2684],{},[10,2685,2686,2688],{},[63,2687,913],{},"\nYou cannot claim rights to what you do not actually own. Or as FUTO put it:\n'If you can’t review the source code, it’s not your software. If you can’t host the service yourself, it’s not really yours.'",[10,2690,2691,2692,2112,2697,2702,2703,2708],{},"While Celeste, tweet above, was rightly banned because of his ",[14,2693,2696],{"href":2694,"rel":2695},"https://github.com/torvalds/linux/pull/1355",[18],"spam pr",[14,2698,2701],{"href":2699,"rel":2700},"https://x.com/karthihegde/status/1978316798090006532/photo/1",[18],"original title","), it brings a number of things to question. What does it mean for our convenient single signons? What happens , as with the case of ",[14,2704,2707],{"href":2705,"rel":2706},"https://www.nytimes.com/2022/08/21/technology/google-surveillance-toddler-photo.html",[18],"Mark",", if your Google account or any other SSO account is banned either temporarily or permanently? What happens to the ecosystems we so willingly give all our information to? For context, Mark's Google account was flagged when he took photos of his naked toddler for the doctor and Google mistakenly identified him as a criminal. He never recovered that account.",[58,2710,2711,2715],{},[10,2712,2713],{},[63,2714,2638],{},[10,2716,2717],{},"What percentage of your life is dependent on your online account?",[10,2719,2720],{},"We place ourselves in bubbles of 'I cannot get banned' until it finally happens. One compromise to your online account , be it LinkedIn (as is so common these days), or any other and a cascading train of events follows.",[58,2722,2723],{},[10,2724,2725,2727],{},[63,2726,913],{}," Maybe some of your online accounts should be your backup instead of your primary source.",[10,2729,2730],{},"I will clone my most important work to my Gitea instance over the weekend and possibly hook it to Authentik. I leave this piece here, until our next conversation - UNRAID.",[10,2732,2733],{},[63,2734,2735],{},"Reference notes",[10,2737,2738],{},"To sign off on owning, not renting, your software:",[10,2740,2741,2746],{},[14,2742,2745],{"href":2743,"rel":2744},"https://www.youtube.com/watch?v=u_Lxkt50xOg",[18],"- PwediePie starts self-hosting"," to cut on subscriptions",[10,2748,2749,2754],{},[14,2750,2753],{"href":2751,"rel":2752},"https://www.youtube.com/watch?v=zBnDWSvaQ1I",[18],"- Our microphones"," and our privacy.",{"title":355,"searchDepth":356,"depth":356,"links":2756},[],"10/31/2025","Thinking privacy, security and redundancy",{},"/indulge/owing-your-infrastructure","---\ntitle: Owning Your Infrastructure\nseries: true\ngroup: Infrastructure\nrank: 9\nsubtitle: Our real-estate in the online space\ndescription: Thinking privacy, security and redundancy\ndate: 10/31/2025\ntags: [homelabbing]\n---\n\nI have self-hosted a number of things so far , including photos, office, docker registry and chat applications for mine and my own use. This piece is a reflection on that journey, partly inspired by a recent incident where a user was banned from GitHub.\n\n![Celeste gets banned](https://res.cloudinary.com/dlxhllkxl/image/upload/v1761325142/Indulge/celeste_ban_xnxqkz.png)\n\nI started self-hosting because I was bored and wanted to do hard things. Not just any hard thing but hard things that I understood ins and outs of. I kicked off with the usual simple applications, went of to projects I actually built and use and started getting dirty with writing programs for my own router - go figure. Be as it may, I have always been a tinkerer and labbing as well as my recent work with DevOps has given me the freedom to do so. What a glorious adventure.\n\nEverything works other than my password manager. Why? Because we all know that if the server that manages your passwords goes down then the world is truly ending.\n\n> **Indulge:**\n> You cannot claim rights to what you do not actually own. Or as FUTO put it:\n> 'If you can’t review the source code, it’s not your software. If you can’t host the service yourself, it’s not really yours.'\n\nWhile Celeste, tweet above, was rightly banned because of his [spam pr](https://github.com/torvalds/linux/pull/1355) ([original title](https://x.com/karthihegde/status/1978316798090006532/photo/1)), it brings a number of things to question. What does it mean for our convenient single signons? What happens , as with the case of [Mark](https://www.nytimes.com/2022/08/21/technology/google-surveillance-toddler-photo.html), if your Google account or any other SSO account is banned either temporarily or permanently? What happens to the ecosystems we so willingly give all our information to? For context, Mark's Google account was flagged when he took photos of his naked toddler for the doctor and Google mistakenly identified him as a criminal. He never recovered that account.\n\n> **Thought:**\n>\n> What percentage of your life is dependent on your online account?\n\nWe place ourselves in bubbles of 'I cannot get banned' until it finally happens. One compromise to your online account , be it LinkedIn (as is so common these days), or any other and a cascading train of events follows.\n\n> **Indulge:** Maybe some of your online accounts should be your backup instead of your primary source.\n\nI will clone my most important work to my Gitea instance over the weekend and possibly hook it to Authentik. I leave this piece here, until our next conversation - UNRAID.\n\n**Reference notes**\n\nTo sign off on owning, not renting, your software:\n\n[- PwediePie starts self-hosting](https://www.youtube.com/watch?v=u_Lxkt50xOg) to cut on subscriptions\n\n[- Our microphones](https://www.youtube.com/watch?v=zBnDWSvaQ1I) and our privacy.\n",{"title":2664,"description":2758},"indulge/owing-your-infrastructure","Our real-estate in the online space",[2504],"T7rLEOA5hipVA28wD2Ux3BkuW_-p5Aae2JtejK7dIv8",{"id":2768,"title":2769,"body":2770,"coverImage":3065,"date":950,"description":3066,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3067,"navigation":371,"path":3068,"rank":359,"rawbody":3069,"readTime":377,"seo":3070,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3071,"subtitle":3072,"tags":3073,"__hash__":3074},"indulge/indulge/recommendation-systems.md","Recommendation Systems",{"type":7,"value":2771,"toc":3052},[2772,2776,2779,2782,2785,2799,2802,2804,2808,2811,2814,2817,2821,2824,2828,2831,2834,2837,2841,2844,2850,2853,2861,2864,2870,2874,2877,2880,2886,2889,2893,2898,2906,2909,2914,2917,2922,2925,2930,2933,2938,2941,2945,2948,2951,2954,2963,2966,2969,2972,2975,2979,2988,2997,3000,3013,3016,3025,3028,3037,3040,3042,3045],[1478,2773,2775],{"id":2774},"introduction","Introduction",[10,2777,2778],{},"I have a confession to make; I am a huge fan of sci-fi.",[10,2780,2781],{},"Whether it is another episode of The Minority Report, Upload or Travelers, I am all for it. Perhaps the underlying cause is my fascination with how these societies use technology in their everyday lives. Moreso, perhaps it is in the chance to witness something that is on the brink of discovery in our modern-day information era.",[10,2783,2784],{},"One of the common theme that appears across these films is the ability of machines to predict what we want.",[10,2786,2787,2788,2793,2794,26],{},"An observer need only take one look at how, say the show, The Minority Report, uses its predictive algorithm Hawk-Eye, to predict the occurrence of crime and compare it to Essex University’s ",[14,2789,2792],{"href":2790,"rel":2791},"https://www.essex.ac.uk/research/showcase/imagine-being-able-to-predict-a-crime-in-the-future",[18],"KeyCrime",", to see a ",[14,2795,2798],{"href":2796,"rel":2797},"https://www.marvinkweyu.net/indulge/the_effect_of_daydreaming_and_fiction_in_the_evolution_of_science",[18],"closeness between fiction and reality",[10,2800,2801],{},"What if we could predict what would happen before it does? What if a machine could tell what you would buy before you actually get to it?",[39,2803],{},[1478,2805,2807],{"id":2806},"what-is-a-recommendation-system","What is a Recommendation System?",[10,2809,2810],{},"A recommendation system is an information filtering technique that predicts what a user might prefer based on their historical interactions or preferences.",[10,2812,2813],{},"As an example, and coming back from our high on KeyCrime, if a user frequently watches romantic comedies on a streaming service, a recommendation system may suggest similar movies or TV shows. These systems are based on machine learning algorithms that analyze user behaviour to generate other details that they might be interested in.",[10,2815,2816],{},"They have become commonplace in industries such as e-commerce, social media platforms, security and healthcare. Let’s talk about this and the different aspects that come to play around recommendation engines.",[1478,2818,2820],{"id":2819},"types-of-recommendation-systems","Types of Recommendation Systems",[10,2822,2823],{},"For brevity, there are different types of recommendation systems, including content-based, collaborative-based, hybrid, and demographic-based recommendations.",[42,2825,2827],{"id":2826},"content-based-recommendation","Content-based Recommendation",[10,2829,2830],{},"Say, for instance, you are called Ian, and you have a thing for apple products. You log into Instagram and double-tap on two or three images around apple products or advertisements. What happens in the background?",[10,2832,2833],{},"Content-based recommendation systems make recommendations based on the similarity of items and are attached to the particular user. the more interaction you have with a system, the more accurate the data gets. In essence, a content-based recommendation engine needs a base item(s) around which a user’s actions(reviews, likes etc…) can be pegged.",[10,2835,2836],{},"“We see you liked an image that has wheat. Here are other wheat-based products you might relish.”",[42,2838,2840],{"id":2839},"collaborative-based-recommendation","Collaborative-based Recommendation",[10,2842,2843],{},"What if we have a whole community of foodies? Could they ping each other based on what they enjoyed preparing?",[10,2845,2846],{},[177,2847],{"alt":2848,"src":2849},"collaborative","/recommendation/collaborative.webp",[10,2851,2852],{},"Collaborative-based recommendation systems generate recommendations based on the behaviour of similar users. If two users have similar preferences, the system will recommend items that one user has liked to the other.",[10,2854,2855,2860],{},[14,2856,2859],{"href":2857,"rel":2858},"https://en.wikipedia.org/wiki/Netflix_Prize",[18],"The Netflix Prize"," was one such event where builders across the board were invited to a collaborative filtering algorithm challenge to improve upon its own algorithm, Cinematch. A grand prize of $1000 000 for any team that came through with the solution.",[10,2862,2863],{},"Broadly speaking, collaborative-based recommendation systems are grouped into memory and model-based. For purposes of this guide, we shall focus on memory-based collaborative filtering within which we can further break into Item and user-based collaborative filtering.",[10,2865,2866],{},[177,2867],{"alt":2868,"src":2869},"collaborative2","/recommendation/collaborative2.webp",[42,2871,2873],{"id":2872},"user-based-collaborative-filtering","User-based collaborative filtering",[10,2875,2876],{},"At its core, user-based collaborative filtering is based on similar consumption patterns.",[10,2878,2879],{},"Example: Let’s say Rita finally set up her restaurant. We pay a visit, and you give it a 5-star rating. Now, your friend, Peter, does the same. Already, we have two users with a similar rating on the same location. It is very likely that because Rita and Peter have a 5-star rating on a specific item, they will have other items in common. Thus, we look for people with a rating of between 5 and 3.5 for the restaurant and suggest other restaurants they like to you.",[10,2881,2882],{},[177,2883],{"alt":2884,"src":2885},"user","/recommendation/user-based.webp",[10,2887,2888],{},"This ‘envelope’ we just created in our example is called a threshold. So, a user with a rating of 1 on the said restaurant will not be a source of suggestions for our next restaurant hopping experience.",[42,2890,2892],{"id":2891},"item-based-collaborative-filtering","Item-based collaborative filtering",[10,2894,2895,2897],{},[31,2896,1509],{}," Most users that buy bread also buy butter. therefore, these items must be similar. Or if user X likes films with ‘Iron man’ then they will like those with ‘Spiderman’. You get the gist.",[10,2899,2900,2905],{},[14,2901,2904],{"href":2902,"rel":2903},"https://patents.google.com/patent/US6266649",[18],"Introduced by Amazon in 1998",", item-based filtering bases recommendations on similarities between items. This decision will affect our ‘pre-sales’ option during checkout. The suggestion is to get this customer to buy one more item, that is, spend more. This is the reason why everything in retail stores is where it is. Nothing by chance, nothing random.",[10,2907,2908],{},"Are there challenges to collaborative filtering? Well, certainly. Depending on which of the aforementioned you use you might encounter the following:",[10,2910,2911],{},[63,2912,2913],{},"The early rater problem",[10,2915,2916],{},"So, you successfully have a user log in to your platform with 20 000 books. They rate 1 / 20 000. We literally have nothing to recommend.",[10,2918,2919],{},[63,2920,2921],{},"Sparsity",[10,2923,2924],{},"You have a number of users all of whom have rated a significant count of products. However, these items are too far spread apart. Say, for instance, back to books, only two have rated the same books. All the others have rated items with no duplication.",[10,2926,2927],{},[63,2928,2929],{},"A gray sheep",[10,2931,2932],{},"You know yourself. You like to remain unpredictable, you open browsers in incognito all the time, like random things every time and leave the platforms you visit. Just like Elle(laughs like Mojo Jojo).",[10,2934,2935],{},[63,2936,2937],{},"The shilling attack",[10,2939,2940],{},"This happens when a single user or group of people create multiple accounts on the same platform and rate , say a product in a certain way in order to sway other users’ interest to the items they are rating highly. It can also happen to sway users away from a product by giving it bad ratings.",[1478,2942,2944],{"id":2943},"hybrid-recommendation","Hybrid Recommendation",[10,2946,2947],{},"Certainly, we must have come up with a workaround content and collaborative-based recommendation engines. In comes Hybrid recommendations.",[10,2949,2950],{},"Hybrid engines combine both content-based and collaborative-based approaches to generate recommendations.",[10,2952,2953],{},"Demographic-based Recommendation",[10,2955,2956,2957,2962],{},"Do you remember the piece, ",[14,2958,2961],{"href":2959,"rel":2960},"https://marvinkweyu.net/indulge",[18],"Up and Away with Scalability"," - specifically on caching and content delivery servers?",[10,2964,2965],{},"Demographic-based recommendation systems make recommendations based on demographic information such as age, gender, or location.",[10,2967,2968],{},"For one, we could have a location that is known for a type of music. Thus, instead of having our data centre closest to them caching everything and all other genres, why not cache what people actually listen to?",[10,2970,2971],{},"Pro tip: Bongo, a music genre, is popular in the coastal regions of Kenya and Tanzania. My music service would therefore hold a cache for this genre on servers closest to these regions as opposed to , say Alaska.",[10,2973,2974],{},"Demographic-based recommendation systems are often used for marketing purposes and can be particularly useful for identifying and targeting specific groups of users.",[1478,2976,2978],{"id":2977},"applications-of-recommendation-systems","Applications of Recommendation Systems",[10,2980,2981,2982,2987],{},"A favourite example I like to reference when it comes to recommendation engines is one highlighted in the book, ",[14,2983,2986],{"href":2984,"rel":2985},"https://charlesduhigg.com/the-power-of-habit/",[18],"The Power of Habit",", by Charles Duhigg, of the American retail store, Target.",[10,2989,2990,2991,2996],{},"Target’s data analytics team got so good at building these systems, it got into the public limelight when it ",[14,2992,2995],{"href":2993,"rel":2994},"https://www.nytimes.com/2012/02/19/magazine/shopping-habits.html?pagewanted=1&_r=1&hp",[18],"suggested diapers in one of its marketing campaigns to a father"," who was sure his daughter was not. It recommended products users might want to purchase based on their patterns and on the data of other people they collected using their gift cards.",[10,2998,2999],{},"Other examples you might find interesting include how, for instance, LinkedIn uses the “You may also know” or “You may also like” for companies or profiles to follow.",[58,3001,3002],{},[10,3003,3004,3006,3007,3012],{},[63,3005,2638],{}," Did you know , Netflix has gone through phases in its ",[14,3008,3011],{"href":3009,"rel":3010},"https://gibsonbiddle.medium.com/a-brief-history-of-netflix-personalization-1f2debf010a1",[18],"Personalization using recommendation systems","?",[10,3014,3015],{},"What does this mean for the products in the build process?",[10,3017,3018,3019,3024],{},"For a preview, you can take a sneak peek into ",[14,3020,3023],{"href":3021,"rel":3022},"https://github.com/marvinkweyu/marastore",[18],"marvinkweyu/marastore"," - an e-commerce platform for travellers and backpackers. It includes within it, an item-based collaborative filtering engine. We dare answer;",[10,3026,3027],{},"Does user A need product Y given user B bought X and Y?",[10,3029,3030,3033,3034],{},[63,3031,3032],{},"Back to you, the reader",": ",[31,3035,3036],{},"How would you rank the aforementioned results?",[10,3038,3039],{},"Another example of a similar implementation is the library project, \"Urbanlibrary\" - the Afrocentric literature bookshelf. Within it, I implemented a mix-and-match if you may of recommendation algorithms. Is it based on history? Is it based on rating? You’ll never know unless you find out.",[1478,3041,1658],{"id":1657},[10,3043,3044],{},"Recommendation systems have evolved to suit different needs and algorithms have been built on top of each other to meet this demand. You can combine, break away from, build your own or adopt an existing solution. Either way, it offers a path to understanding your customers and business. Take advantage. Personalize this experience.",[58,3046,3047],{},[10,3048,3049,3051],{},[63,3050,913],{}," Perhaps all you need to be a mind reader is your browser history.",{"title":355,"searchDepth":356,"depth":356,"links":3053},[3054,3055,3056,3062,3063,3064],{"id":2774,"depth":356,"text":2775},{"id":2806,"depth":356,"text":2807},{"id":2819,"depth":356,"text":2820,"children":3057},[3058,3059,3060,3061],{"id":2826,"depth":359,"text":2827},{"id":2839,"depth":359,"text":2840},{"id":2872,"depth":359,"text":2873},{"id":2891,"depth":359,"text":2892},{"id":2943,"depth":356,"text":2944},{"id":2977,"depth":356,"text":2978},{"id":1657,"depth":356,"text":1658},"recommendation/cover.webp","The internet knows you better. Explore recommendation systems, predicting user preferences and choices.",{},"/indulge/recommendation-systems","---\nrank: 3\ntitle: Recommendation Systems\nsubtitle: The internet knows you better than you know yourself\ncoverImage: recommendation/cover.webp\ndescription: The internet knows you better. Explore recommendation systems, predicting user preferences and choices.\ndate: 12/12/2024\nfeatured: false\ntags: [software architecture, system design]\n---\n\n## Introduction\n\nI have a confession to make; I am a huge fan of sci-fi.\n\nWhether it is another episode of The Minority Report, Upload or Travelers, I am all for it. Perhaps the underlying cause is my fascination with how these societies use technology in their everyday lives. Moreso, perhaps it is in the chance to witness something that is on the brink of discovery in our modern-day information era.\n\nOne of the common theme that appears across these films is the ability of machines to predict what we want.\n\nAn observer need only take one look at how, say the show, The Minority Report, uses its predictive algorithm Hawk-Eye, to predict the occurrence of crime and compare it to Essex University’s [KeyCrime](https://www.essex.ac.uk/research/showcase/imagine-being-able-to-predict-a-crime-in-the-future), to see a [closeness between fiction and reality](https://www.marvinkweyu.net/indulge/the_effect_of_daydreaming_and_fiction_in_the_evolution_of_science).\n\nWhat if we could predict what would happen before it does? What if a machine could tell what you would buy before you actually get to it?\n\n---\n\n## What is a Recommendation System?\n\nA recommendation system is an information filtering technique that predicts what a user might prefer based on their historical interactions or preferences.\n\nAs an example, and coming back from our high on KeyCrime, if a user frequently watches romantic comedies on a streaming service, a recommendation system may suggest similar movies or TV shows. These systems are based on machine learning algorithms that analyze user behaviour to generate other details that they might be interested in.\n\nThey have become commonplace in industries such as e-commerce, social media platforms, security and healthcare. Let’s talk about this and the different aspects that come to play around recommendation engines.\n\n## Types of Recommendation Systems\n\nFor brevity, there are different types of recommendation systems, including content-based, collaborative-based, hybrid, and demographic-based recommendations.\n\n### Content-based Recommendation\n\nSay, for instance, you are called Ian, and you have a thing for apple products. You log into Instagram and double-tap on two or three images around apple products or advertisements. What happens in the background?\n\nContent-based recommendation systems make recommendations based on the similarity of items and are attached to the particular user. the more interaction you have with a system, the more accurate the data gets. In essence, a content-based recommendation engine needs a base item(s) around which a user’s actions(reviews, likes etc…) can be pegged.\n\n“We see you liked an image that has wheat. Here are other wheat-based products you might relish.”\n\n### Collaborative-based Recommendation\n\nWhat if we have a whole community of foodies? Could they ping each other based on what they enjoyed preparing?\n\n![collaborative](/recommendation/collaborative.webp)\n\nCollaborative-based recommendation systems generate recommendations based on the behaviour of similar users. If two users have similar preferences, the system will recommend items that one user has liked to the other.\n\n[The Netflix Prize](https://en.wikipedia.org/wiki/Netflix_Prize) was one such event where builders across the board were invited to a collaborative filtering algorithm challenge to improve upon its own algorithm, Cinematch. A grand prize of $1000 000 for any team that came through with the solution.\n\nBroadly speaking, collaborative-based recommendation systems are grouped into memory and model-based. For purposes of this guide, we shall focus on memory-based collaborative filtering within which we can further break into Item and user-based collaborative filtering.\n\n![collaborative2](/recommendation/collaborative2.webp)\n\n### User-based collaborative filtering\n\nAt its core, user-based collaborative filtering is based on similar consumption patterns.\n\nExample: Let’s say Rita finally set up her restaurant. We pay a visit, and you give it a 5-star rating. Now, your friend, Peter, does the same. Already, we have two users with a similar rating on the same location. It is very likely that because Rita and Peter have a 5-star rating on a specific item, they will have other items in common. Thus, we look for people with a rating of between 5 and 3.5 for the restaurant and suggest other restaurants they like to you.\n\n![user](/recommendation/user-based.webp)\n\nThis ‘envelope’ we just created in our example is called a threshold. So, a user with a rating of 1 on the said restaurant will not be a source of suggestions for our next restaurant hopping experience.\n\n### Item-based collaborative filtering\n\n_Example:_ Most users that buy bread also buy butter. therefore, these items must be similar. Or if user X likes films with ‘Iron man’ then they will like those with ‘Spiderman’. You get the gist.\n\n[Introduced by Amazon in 1998](https://patents.google.com/patent/US6266649), item-based filtering bases recommendations on similarities between items. This decision will affect our ‘pre-sales’ option during checkout. The suggestion is to get this customer to buy one more item, that is, spend more. This is the reason why everything in retail stores is where it is. Nothing by chance, nothing random.\n\nAre there challenges to collaborative filtering? Well, certainly. Depending on which of the aforementioned you use you might encounter the following:\n\n**The early rater problem**\n\nSo, you successfully have a user log in to your platform with 20 000 books. They rate 1 / 20 000. We literally have nothing to recommend.\n\n**Sparsity**\n\nYou have a number of users all of whom have rated a significant count of products. However, these items are too far spread apart. Say, for instance, back to books, only two have rated the same books. All the others have rated items with no duplication.\n\n**A gray sheep**\n\nYou know yourself. You like to remain unpredictable, you open browsers in incognito all the time, like random things every time and leave the platforms you visit. Just like Elle(laughs like Mojo Jojo).\n\n**The shilling attack**\n\nThis happens when a single user or group of people create multiple accounts on the same platform and rate , say a product in a certain way in order to sway other users’ interest to the items they are rating highly. It can also happen to sway users away from a product by giving it bad ratings.\n\n## Hybrid Recommendation\n\nCertainly, we must have come up with a workaround content and collaborative-based recommendation engines. In comes Hybrid recommendations.\n\nHybrid engines combine both content-based and collaborative-based approaches to generate recommendations.\n\nDemographic-based Recommendation\n\nDo you remember the piece, [Up and Away with Scalability](https://marvinkweyu.net/indulge) - specifically on caching and content delivery servers?\n\nDemographic-based recommendation systems make recommendations based on demographic information such as age, gender, or location.\n\nFor one, we could have a location that is known for a type of music. Thus, instead of having our data centre closest to them caching everything and all other genres, why not cache what people actually listen to?\n\nPro tip: Bongo, a music genre, is popular in the coastal regions of Kenya and Tanzania. My music service would therefore hold a cache for this genre on servers closest to these regions as opposed to , say Alaska.\n\nDemographic-based recommendation systems are often used for marketing purposes and can be particularly useful for identifying and targeting specific groups of users.\n\n## Applications of Recommendation Systems\n\nA favourite example I like to reference when it comes to recommendation engines is one highlighted in the book, [The Power of Habit](https://charlesduhigg.com/the-power-of-habit/), by Charles Duhigg, of the American retail store, Target.\n\nTarget’s data analytics team got so good at building these systems, it got into the public limelight when it [suggested diapers in one of its marketing campaigns to a father](https://www.nytimes.com/2012/02/19/magazine/shopping-habits.html?pagewanted=1&_r=1&hp) who was sure his daughter was not. It recommended products users might want to purchase based on their patterns and on the data of other people they collected using their gift cards.\n\nOther examples you might find interesting include how, for instance, LinkedIn uses the “You may also know” or “You may also like” for companies or profiles to follow.\n\n> **Thought:** Did you know , Netflix has gone through phases in its [Personalization using recommendation systems](https://gibsonbiddle.medium.com/a-brief-history-of-netflix-personalization-1f2debf010a1)?\n\nWhat does this mean for the products in the build process?\n\nFor a preview, you can take a sneak peek into [marvinkweyu/marastore](https://github.com/marvinkweyu/marastore) - an e-commerce platform for travellers and backpackers. It includes within it, an item-based collaborative filtering engine. We dare answer;\n\nDoes user A need product Y given user B bought X and Y?\n\n**Back to you, the reader**: _How would you rank the aforementioned results?_\n\nAnother example of a similar implementation is the library project, \"Urbanlibrary\" - the Afrocentric literature bookshelf. Within it, I implemented a mix-and-match if you may of recommendation algorithms. Is it based on history? Is it based on rating? You’ll never know unless you find out.\n\n## Conclusion\n\nRecommendation systems have evolved to suit different needs and algorithms have been built on top of each other to meet this demand. You can combine, break away from, build your own or adopt an existing solution. Either way, it offers a path to understanding your customers and business. Take advantage. Personalize this experience.\n\n> **Indulge:** Perhaps all you need to be a mind reader is your browser history.\n",{"title":2769,"description":3066},"indulge/recommendation-systems","The internet knows you better than you know yourself",[1711,1712],"qkkryllUzZdsBxX7YpvIqpaIdfx5SKPtrNN3vHgc59Q",{"id":3076,"title":3077,"body":3078,"coverImage":3171,"date":950,"description":3172,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3173,"navigation":371,"path":3174,"rank":1824,"rawbody":3175,"readTime":377,"seo":3176,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3177,"subtitle":3178,"tags":3179,"__hash__":3180},"indulge/indulge/software-engineering-architectural-patterns.md","Software Engineering Architectural Patterns",{"type":7,"value":3079,"toc":3169},[3080,3083,3086,3092,3095,3098,3104,3107,3110,3116,3119,3122,3127,3130,3135,3143,3146,3149,3160,3163,3166],[10,3081,3082],{},"And when you close your eyes, what do you see? Do you see ducktape? Do you see robust infrastructure? Do you see fragile systems? Do you see elegant architecture - Software engineering architectural patterns ?",[10,3084,3085],{},"Part of development, includes a thought process - the software development life cycle(SLDC). A point in time during which we remember that software development is more than just code; it involves more thinking.",[10,3087,3088],{},[177,3089],{"alt":3090,"src":3091},"architecture","/architecture/start.webp",[10,3093,3094],{},"The software development life cycle involves a series of steps engineering teams undergo to create, enhance and maintain sustainable software solutions.",[10,3096,3097],{},"As an overview:",[10,3099,3100],{},[177,3101],{"alt":3102,"src":3103},"overview","/architecture/overview.webp",[10,3105,3106],{},"Each step outlined above, acts as an input to the next and so forth.",[10,3108,3109],{},"We focus, at least in this series, on Architecture, which gives room for development (the part all engineers love).",[10,3111,3112],{},[177,3113],{"alt":3114,"src":3115},"step","/architecture/step.png",[10,3117,3118],{},"Take note, that the steps outlined in the development of sustainable systems (SDLC) may have more detailed steps in each. Do reach out , either in the comment section or directly, if you would like an elaboration of the same.",[10,3120,3121],{},"So what is Software architecture and what do Architectural patterns involve ?",[58,3123,3124],{},[10,3125,3126],{},"Software architecture is the definition of how components of a software system are organized and assembled and how these components communicate.",[10,3128,3129],{},"The output of the architectural design stage includes and is not limited to; prototypes, pseudocode, architecture reports and diagrams for technical details. This is a key step. Miss this or mess it up, and development becomes a financial and technical nightmare.",[10,3131,3132],{},[63,3133,3134],{},"Sidenote:",[10,3136,3137,3138,26],{},"Understand that design patterns and architectural patterns ",[14,3139,3142],{"href":3140,"rel":3141},"https://twitter.com/marvinus_j/status/1478387280352100360?s=20",[18],"are not the same",[10,3144,3145],{},"When determining the software architecture you intend to use, you ask a number of questions; does the system need the high performance? How adaptable should it be? How secure ? How modular should it be? Do we start with large components that have smaller sections, much like layered systems, or do we start off with small sections that form larger components - similar to the use of microservices?",[10,3147,3148],{},"Herein, and in the shares that follow, we shall discuss the most known patterns. We shall aim to understand:",[644,3150,3151,3154,3157],{},[647,3152,3153],{},"Monolithic patterns",[647,3155,3156],{},"Service-based patterns",[647,3158,3159],{},"Distributed systems",[10,3161,3162],{},"We shall break these down to know when and where to use layered systems, microservices , service-oriented patterns, space-based architecture, event-driven and microkernel architecture.",[10,3164,3165],{},"Through this, we discuss the advantages of each against its conns ; whiteboard software development.",[10,3167,3168],{},"Walk with me through this series, and let us talk about architecture.",{"title":355,"searchDepth":356,"depth":356,"links":3170},[],"architecture/cover.webp","A practical exploration of software engineering architectural patterns - from monoliths to distributed systems. Learn how architecture shapes scalability, performance and long-term system sustainability.",{},"/indulge/software-engineering-architectural-patterns","---\nrank: 4\ntitle: Software Engineering Architectural Patterns\nsubtitle: A Deep Dive into Software Architecture Patterns and System Design Decisions\ncoverImage: architecture/cover.webp\ndescription: A practical exploration of software engineering architectural patterns - from monoliths to distributed systems. Learn how architecture shapes scalability, performance and long-term system sustainability.\ndate: 12/12/2024\nfeatured: false\ntags: [software architecture, system design]\n---\n\nAnd when you close your eyes, what do you see? Do you see ducktape? Do you see robust infrastructure? Do you see fragile systems? Do you see elegant architecture - Software engineering architectural patterns ?\n\nPart of development, includes a thought process - the software development life cycle(SLDC). A point in time during which we remember that software development is more than just code; it involves more thinking.\n\n![architecture](/architecture/start.webp)\n\nThe software development life cycle involves a series of steps engineering teams undergo to create, enhance and maintain sustainable software solutions.\n\nAs an overview:\n\n![overview](/architecture/overview.webp)\n\nEach step outlined above, acts as an input to the next and so forth.\n\nWe focus, at least in this series, on Architecture, which gives room for development (the part all engineers love).\n\n![step](/architecture/step.png)\n\nTake note, that the steps outlined in the development of sustainable systems (SDLC) may have more detailed steps in each. Do reach out , either in the comment section or directly, if you would like an elaboration of the same.\n\nSo what is Software architecture and what do Architectural patterns involve ?\n\n> Software architecture is the definition of how components of a software system are organized and assembled and how these components communicate.\n\nThe output of the architectural design stage includes and is not limited to; prototypes, pseudocode, architecture reports and diagrams for technical details. This is a key step. Miss this or mess it up, and development becomes a financial and technical nightmare.\n\n**Sidenote:**\n\nUnderstand that design patterns and architectural patterns [are not the same](https://twitter.com/marvinus_j/status/1478387280352100360?s=20).\n\nWhen determining the software architecture you intend to use, you ask a number of questions; does the system need the high performance? How adaptable should it be? How secure ? How modular should it be? Do we start with large components that have smaller sections, much like layered systems, or do we start off with small sections that form larger components - similar to the use of microservices?\n\nHerein, and in the shares that follow, we shall discuss the most known patterns. We shall aim to understand:\n\n- Monolithic patterns\n\n- Service-based patterns\n\n- Distributed systems\n\nWe shall break these down to know when and where to use layered systems, microservices , service-oriented patterns, space-based architecture, event-driven and microkernel architecture.\n\nThrough this, we discuss the advantages of each against its conns ; whiteboard software development.\n\nWalk with me through this series, and let us talk about architecture.\n",{"title":3077,"description":3172},"indulge/software-engineering-architectural-patterns","A Deep Dive into Software Architecture Patterns and System Design Decisions",[1711,1712],"AvIrcAfYQSB136EkXlebbnlM1lgz35ZMSoAvCxAFTco",{"id":3182,"title":3183,"body":3184,"coverImage":380,"date":3351,"description":3352,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3353,"navigation":371,"path":3354,"rank":1840,"rawbody":3355,"readTime":377,"seo":3356,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3357,"subtitle":3358,"tags":3359,"__hash__":3361},"indulge/indulge/the-20%-that-makes-all-the-difference.md","The 20% that makes all the difference",{"type":7,"value":3185,"toc":3345},[3186,3191,3194,3203,3206,3211,3220,3224,3227,3232,3235,3244,3246,3252,3260,3269,3277,3286,3289,3294,3296,3305,3307,3309,3312,3315],[58,3187,3188],{},[10,3189,3190],{},"“And I took the road less travelled. And that made all the difference.”",[10,3192,3193],{},"Time management is something I find myself working through every once in a while. This will often involve writing down weekly items to check off, crossing 2 of the twenty of my to-do list, crossing a 3/4 or throwing it all together.",[10,3195,3196,3197,3202],{},"My read on effective engineering dubbed, ",[14,3198,3201],{"href":3199,"rel":3200},"https://www.goodreads.com/book/show/25238425-the-effective-engineer?ac=1&from_search=true&qid=V59d6Adpga&rank=1",[18],"The Effective Enginee","r by Edmond Lau, has been as inspirational as it has been eye-opening. From this, a few thought processes came up that would be worth noting, specifically regarding impact, sustainability and effectiveness.",[10,3204,3205],{},"To quote:",[58,3207,3208],{},[10,3209,3210],{},"I worked the long hours because I wanted to make a meaningful impact, but I couldn’t help but wonder: Was putting in 70-80 hour weeks really the most effective way of ensuring our startup’s success? Our intentions were sound, but could we have worked smarter? - Edmond Lau",[10,3212,3213,3214,3219],{},"With this piece, and in a builder’s pursuit of mastery, I will interweave a few ideas, thoughts and research points to challenge convention and support the contrarian or vice versa. It is a leap out of the ",[14,3215,3218],{"href":3216,"rel":3217},"https://www.marvinkweyu.net/indulge/work_and_life",[18],"day-to-day routine"," of the builder and into the vastness unknown.",[42,3221,3223],{"id":3222},"the-always-be-shipping-mantra","The Always Be Shipping mantra",[10,3225,3226],{},"The most captivating moment from the book, at least for me, was the mention and talk of experimentation. The goal being to build not for the sake of it. I call it flow and experimentation.",[58,3228,3229],{},[10,3230,3231],{},"I can’t tell you why you need a home computer right now. I mean, people ask me, “Why should I buy a computer in my home?” And I say, “Well, to learn about it, to run some fun simulations. If you’ve got some kids, they should probably know about it in terms of literacy. They can probably get some good educational software, especially if they’re younger. “You can hook up to the source and, you know, do whatever you’re going to do. Meet women, I don’t know. But other than that, there’s no good reason to buy one for your house right now. But there will be. There will be.” - Steve Jobs (Speech at the International Design Conference in Aspen, June 1983)",[10,3233,3234],{},"In the early 2000s, Google pioneered what was called “The 20% time” - a chip of time within which engineers in its domain would be free to leverage Google’s technology to build their own products unhindered. Suffice it to say, this led to the development of products such as Google News, Google Maps and Gmail.",[10,3236,3237,3238,3243],{},"Consequently, this fostered a culture of innovation and creativity which contributed to its relish within the engineering community as the ‘go-to’ company to work with. ",[14,3239,3242],{"href":3240,"rel":3241},"https://www.wired.com/2012/12/llinkedin-20-percent-time/",[18],"LinkedIn, Atlassian and Adobe"," followed suit with hopes of catching up.",[39,3245],{},[10,3247,3248,2620],{},[177,3249],{"alt":3250,"src":3251},"Instagram","https://res.cloudinary.com/dlxhllkxl/image/upload/v1687601656/Indulge/how-instagram-started_xnrhsa.png",[58,3253,3254],{},[10,3255,3256,3257],{},"I don't know what the future will bring, but if you stop investing in basic research today, you won't have a future. - ",[63,3258,3259],{},"Neil deGrasse Tyson",[10,3261,3262,3263,3268],{},"From my experience, it is always the builders that do more than is within their scope that end up being the great men and women in their domain; ",[14,3264,3267],{"href":3265,"rel":3266},"https://www.marvinkweyu.net/indulge/a_call_to_dream",[18],"the innovators of the future",". To mention a few of these; ProductHunt, Slack, Twitter, Pinterest (hello Elle), Shopify, AppSumo and GitHub. For the founders, it was the little something on the side that made all the difference.",[10,3270,3271,3272,26],{},"Remarkably, by the time the aforementioned companies were either acquired, went public or reached a certain user-base marking, their ratio of engineer to user was in the scale of one to thousands or even millions. In other words, they had built successful enterprises not with an abundance of human resources but with a vision for a product that ",[14,3273,3276],{"href":3274,"rel":3275},"https://www.marvinkweyu.net/indulge/necessity_versus_opportunity",[18],"addressed their immediate need",[58,3278,3279],{},[10,3280,3281,3282,3285],{},"The reason we ",[1775,3283,3284],{},"Woz and I"," built a computer was that we wanted one, and we couldn’t afford to buy one… We were just two teenagers. We started trying to build them and scrounging parts around Silicon Valley where we could…All our friends wanted them too. It was taking up all of our spare time because our friends were not that skilled at building them, so Woz and I were building them for them. - Steve Jobs, 1996, Apple 20th anniversary.",[3287,3288],"br",{},[10,3290,3291,3293],{},[63,3292,2638],{},"\nIf someone does not think you are insane for how relentlessly you work to achieve your dreams, you might want to re-evaluate your choices. Being called crazy and being rejected is not such a bad thing.",[1478,3295,1658],{"id":1657},[10,3297,3298,3299,3304],{},"In the end, ",[14,3300,3303],{"href":3301,"rel":3302},"https://youtu.be/pqQrL1K0Z5g?t=184",[18],"you might never know when or where your project might be of use"," to the rest of the populous. The least you can do, however, is to take a chunk of time within your day to build, innovate and imagine the possibilities.",[39,3306],{},[3287,3308],{},[42,3310,2735],{"id":3311},"reference-notes",[10,3313,3314],{},"For some notes on how some of the products above came to be, I leave some starter resources here.",[644,3316,3317,3324,3331,3338],{},[647,3318,3319],{},[14,3320,3323],{"href":3321,"rel":3322},"https://nira.com/github-history/",[18],"How GitHub Democratized Coding, Built a $2 Billion Business, and Found a New Home at Microsoft",[647,3325,3326],{},[14,3327,3330],{"href":3328,"rel":3329},"https://www.youtube.com/watch?v=2rqwi63Q1Gs",[18],"Steve Jobs Speech at the International Design Conference 1983",[647,3332,3333],{},[14,3334,3337],{"href":3335,"rel":3336},"https://medium.com/lets-make-things/the-origin-of-product-hunt-7acb09e2593a",[18],"The origin of ProductHunt",[647,3339,3340],{},[14,3341,3344],{"href":3342,"rel":3343},"https://www.goodreads.com/book/show/128533513-make-something-wonderful",[18],"Make Something Wonderful - Steve Jobs",{"title":355,"searchDepth":356,"depth":356,"links":3346},[3347,3348],{"id":3222,"depth":359,"text":3223},{"id":1657,"depth":356,"text":1658,"children":3349},[3350],{"id":3311,"depth":359,"text":2735},"07/26/2024","Thoughts on time, innovation and self",{},"/indulge/the-20percent-that-makes-all-the-difference","---\nrank: 6\ntitle: The 20% that makes all the difference\nsubtitle: Side projects and their impact on culture and innovation\ndescription: Thoughts on time, innovation and self\ndate: 07/26/2024\ntags: [indulge, innovation]\n---\n\n> “And I took the road less travelled. And that made all the difference.”\n\nTime management is something I find myself working through every once in a while. This will often involve writing down weekly items to check off, crossing 2 of the twenty of my to-do list, crossing a 3/4 or throwing it all together.\n\nMy read on effective engineering dubbed, [The Effective Enginee](https://www.goodreads.com/book/show/25238425-the-effective-engineer?ac=1\\&from_search=true\\&qid=V59d6Adpga\\&rank=1)r by Edmond Lau, has been as inspirational as it has been eye-opening. From this, a few thought processes came up that would be worth noting, specifically regarding impact, sustainability and effectiveness.\n\nTo quote:\n\n> I worked the long hours because I wanted to make a meaningful impact, but I couldn’t help but wonder: Was putting in 70-80 hour weeks really the most effective way of ensuring our startup’s success? Our intentions were sound, but could we have worked smarter? - Edmond Lau\n\nWith this piece, and in a builder’s pursuit of mastery, I will interweave a few ideas, thoughts and research points to challenge convention and support the contrarian or vice versa. It is a leap out of the [day-to-day routine](https://www.marvinkweyu.net/indulge/work_and_life) of the builder and into the vastness unknown.\n\n### The Always Be Shipping mantra\n\nThe most captivating moment from the book, at least for me, was the mention and talk of experimentation. The goal being to build not for the sake of it. I call it flow and experimentation.\n\n> I can’t tell you why you need a home computer right now. I mean, people ask me, “Why should I buy a computer in my home?” And I say, “Well, to learn about it, to run some fun simulations. If you’ve got some kids, they should probably know about it in terms of literacy. They can probably get some good educational software, especially if they’re younger. “You can hook up to the source and, you know, do whatever you’re going to do. Meet women, I don’t know. But other than that, there’s no good reason to buy one for your house right now. But there will be. There will be.” - Steve Jobs (Speech at the International Design Conference in Aspen, June 1983)\n\nIn the early 2000s, Google pioneered what was called “The 20% time” - a chip of time within which engineers in its domain would be free to leverage Google’s technology to build their own products unhindered. Suffice it to say, this led to the development of products such as Google News, Google Maps and Gmail.\n\nConsequently, this fostered a culture of innovation and creativity which contributed to its relish within the engineering community as the ‘go-to’ company to work with. [LinkedIn, Atlassian and Adobe](https://www.wired.com/2012/12/llinkedin-20-percent-time/) followed suit with hopes of catching up.\n\n---\n\n![Instagram](https://res.cloudinary.com/dlxhllkxl/image/upload/v1687601656/Indulge/how-instagram-started_xnrhsa.png):br\n\n> I don't know what the future will bring, but if you stop investing in basic research today, you won't have a future. - **Neil deGrasse Tyson**\n\nFrom my experience, it is always the builders that do more than is within their scope that end up being the great men and women in their domain; [the innovators of the future](https://www.marvinkweyu.net/indulge/a_call_to_dream). To mention a few of these; ProductHunt, Slack, Twitter, Pinterest (hello Elle), Shopify, AppSumo and GitHub. For the founders, it was the little something on the side that made all the difference.\n\nRemarkably, by the time the aforementioned companies were either acquired, went public or reached a certain user-base marking, their ratio of engineer to user was in the scale of one to thousands or even millions. In other words, they had built successful enterprises not with an abundance of human resources but with a vision for a product that [addressed their immediate need](https://www.marvinkweyu.net/indulge/necessity_versus_opportunity).\n\n> The reason we [Woz and I] built a computer was that we wanted one, and we couldn’t afford to buy one… We were just two teenagers. We started trying to build them and scrounging parts around Silicon Valley where we could…All our friends wanted them too. It was taking up all of our spare time because our friends were not that skilled at building them, so Woz and I were building them for them. - Steve Jobs, 1996, Apple 20th anniversary.\n\n:br\n\n**Thought:**\nIf someone does not think you are insane for how relentlessly you work to achieve your dreams, you might want to re-evaluate your choices. Being called crazy and being rejected is not such a bad thing.\n\n## Conclusion\n\nIn the end, [you might never know when or where your project might be of use](https://youtu.be/pqQrL1K0Z5g?t=184) to the rest of the populous. The least you can do, however, is to take a chunk of time within your day to build, innovate and imagine the possibilities.\n\n---\n\n:br\n\n### Reference notes\n\nFor some notes on how some of the products above came to be, I leave some starter resources here.\n\n- [How GitHub Democratized Coding, Built a $2 Billion Business, and Found a New Home at Microsoft](https://nira.com/github-history/)\n- [Steve Jobs Speech at the International Design Conference 1983](https://www.youtube.com/watch?v=2rqwi63Q1Gs)\n- [The origin of ProductHunt](https://medium.com/lets-make-things/the-origin-of-product-hunt-7acb09e2593a)\n- [Make Something Wonderful - Steve Jobs](https://www.goodreads.com/book/show/128533513-make-something-wonderful)\n",{"title":3183,"description":3352},"indulge/the-20%-that-makes-all-the-difference","Side projects and their impact on culture and innovation",[2555,3360],"innovation","i8Go_b-0KQ1hiyv6O7G_f0KOaiX7GMZe8qus23ygdGU",{"id":3363,"title":3364,"body":3365,"coverImage":380,"date":950,"description":2652,"draft":369,"extension":370,"featured":369,"group":2496,"initial":369,"meta":3394,"navigation":371,"path":3395,"rank":2166,"rawbody":3396,"readTime":377,"seo":3397,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3398,"subtitle":355,"tags":3399,"__hash__":3400},"indulge/indulge/the-start-of-an-adventure.md","Homelabbing - The Start Of An Adventure",{"type":7,"value":3366,"toc":3392},[3367,3370,3374,3377,3380,3389],[10,3368,3369],{},"My recent work on Scale Computing and Opennebula has piqued my interest in home lab environments. I decided to take a peek and got myself a HP G2 800 minicomputer for play.This , along with a number of smart devices to really push the limits of what is possible.",[1345,3371,3373],{"id":3372},"so-what-is-a-home-lab","So, what is a home lab?",[10,3375,3376],{},"A home lab serves as a safe space for tech enthusiasts to experiment on ideas.",[10,3378,3379],{},"So far, I have been able to create and manage virtual machines including the assignment of public IP address and management of mikrotik routers. All this has been in a globally distributed environment with data centers all over. While this is exciting in and of itself, I always wondered; what doors could I possibly unlock if I ran my own set up within a space I could control? I built this space for exactly this reason.",[10,3381,3382,3383,3388],{},"The ",[31,3384,3385],{},[63,3386,3387],{},"#homelabbing"," series serves as a documentation of the experiments I perform on this handy resource I currently have. It will encompass everything from setting up , power consumption, projects I am working on to the paths I take in the foreseeable future.",[10,3390,3391],{},"It is my hope that on this wire of the internet, someone finds a spark — the same curiosity that led me down this rabbit hole. Whether you're just getting started or are years into your own home lab journey, may this series serve as a source of insight, inspiration, and maybe even a few lessons from my inevitable missteps. The adventure has just begun, and I look forward to sharing each step along the way.",{"title":355,"searchDepth":356,"depth":356,"links":3393},[],{},"/indulge/the-start-of-an-adventure","---\ntitle: Homelabbing - The Start Of An Adventure\nseries: true\ngroup: Infrastructure\nrank: 13\nsubtitle: \"\"\ndescription: Navigating a mental mindshif on entrepreneurship\ndate: 12/12/2024\ntags: [technology, homelabbing]\n---\n\nMy recent work on Scale Computing and Opennebula has piqued my interest in home lab environments. I decided to take a peek and got myself a HP G2 800 minicomputer for play.This , along with a number of smart devices to really push the limits of what is possible.\n\n#### So, what is a home lab?\n\nA home lab serves as a safe space for tech enthusiasts to experiment on ideas.\n\nSo far, I have been able to create and manage virtual machines including the assignment of public IP address and management of mikrotik routers. All this has been in a globally distributed environment with data centers all over. While this is exciting in and of itself, I always wondered; what doors could I possibly unlock if I ran my own set up within a space I could control? I built this space for exactly this reason.\n\nThe ***#homelabbing*** series serves as a documentation of the experiments I perform on this handy resource I currently have. It will encompass everything from setting up , power consumption, projects I am working on to the paths I take in the foreseeable future.\n\nIt is my hope that on this wire of the internet, someone finds a spark — the same curiosity that led me down this rabbit hole. Whether you're just getting started or are years into your own home lab journey, may this series serve as a source of insight, inspiration, and maybe even a few lessons from my inevitable missteps. The adventure has just begun, and I look forward to sharing each step along the way.\n",{"title":3364,"description":2652},"indulge/the-start-of-an-adventure",[960,2504],"6RpPmhRX1-1YxJn6ok-OWzuwgggux4CTW4xlmKja-Zc",{"id":3402,"title":3403,"body":3404,"coverImage":3496,"date":3497,"description":3498,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3499,"navigation":371,"path":3500,"rank":2149,"rawbody":3501,"readTime":377,"seo":3502,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3503,"subtitle":3504,"tags":3505,"__hash__":3510},"indulge/indulge/the-value-chain-hackathon.md","The Value Chain Factory hackathon",{"type":7,"value":3405,"toc":3490},[3406,3410,3413,3419,3422,3425,3429,3432,3438,3442,3445,3450,3454,3457,3463,3466,3471,3474,3479,3485],[42,3407,3409],{"id":3408},"built-by-africans-and-for-africans","Built by Africans and for Africans",[10,3411,3412],{},"It’s been a week since we had our first hackathon here at Value Chain Factory. A week since we had a buzz of activity with young engineers teeming with ideas on how to create the next solution that would address Africa’s most daunting challenges.",[10,3414,3415],{},[177,3416],{"alt":3417,"src":3418},"team innovation","https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713566/Indulge/value_chain_hackathon/team_innovation_fofpxw.jpg",[10,3420,3421],{},"Over the weekend, my team had the pleasure of hosting one of the most exciting hackathons we have had this quarter. Our aim was to call upon innovators in the technical space to share and build upon their ideas on agriculture, health and transport; matters that are paramount in a mineral and nutrient-rich continent.",[10,3423,3424],{},"Of the possible startups brought forth, I thought I would mention a few notable ones. That is, that in conjunction with my team and the participants, would provide more value and be impactful in their own right.",[42,3426,3428],{"id":3427},"lifeline-medicare","Lifeline medicare",[10,3430,3431],{},"To assist emergency responders, team #lifelinemedicare created a solution that stores key details of their patients. Succinctly, the determining whether a particular treatment would be viable for an incapacitated patient.",[10,3433,3434],{},[177,3435],{"alt":3436,"src":3437},"team_nfc.jpg","https://cdn.hashnode.com/res/hashnode/image/upload/v1668713033637/wYfqiWlYK.jpg",[42,3439,3441],{"id":3440},"smartbins","SmartBins",[10,3443,3444],{},"With an ever-growing population, currently, at 8 billion, our primary approach to waste disposal and management has been to bury it. Practically equivalent to burying our heads in the sand and letting the tides of time do its thing. To address this, the smartbins startup would provide waste management services. Taking up this role from collection, recycling and selling of compost manure back to the local farmer.",[10,3446,3447],{},[177,3448],{"alt":3441,"src":3449},"https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713568/Indulge/value_chain_hackathon/mentor_fyizqm.jpg",[42,3451,3453],{"id":3452},"the-farmer-market-bridge","The Farmer-market bridge",[10,3455,3456],{},"To complete the cycle, the market bridge team would open up the marketplace to expose farmers to their immediate sellers. In a way, making the farmer aware of their produce’s movement through to the consumer.",[10,3458,3459],{},[177,3460],{"alt":3461,"src":3462},"MarktetBridge","https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713570/Indulge/value_chain_hackathon/market_bridge_ctb360.jpg",[10,3464,3465],{},"What stood out was how these builders were willing to take a leap in validating their enterprises. An emerging trend amongst this lot of African engineers, was their embrace of new technology. From the use of NFC tags in medicine, the leverage of blockchain technology for transparent transactions to the use of geo-sensors in garbage collection. They took a step beyond ideation to provide the next possible solution.",[10,3467,3468],{},[63,3469,3470],{},"Remember:",[10,3472,3473],{},"More important than starting a particular startup, is getting to meet a number of potential cofounders. From there, instead of working on what you intend to make and then finding the audience, work in the reverse by thinking of the public. Ideate.",[58,3475,3476],{},[10,3477,3478],{},"You should only start a startup if you feel compelled by a certain problem and you think starting a startup is the only way to solve it. The passion should come first, and the startup comes second. - Sam Altman",[10,3480,3481,3482],{},"Thus, to you the reader: ",[31,3483,3484],{},"If you knew success was a certainty, what would you do?",[10,3486,3487,3489],{},[63,3488,1390],{}," Yes. My team came second. Because winning is what we do. Hi Wachira.",{"title":355,"searchDepth":356,"depth":356,"links":3491},[3492,3493,3494,3495],{"id":3408,"depth":359,"text":3409},{"id":3427,"depth":359,"text":3428},{"id":3440,"depth":359,"text":3441},{"id":3452,"depth":359,"text":3453},"https://res.cloudinary.com/dlxhllkxl/image/upload/v1668714057/Indulge/value_chain_hackathon/hackathon_banner_ljuwrv.png","11/18/2022","Africa's technology space. Using hackathons as the drivers for startups and innovation",{},"/indulge/the-value-chain-hackathon","---\ntitle: The Value Chain Factory hackathon\nsubtitle: Building solutions for Africa\ncoverImage: https://res.cloudinary.com/dlxhllkxl/image/upload/v1668714057/Indulge/value_chain_hackathon/hackathon_banner_ljuwrv.png\ndescription: Africa's technology space. Using hackathons as the drivers for\n  startups and innovation\ndate: 11/18/2022\nrank: 12\ntags: [technology, entrepreneurship, africa, agriculture, healthcare, transport]\n---\n\n### Built by Africans and for Africans\n\nIt’s been a week since we had our first hackathon here at Value Chain Factory. A week since we had a buzz of activity with young engineers teeming with ideas on how to create the next solution that would address Africa’s most daunting challenges.\n\n![team innovation](https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713566/Indulge/value_chain_hackathon/team_innovation_fofpxw.jpg)\n\nOver the weekend, my team had the pleasure of hosting one of the most exciting hackathons we have had this quarter. Our aim was to call upon innovators in the technical space to share and build upon their ideas on agriculture, health and transport; matters that are paramount in a mineral and nutrient-rich continent.\n\nOf the possible startups brought forth, I thought I would mention a few notable ones. That is, that in conjunction with my team and the participants, would provide more value and be impactful in their own right.\n\n### Lifeline medicare\n\nTo assist emergency responders, team #lifelinemedicare created a solution that stores key details of their patients. Succinctly, the determining whether a particular treatment would be viable for an incapacitated patient.\n\n\u003C!-- ![Lifeline medicare](../../assets/indulge/hackathon/team_nfc.jpg) -->\n\n![team\\_nfc.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1668713033637/wYfqiWlYK.jpg)\n\n### SmartBins\n\nWith an ever-growing population, currently, at 8 billion, our primary approach to waste disposal and management has been to bury it. Practically equivalent to burying our heads in the sand and letting the tides of time do its thing. To address this, the smartbins startup would provide waste management services. Taking up this role from collection, recycling and selling of compost manure back to the local farmer.\n\n![SmartBins](https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713568/Indulge/value_chain_hackathon/mentor_fyizqm.jpg)\n\n### The Farmer-market bridge\n\nTo complete the cycle, the market bridge team would open up the marketplace to expose farmers to their immediate sellers. In a way, making the farmer aware of their produce’s movement through to the consumer.\n\n![MarktetBridge](https://res.cloudinary.com/dlxhllkxl/image/upload/v1668713570/Indulge/value_chain_hackathon/market_bridge_ctb360.jpg)\n\nWhat stood out was how these builders were willing to take a leap in validating their enterprises. An emerging trend amongst this lot of African engineers, was their embrace of new technology. From the use of NFC tags in medicine, the leverage of blockchain technology for transparent transactions to the use of geo-sensors in garbage collection. They took a step beyond ideation to provide the next possible solution.\n\n**Remember:**\n\nMore important than starting a particular startup, is getting to meet a number of potential cofounders. From there, instead of working on what you intend to make and then finding the audience, work in the reverse by thinking of the public. Ideate.\n\n> You should only start a startup if you feel compelled by a certain problem and you think starting a startup is the only way to solve it. The passion should come first, and the startup comes second. - Sam Altman\n\nThus, to you the reader: *If you knew success was a certainty, what would you do?*\n\n**PS:** Yes. My team came second. Because winning is what we do. Hi Wachira.\n",{"title":3403,"description":3498},"indulge/the-value-chain-hackathon","Building solutions for Africa",[960,2660,3506,3507,3508,3509],"africa","agriculture","healthcare","transport","P6KA_AJDanTjS6yvvMT-HnLWbTBZ3aorOdHVmXRBE5o",{"id":3512,"title":3513,"body":3514,"coverImage":3636,"date":3637,"description":3638,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3639,"navigation":371,"path":3640,"rank":2139,"rawbody":3641,"readTime":377,"seo":3642,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3643,"subtitle":3644,"tags":3645,"__hash__":3646},"indulge/indulge/the_place_of_technology_in_africa.md","TechStartup weekend",{"type":7,"value":3515,"toc":3634},[3516,3525,3531,3534,3537,3543,3546,3585,3588,3597,3600,3609,3612,3618,3621,3626,3629],[10,3517,3518,3519,3524],{},"I had the opportunity to participate in ",[14,3520,3523],{"href":3521,"rel":3522},"https://www.techstars.com/",[18],"The #TechStartUpWeekend"," - a 3-day event aimed at bringing innovators from all fields and ages to participate in a challenge that would build solutions for Africa.",[10,3526,3527],{},[177,3528],{"alt":3529,"src":3530},"StartupWeekend","https://res.cloudinary.com/dlxhllkxl/image/upload/v1668197057/Indulge/startupweekend_jrk63h.jpg",[10,3532,3533],{},"During this time, I got to interact with the best in their fields; lawyers, psychologists, mechanical engineers , security analysts, fellow startup founders and so forth. Each of us was brought together to spark sustainable solutions that would impact our communities in one way or another.",[10,3535,3536],{},"Truth be told, it was a nerve-wracking 54-hour brain-storming session.",[10,3538,3539],{},[177,3540],{"alt":3541,"src":3542},"Brainstorming","https://res.cloudinary.com/dlxhllkxl/image/upload/v1668195812/Indulge/brainstorming_cn0hzu.jpg",[10,3544,3545],{},"Suffice it to say, from this, we brought to life a number of products:",[3547,3548,3549,3557,3565,3568,3576,3579,3582],"ol",{},[647,3550,3551,3556],{},[14,3552,3555],{"href":3553,"rel":3554},"https://twitter.com/startupwkndNBI/status/1510628698793336841",[18],"ABCs of mental Health"," (A place to get mental to the corporate workforce)",[647,3558,3559,3564],{},[14,3560,3563],{"href":3561,"rel":3562},"https://twitter.com/Knockknockke/status/1561970483372986368",[18],"Knock knock","(Accessible emergency services to those with hearing disabilities.)",[647,3566,3567],{},"Iko Network (A solution that provides easy registration to visitors within a premises)",[647,3569,3570,3575],{},[14,3571,3574],{"href":3572,"rel":3573},"https://twitter.com/startupwkndNBI/status/1510621873285087240",[18],"Vamva"," (A #fintech solution solving the barrier-to-growth problems faced by ride-hailing drivers and other mobility )",[647,3577,3578],{},"Caes International (An organisation that gives the local boda-boda rider rechargeable batteries.)",[647,3580,3581],{},"Instruct Kenya - An easy-to-access legal advisory platform",[647,3583,3584],{},"ShopOkoa - money management services to university students",[10,3586,3587],{},"One point that resonated with me, however, was the fact that technology should not be the #1 go-to to solving the that Africa faces.",[58,3589,3590],{},[10,3591,3592,3593,3596],{},"Technology should not be the ",[63,3594,3595],{},"#1 go-to"," to solving the challenges that Africa faces.",[10,3598,3599],{},"Rather than shoving technology down the throat of our future product users, our question should bring us back to one single question:",[10,3601,3602],{},[31,3603,3604,3605,3608],{},"How will this product affect the local citizen(",[31,3606,3607],{},"mama mboga",")?",[10,3610,3611],{},"Along with the network built and the products created, I got #first-hand information as to the success points and pitfalls of pushing a successful product through the African market. How do you identify the different types of users, and tell whether that specific cluster needs what you have to offer?",[10,3613,3614],{},[177,3615],{"alt":3616,"src":3617},"market_vaibility.jpg","https://cdn.hashnode.com/res/hashnode/image/upload/v1668166819366/YB4K4jEXY.jpg",[10,3619,3620],{},"Do the people want this? Talk with the people. Who are your users? How are they different? What are their needs?",[58,3622,3623],{},[10,3624,3625],{},"The best feedback you're going to get on your product is in the 3 seconds after you tell them the price.",[10,3627,3628],{},"Ultimately, the baseline sits with where you intend to take your product and what solution it intends to tackle. Removing the technical jargon and complexity, we ask:",[10,3630,3631],{},[31,3632,3633],{},"'Is this the most suitable way to solve this problem?'",{"title":355,"searchDepth":356,"depth":356,"links":3635},[],"https://res.cloudinary.com/dlxhllkxl/image/upload/v1668274729/Indulge/Innovate_Africa_aioanx.png","11/12/2022","Africa's technology space. The capacity of African builders and entrepreneurs to build sustainable solutions for the communities they dwell.",{},"/indulge/the_place_of_technology_in_africa","---\nrank: 11\ntitle: TechStartup weekend\nsubtitle: The place of technology in Africa\ncoverImage: https://res.cloudinary.com/dlxhllkxl/image/upload/v1668274729/Indulge/Innovate_Africa_aioanx.png\ndescription: Africa's technology space. The capacity of African builders and entrepreneurs to build sustainable solutions for the communities they dwell.\ndate: 11/12/2022\ntags: [technology, entrepreneurship, africa]\n---\n\nI had the opportunity to participate in [The #TechStartUpWeekend](https://www.techstars.com/) - a 3-day event aimed at bringing innovators from all fields and ages to participate in a challenge that would build solutions for Africa.\n\n![StartupWeekend](https://res.cloudinary.com/dlxhllkxl/image/upload/v1668197057/Indulge/startupweekend_jrk63h.jpg)\n\nDuring this time, I got to interact with the best in their fields; lawyers, psychologists, mechanical engineers , security analysts, fellow startup founders and so forth. Each of us was brought together to spark sustainable solutions that would impact our communities in one way or another.\n\nTruth be told, it was a nerve-wracking 54-hour brain-storming session.\n\n![Brainstorming](https://res.cloudinary.com/dlxhllkxl/image/upload/v1668195812/Indulge/brainstorming_cn0hzu.jpg)\n\nSuffice it to say, from this, we brought to life a number of products:\n\n1. [ABCs of mental Health](https://twitter.com/startupwkndNBI/status/1510628698793336841) (A place to get mental to the corporate workforce)\n2. [Knock knock](https://twitter.com/Knockknockke/status/1561970483372986368)(Accessible emergency services to those with hearing disabilities.)\n3. Iko Network (A solution that provides easy registration to visitors within a premises)\n4. [Vamva](https://twitter.com/startupwkndNBI/status/1510621873285087240) (A #fintech solution solving the barrier-to-growth problems faced by ride-hailing drivers and other mobility )\n5. Caes International (An organisation that gives the local boda-boda rider rechargeable batteries.)\n6. Instruct Kenya - An easy-to-access legal advisory platform\n7. ShopOkoa - money management services to university students\n\nOne point that resonated with me, however, was the fact that technology should not be the #1 go-to to solving the that Africa faces.\n\n> Technology should not be the **#1 go-to** to solving the challenges that Africa faces.\n\nRather than shoving technology down the throat of our future product users, our question should bring us back to one single question:\n\n*How will this product affect the local citizen(*mama mboga*)?*\n\nAlong with the network built and the products created, I got #first-hand information as to the success points and pitfalls of pushing a successful product through the African market. How do you identify the different types of users, and tell whether that specific cluster needs what you have to offer?\n\n![market_vaibility.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1668166819366/YB4K4jEXY.jpg)\n\nDo the people want this? Talk with the people. Who are your users? How are they different? What are their needs?\n\n> The best feedback you're going to get on your product is in the 3 seconds after you tell them the price.\n\nUltimately, the baseline sits with where you intend to take your product and what solution it intends to tackle. Removing the technical jargon and complexity, we ask:\n\n_'Is this the most suitable way to solve this problem?'_\n\n\u003C!-- \u003Cnuxt-img src=\"https://cdn.hashnode.com/res/hashnode/image/upload/v1668166819366/YB4K4jEXY.jpg\" sizes=\"sm:300px md:50vw lg:900px\" /> -->\n",{"title":3513,"description":3638},"indulge/the_place_of_technology_in_africa","The place of technology in Africa",[960,2660,3506],"jFffLuG9C-izjuMwwQdYgRIXR-ABv2VERKivdPua9s8",{"id":630,"title":631,"body":3648,"coverImage":380,"date":676,"description":677,"draft":369,"extension":370,"featured":369,"group":372,"initial":369,"meta":3678,"navigation":371,"path":679,"rank":377,"rawbody":680,"readTime":377,"seo":3679,"series":371,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":682,"subtitle":683,"tags":3680,"__hash__":685},{"type":7,"value":3649,"toc":3676},[3650,3652,3654,3656,3670,3672,3674],[10,3651,636],{},[10,3653,639],{},[10,3655,642],{},[644,3657,3658,3660,3662,3664,3666,3668],{},[647,3659,649],{},[647,3661,652],{},[647,3663,655],{},[647,3665,658],{},[647,3667,661],{},[647,3669,664],{},[10,3671,667],{},[10,3673,670],{},[10,3675,673],{},{"title":355,"searchDepth":356,"depth":356,"links":3677},[],{},{"title":631,"description":677},[384],{"id":3682,"title":3683,"body":3684,"coverImage":380,"date":950,"description":3722,"draft":369,"extension":370,"featured":369,"group":380,"initial":369,"meta":3723,"navigation":371,"path":3724,"rank":2171,"rawbody":3725,"readTime":377,"seo":3726,"series":369,"seriesCover":369,"seriesOrder":380,"seriesSlug":380,"slug":380,"stem":3727,"subtitle":3728,"tags":3729,"__hash__":3732},"indulge/indulge/work-and-life.md","Work and Life",{"type":7,"value":3685,"toc":3720},[3686,3689,3692,3695,3698,3701,3704,3709,3712],[10,3687,3688],{},"As I think back on my experience working as an engineer over the last couple of months, I realize that it has taught me a number of valuable lessons. For starters, I have learned that the corporate world is not always kind to those who work within it. No matter how talented, ambitious, or adjective one might have attached to their nouns,two options remain; thrive or phase out. It can be a harsh reality to come to terms with, but it's an important one to keep in mind as we navigate our careers.",[10,3690,3691],{},"During this time, I have witnessed colleagues being let go due to tech recessions, friends struggling to cope with the demands of the job, bouts of burnout, and even some giving up on their careers and lives altogether. It's a sobering reminder that the work we do can have a profound impact on our lives and well-being.",[10,3693,3694],{},"I have also witnessed the great things one can achieve by being consistent and purposeful. I have cheered on those experiencing successful career growth spurts, murmured with the founders in my circle, and dared to be human enough to fail trying - a reminder that even in the midst of uncertainty and chaos, there is still hope for success and fulfillment.",[10,3696,3697],{},"Over the past two decades, software engineering has evolved from a niche field to a space where everyone wants to be, and to some, a way to make quick cash. But as we've seen from financial crises, healthcare system crashes, and housing challenges, bubbles come and go. Nature filters indiscriminately, affecting the lives of individuals across the board.",[10,3699,3700],{},"At the end of the day, it's up to each of us to decide how we want to approach our careers and lives. We can choose to sit on the edge of sacrifice and resilience and witness what we can achieve, or we can ride the wave and see what sticks. It's not an easy decision to make, but it's one that we must all make at some point.",[10,3702,3703],{},"Through it all, we must attain a balance. Not one of life vs work but one that encompasses what is truly relevant to you. An understanding that work is just a component of a bigger picture. Asking yourself what would be left of you if you did not have that 9 - 5.",[58,3705,3706],{},[10,3707,3708],{},"“For what purpose humanity is there should not even concern us: why you are here, that you should ask yourself: and if you have no ready answer, then set for yourself goals, high and noble goals, and perish in pursuit of them! I know of no better life purpose than to perish in attempting the great and the impossible.” — Friedrich Nietzsche",[10,3710,3711],{},"For my part, I choose to dare greatly. I choose to take risks, to push myself beyond my comfort zone, and to learn from my failures. I know that there will be losses along the way and expect them to be there, else, I am not learning. I also know that those losses will make me stronger and more resilient in the long run. I dare you to join me on this journey of growth and self-discovery.",[10,3713,3714,3715],{},"Lo! ",[14,3716,3719],{"href":3717,"rel":3718},"https://stellakaniaru.medium.com/why-live-if-you-dont-fall-down-267387cdffe4",[18],"Why live if you don't fall down?",{"title":355,"searchDepth":356,"depth":356,"links":3721},[],"Thoughts on life and career",{},"/indulge/work-and-life","---\nrank: 14\ntitle: Work and Life\nsubtitle: Navigating the Tides\ndescription: Thoughts on life and career\ndate: 12/12/2024\ntags: [indulge, thoughts, career]\n---\n\nAs I think back on my experience working as an engineer over the last couple of months, I realize that it has taught me a number of valuable lessons. For starters, I have learned that the corporate world is not always kind to those who work within it. No matter how talented, ambitious, or adjective one might have attached to their nouns,two options remain; thrive or phase out. It can be a harsh reality to come to terms with, but it's an important one to keep in mind as we navigate our careers.\n\nDuring this time, I have witnessed colleagues being let go due to tech recessions, friends struggling to cope with the demands of the job, bouts of burnout, and even some giving up on their careers and lives altogether. It's a sobering reminder that the work we do can have a profound impact on our lives and well-being.\n\nI have also witnessed the great things one can achieve by being consistent and purposeful. I have cheered on those experiencing successful career growth spurts, murmured with the founders in my circle, and dared to be human enough to fail trying - a reminder that even in the midst of uncertainty and chaos, there is still hope for success and fulfillment.\n\nOver the past two decades, software engineering has evolved from a niche field to a space where everyone wants to be, and to some, a way to make quick cash. But as we've seen from financial crises, healthcare system crashes, and housing challenges, bubbles come and go. Nature filters indiscriminately, affecting the lives of individuals across the board.\n\nAt the end of the day, it's up to each of us to decide how we want to approach our careers and lives. We can choose to sit on the edge of sacrifice and resilience and witness what we can achieve, or we can ride the wave and see what sticks. It's not an easy decision to make, but it's one that we must all make at some point.\n\nThrough it all, we must attain a balance. Not one of life vs work but one that encompasses what is truly relevant to you. An understanding that work is just a component of a bigger picture. Asking yourself what would be left of you if you did not have that 9 - 5.\n\n> “For what purpose humanity is there should not even concern us: why you are here, that you should ask yourself: and if you have no ready answer, then set for yourself goals, high and noble goals, and perish in pursuit of them! I know of no better life purpose than to perish in attempting the great and the impossible.” — Friedrich Nietzsche\n\nFor my part, I choose to dare greatly. I choose to take risks, to push myself beyond my comfort zone, and to learn from my failures. I know that there will be losses along the way and expect them to be there, else, I am not learning. I also know that those losses will make me stronger and more resilient in the long run. I dare you to join me on this journey of growth and self-discovery.\n\nLo! [Why live if you don't fall down?](https://stellakaniaru.medium.com/why-live-if-you-dont-fall-down-267387cdffe4)\n",{"title":3683,"description":3722},"indulge/work-and-life","Navigating the Tides",[2555,3730,3731],"thoughts","career","UPozVxmZyzlqgN5y43n3nVRzkXZp3C6vDYHhKH78Jd0",1775510755388]