<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tech-Journey]]></title><description><![CDATA[Tech-Journey]]></description><link>https://tech-journeys.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1755777052912/9fd0df23-9b76-43eb-ae26-1c791c59c7e8.png</url><title>Tech-Journey</title><link>https://tech-journeys.com</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 17:48:17 GMT</lastBuildDate><atom:link href="https://tech-journeys.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Would You Hire Yourself? The Difference Between Stagnation and Growth]]></title><description><![CDATA[With over eight years in the tech industry, I’ve learned a simple but uncomfortable truth. Effort compounds. The work you put in today pays off later in ways you cannot predict when you’re just starting out.
Credentials Don’t Build Careers. Consisten...]]></description><link>https://tech-journeys.com/the-difference-between-stagnation-and-growth</link><guid isPermaLink="true">https://tech-journeys.com/the-difference-between-stagnation-and-growth</guid><category><![CDATA[Productivity]]></category><category><![CDATA[Career]]></category><category><![CDATA[networking]]></category><category><![CDATA[jobs]]></category><category><![CDATA[problem solving skills]]></category><category><![CDATA[success]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Thu, 19 Feb 2026 00:31:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771460784652/51607bd0-f080-4f7d-bb19-8be8c0081107.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>With over eight years in the tech industry, I’ve learned a simple but uncomfortable truth. Effort compounds. The work you put in today pays off later in ways you cannot predict when you’re just starting out.</p>
<h2 id="heading-credentials-dont-build-careers-consistent-work-does">Credentials Don’t Build Careers. Consistent Work Does</h2>
<p>Degrees, diplomas, and/or certifications do matter, but <strong><mark>only</mark></strong> to a point. It might help your CV get noticed or secure an interview. What it <strong><mark>won’t</mark></strong> do is carry you through a conversation where you’re expected to explain how you think, how you approach problems, and <strong>what you’ve actually built</strong>. Without tangible evidence of real work, you’re already at a disadvantage.</p>
<h2 id="heading-there-are-no-shortcuts-in-a-competitive-market">There Are No Shortcuts in a Competitive Market</h2>
<p>The job market is tough. Whether we like it or not, shortcuts <strong><mark>don’t</mark></strong> exist.</p>
<p>One of the most common and damaging assumptions, especially among graduates or people moving into tech from another field, is that companies will provide deep, structured training once you’re hired. In reality, that rarely happens.</p>
<p>Having the right attitude matters, but its almost never enough on its own. Good intentions don’t replace real exposure or practical experience.</p>
<h2 id="heading-think-like-a-hiring-manager">Think Like a Hiring Manager</h2>
<p>Try to see things from a hiring manager’s perspective.</p>
<p>If the role exists so they can focus on higher level, strategic work, would they really want to spend months training someone from scratch? Or would they prefer someone who can add immediate value, even if they’re still learning?</p>
<p>Sure, you will get guidance, but most roles assume you’ve already done the foundational work before your first day.</p>
<h2 id="heading-credentials-without-evidence-only-go-so-far">Credentials Without Evidence Only Go So Far</h2>
<p>If you are finding it difficult to get hired, relying solely on paper credentials is often the reason. You need to put yourself out there and build a presence. <strong><mark>Networking</mark></strong> and <strong><mark>creating content</mark></strong>, whether that is writing blogs, making YouTube videos, sharing lessons learned or documenting your projects, takes <strong>time</strong> and <strong>consistency</strong>. More importantly, it demonstrates how you think, how you communicate and how seriously you approach your craft.</p>
<p>Whether you’re trying to change careers or move up in your current one, the principle is the same. <strong>Make your thinking visible.</strong></p>
<h2 id="heading-ask-yourself-the-hard-question">Ask Yourself the Hard Question</h2>
<p>At some point, you need to be honest with yourself.</p>
<p><strong><mark>Would I hire myself for this role, and why?</mark></strong></p>
<p>If your answer is yes, you should be able to explain the value you bring.<br />If your answer is no, then you’ve just created yourself a roadmap to your <strong><em>Tech journey</em></strong>🙂</p>
<p>Companies are looking for people who can solve problems. Telling them you can isn’t enough. You need to show <strong><em>how</em></strong> you approach problems, <strong><em>how</em></strong> you break it down🕺💃, and <strong><em>how</em></strong> you follow through (consistency).</p>
<h2 id="heading-documentation-is-part-of-the-job">Documentation Is Part of the Job</h2>
<p>In the tech space, documentation isn’t optional because people move on, teams change but <strong><mark>systems remain</mark></strong>.</p>
<p>Good documentation helps to keep things running, reduces risk, and saves time. Writing clear documentation also forces you to understand systems properly, which makes it a form of problem solving in its own right.</p>
<blockquote>
<p><em><mark>Tip</mark></em>: If you already have a job and want to stay relevant, don’t leave all the thinking to your manager. Asking questions is important, but asking them without doing your own research first will eventually work against you.</p>
</blockquote>
<h2 id="heading-experience-doesnt-automatically-mean-growth">Experience Doesn’t Automatically Mean Growth</h2>
<p>Be careful not to confuse tenure with seniority. You can have five years of experience, but if you’ve spent the last two years coasting in your comfort zone, then you’re stagnating.</p>
<p>Its painful if you want to progress in a company only to be told that while you’re reliable, you’re not seen as ready for a more senior role because you’re only good at what you’re currently doing. In many cases, the gap isn’t time, but depth and impact.</p>
<h2 id="heading-use-ai-carefully-and-intentionally">Use AI Carefully and Intentionally</h2>
<p>Over reliance on AI to handle so called tedious tasks often hides a deeper problem. Many people have lost the mental sharpness they once had. Earlier in their careers, they were curious and willing to wrestle with problems. Over time, that muscle weakens if its not used.</p>
<p>Don’t get me wrong, AI is powerful and <strong>should</strong> be used, but <strong><mark>it should support your thinking</mark></strong>, <strong>not</strong> replace it. You still need to understand the output, the implementation, and the reasoning behind every decision. The responsibility always sits with you.</p>
<h2 id="heading-you-really-dont-need-expensive-tools-to-learn-properly">You really Don’t Need Expensive Tools to Learn Properly</h2>
<p>I’ve been <em>homelabbing</em> since 2020 but I understand that not everyone can afford premium software or high end hardware, and thats fine, because I’m one of those people.🙂</p>
<p>Free tiers and open source tools are the industry standard. In many cases, it teaches the same underlying concepts as enterprise tools, which <strong>makes your skills <mark>transferable</mark></strong>.</p>
<p>You can learn tools and technologies like Asana, Slack, Atlassian products, Freshdesk, GitHub, Git, Prometheus, Grafana, ELK stack, n8n, Linux, Docker, Nginx, Python, Bash, Proxmox and <strong>many</strong> more without spending a cent. Some of these tools will require you to sign up (no credit card needed) so you can start exploring right away, while others can be installed locally, giving you the freedom to experiment. The key is not just using them, but understanding <strong>what problem each tool solves and why it exists</strong>.</p>
<h2 id="heading-stop-waiting-and-start-building">Stop Waiting and Start Building</h2>
<p>At some point, you have to stop waiting or you will get stuck in planning will everyone else progress.</p>
<p>If you really want it, you should be willing to make the necessary sacrifices and save up to buy an affordable, upgradable second-hand laptop. It doesn’t need to look flashy or brand new. As I shared in one of my <a target="_blank" href="https://tech-journeys.com/desktop-laptop-or-server">articles</a> about the rather <em>unattractive</em> laptop I bought, it may not turn heads, but it runs smoothly and <strong>gets the job done</strong>. There really are <strong><mark>no excuses</mark></strong>.</p>
<p>Once you have your setup, the next steps are simple: set up a lab, <strong><mark>build something</mark></strong> <s>real</s>, <strong><mark>break it</mark></strong>, <strong><mark>fix it</mark></strong>, and <strong><mark>document everything</mark></strong> along the way.</p>
<blockquote>
<p><mark>NB</mark>: Avoid chasing every new tool(shiny object syndrome) or trend just because it looks exciting. Moving from one tool to another might feel productive, but <strong>going deep and mastering a few important tools is far more valuable than constantly switching to whatever is new</strong>. <mark>Focus on what is relevant to your field of interest and commit to it.</mark></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[How Your Code Editor Can Become a Security Risk]]></title><description><![CDATA[Modern dev environments are incredibly powerful, but that power hides a risk we usually overlook: the extensions we use every day.
Today, I came across a blog post from OX Security that highlights a huge gap in how we think about our workstations. Th...]]></description><link>https://tech-journeys.com/how-your-code-editor-can-become-a-security-risk</link><guid isPermaLink="true">https://tech-journeys.com/how-your-code-editor-can-become-a-security-risk</guid><category><![CDATA[vscode extensions]]></category><category><![CDATA[IDEs]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[devtools]]></category><category><![CDATA[Security]]></category><category><![CDATA[cybersecurity]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Wed, 18 Feb 2026 17:16:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771435374776/9bfd3395-6009-4f46-b2d4-ec51c3f5f134.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Modern dev environments are incredibly powerful, but that power hides a risk we usually overlook: <strong>the extensions we use <mark>every day</mark>.</strong></p>
<p>Today, I came across a blog post from OX Security that highlights a huge gap in how we think about our workstations. The report outlines how vulnerabilities in popular extensions can lead to remote code execution and local file exfiltration. This does not just affect software engineers. Any professional using an IDE for scripting or automation operates within this vulnerable area.</p>
<blockquote>
<p><strong>You can read the full report here:</strong><br /><a target="_blank" href="https://www.ox.security/blog/four-vulnerabilities-expose-a-massive-security-blind-spot-in-ide-extensions/?utm_source=chatgpt.com">https://www.ox.security/blog/four-vulnerabilities-expose-a-massive-security-blind-spot-in-ide-extensions/</a></p>
</blockquote>
<h2 id="heading-the-trust-problem">The Trust Problem</h2>
<p>Personally, I’ve been using VS Code for several years and don’t see myself switching to another IDE anytime soon. Part of that is familiarity and comfort because it feels local and implicitly trusted. It’s where I explore code, test ideas, build, break, and fix things🙂. From a security perspective, however, many of the extensions we rely on run with significant privileges and can access:</p>
<ul>
<li><p>Our local source code and build artifacts.</p>
</li>
<li><p>Environment variables and config files.</p>
</li>
<li><p><strong>API tokens, SSH keys,</strong> and <strong>cloud credentials</strong>.</p>
</li>
</ul>
<p>These components often bypass formal review processes. Extensions are installed ad hoc, updated automatically, and rarely audited. The OX Security research shows how this trust model breaks down, even for extensions with massive install counts and reputable publishers.</p>
<p>The issue is not that extensions are inherently unsafe but that we treat it differently from other dependencies, despite the level of access it has.</p>
<hr />
<h2 id="heading-what-the-report-shows">What the Report Shows</h2>
<p>One of the more uncomfortable findings in their blog is that even popular extensions with tens of millions of installs aren’t automatically safe.</p>
<p>The vulnerabilities described include:</p>
<ul>
<li><p>Remote code execution via extension exposed services</p>
</li>
<li><p>Local file exfiltration triggered by crafted inputs</p>
</li>
<li><p>Insecure assumptions about where data originates</p>
</li>
</ul>
<p>These attacks take advantage of IDE extensions having local access while also connecting to the network, without the same security hardening used for backend services.</p>
<hr />
<h2 id="heading-visibility-is-the-real-problem">Visibility Is the Real Problem</h2>
<p>This is not about blaming devs or discouraging useful tooling. In most teams, extensions are installed with <strong>good intentions</strong> and rarely revisited.</p>
<p>The real issue is <strong><mark>visibility</mark></strong>:</p>
<ul>
<li><p><strong>Do we know which extensions are installed across dev machines?</strong></p>
</li>
<li><p><strong>Are we aware of what permissions it has?</strong></p>
</li>
<li><p><strong>Do we have any process to review or reassess it over time?</strong></p>
</li>
</ul>
<p>For many teams, IDE extensions are not centrally tracked or audited, and they can occupy a grey area that existing security processes <em>may</em> not fully cover.</p>
<hr />
<h2 id="heading-listing-installed-vs-code-extensions-on-macos">Listing Installed VS Code Extensions on macOS</h2>
<p>If you want to audit extensions, the first step is simply knowing what is installed.</p>
<p>On macOS, you can list all your VS Code extensions by running:</p>
<pre><code class="lang-bash">ls ~/.vscode/extensions
</code></pre>
<p>Each directory follows this format:</p>
<pre><code class="lang-bash">publisher.extension-version
</code></pre>
<p><strong><mark>Important:</mark> Only include the Extension ID and <mark>NOT</mark> the version number</strong></p>
<p>Extension scanning and auditing tools, such as <a target="_blank" href="https://vscan.dev/">VSCan</a>, expect the extension ID in the following format otherwise the tool will not recognise it:</p>
<pre><code class="lang-bash">publisher.extension <span class="hljs-comment">#nothing else</span>
</code></pre>
<p>To extract clean extension IDs on macOS, run this in your terminal:</p>
<pre><code class="lang-bash"><span class="hljs-keyword">for</span> dir <span class="hljs-keyword">in</span> ~/.vscode/extensions/*; <span class="hljs-keyword">do</span>
  name=$(basename <span class="hljs-string">"<span class="hljs-variable">$dir</span>"</span>)
  <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${name%-*}</span>"</span>
<span class="hljs-keyword">done</span>
</code></pre>
<p>This list can then be used for:</p>
<ul>
<li><p><strong><mark>Manual review</mark></strong> – Check if extensions like <code>ms-python.python</code> or <code>eamodio.gitlens</code> are really needed, and <strong>remove</strong> any that are unused.</p>
</li>
<li><p><mark>Feeding into scanning tools</mark> – tools such as <strong>VSCan</strong> can analyse each extension for risky behaviours or suspicious permissions.</p>
</li>
<li><p><strong><mark>Comparing against advisories or reports</mark></strong> – See if installed extensions match those flagged in vulnerability reports, such as the OX Security blog highlighting <code>Live Server</code> or <code>Markdown Preview Enhanced</code>.</p>
</li>
<li><p><strong><mark>Staying informed</mark></strong> – Devs should consider following sources like <a target="_blank" href="https://thehackernews.com/">The Hacker News</a>, security blogs, and advisory feeds to stay up to date on new extension vulnerabilities and patches.</p>
</li>
</ul>
<p>Here’s an example of the output you can expect to see from VSCan:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771434463907/f7be4ae1-1e04-47c4-9ea3-a916c31d592d.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p><mark>Keep in mind that flagged risks are contextual</mark>: even actively maintained extensions can carry exposure depending on local configuration, access to sensitive files, or network connectivity. So the <strong>risk changes depending on <mark>how</mark> and <mark>where</mark> you use the extension</strong>.</p>
</blockquote>
<hr />
<h2 id="heading-auditing-extensions-without-overengineering">Auditing Extensions Without Overengineering</h2>
<p>Unlike server side libraries or OS packages, IDE extensions lack a dedicated, comprehensive vulnerability database. That makes traditional dependency scanning insufficient on its own.</p>
<p>If your organisation currently lacks a formal process for this, one option worth exploring is <a target="_blank" href="https://vscan.dev/">VSCan</a>, which focuses specifically on analysing IDE extensions for risky behaviours and known red flags. It helps move from “I <mark>hope</mark> this extension is safe” to “I <mark>know</mark> what this extension does and the risks it carries.</p>
<p>You can then consider combining it with a lightweight policy such as:</p>
<ul>
<li><p>Periodic extension reviews to ensure only necessary tools are installed</p>
</li>
<li><p>Removing unused extensions to minimise the attack surface</p>
</li>
<li><p>Prioritise extensions that are well-maintained or provided by verified publishers</p>
</li>
</ul>
<p>This can significantly reduce unnecessary exposure without slowing down development.</p>
<hr />
<h2 id="heading-a-small-shift-in-how-we-think">A Small Shift in How We Think</h2>
<p>The broader lesson from this is simple but important. Treating IDE extensions with the same curiosity and caution we apply to other dependencies doesn’t require a heavy, restrictive process. <strong>It starts with awareness, visibility,</strong> and the <strong>willingness to ask a <em>basic</em> question</strong>:</p>
<p><strong><mark>Do we actually know what is running on our machines?</mark></strong></p>
<p>Whether you are building an app, training a data model, or managing infrastructure, your editor is a critical part of your software supply chain. Its time we treat it that way.🙂</p>
]]></content:encoded></item><item><title><![CDATA[Understanding REST APIs Through Rugby]]></title><description><![CDATA[In South Africa, rugby is not just a sport but a language many of us speak. Whether its the timing of a counter-attack in a Test match or the precision of a backline move involving Grant Williams, Sacha Feinberg-Mngomezulu, Andre Esterhuizen, Damian ...]]></description><link>https://tech-journeys.com/understanding-rest-apis-through-rugby</link><guid isPermaLink="true">https://tech-journeys.com/understanding-rest-apis-through-rugby</guid><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Mon, 16 Feb 2026 01:41:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771207318739/c0050ac9-1569-4a80-9972-0c2f8d4f908b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In South Africa, rugby is not just a sport but a language many of us speak. Whether its the timing of a counter-attack in a Test match or the precision of a backline move involving Grant Williams, Sacha Feinberg-Mngomezulu, Andre Esterhuizen, Damian Willemse, Cheslin Kolbe and Kurt-Lee Arendse, the game works because everyone knows the rules. Players, referees and coaches all understand what is allowed, what is expected, and what happens when the rules are followed.</p>
<p>APIs are the same. Once you understand the rules, what first seems chaotic becomes structured. If you can follow a rugby match from kickoff to final whistle, you can understand how a web server talks to the outside world.</p>
<h2 id="heading-what-is-a-rest-api">What is a REST API?</h2>
<p>To most people, "API" sounds like dense technical jargon. In reality, an <strong>Application Programming Interface</strong> is just a <strong>formal agreement</strong> (or a digital contract) between two systems.</p>
<p>It defines exactly how one piece of software asks for information and what it gets back in return. Without these strict rules, different programs would be "lost in translation," like two people trying to collaborate while speaking different languages and following different social customs. An API ensures they both speak the same dialect.</p>
<p>Why this agreement is considered a contract:</p>
<ul>
<li><p><strong>Predictable Inputs:</strong> The contract states, "If you want this data, you must ask for it in <em>this</em> specific format" (e.g., a specific URL or a piece of JSON code).</p>
</li>
<li><p><strong>Guaranteed Outputs:</strong> The system promises, "If you ask correctly, I will always give you the data in <em>this</em> specific structure."</p>
</li>
<li><p><strong>Stability:</strong> If the team decides to change their internal training regime or swap out the locks in the engine room (the internal database), it doesn’t matter to the rest of the backline. As long as the fly-half executes the same "contracted" pass to the center, the play continues smoothly. The internal "gym work" might change, but the <strong>delivery</strong> on the pitch remains predictable so the team doesn't lose its rhythm.</p>
</li>
</ul>
<p><strong><mark>REST</mark></strong> (Representational State Transfer) is the most popular "architectural style" for building web APIs. Think of it as a set of <strong>design rules</strong> rather than a specific piece of software.</p>
<p>It works by piggybacking on <strong>HTTP</strong>, the same language your browser uses to load this page. By following REST’s <strong>predictable</strong> standards, developers can move data across the internet as easily as you navigate from one website to another.</p>
<p><strong>A Quick Note on Other API Styles</strong></p>
<p>Other API <strong><em>styles</em></strong> exist to handle specific needs. For example, <strong>SOAP</strong> is a rigid, XML-based protocol often used in legacy enterprise systems, while <strong>gRPC</strong> is a high-performance binary system designed for speed and is often more specialised than a standard web application requires.</p>
<blockquote>
<p><strong><mark>I’m not very familiar with these other styles </mark> <em><mark>yet</mark></em></strong>, and for now my main focus is <strong>REST</strong> as it is widely used and sufficient for most web applications.</p>
</blockquote>
<h3 id="heading-api-types">API Types</h3>
<p>APIs can also be classified by <strong><em>who</em></strong> can use them and <strong><em>how</em></strong> they are intended to be <strong><em>consumed</em></strong>. In this context, “<em>consumed</em>” simply means <strong>how a client or system uses the API</strong> to get data or perform actions.</p>
<p>Common API types include:</p>
<ul>
<li><p><strong><mark>Public APIs</mark></strong> – available for anyone to use. External developers can consume them freely, often following published documentation.</p>
</li>
<li><p><strong><mark>Private APIs</mark></strong> – intended for internal use only. They are consumed by systems or teams within the organisation.</p>
</li>
<li><p><strong><mark>Partner APIs</mark></strong> – shared with specific business partners. Only <strong><em>authorised</em></strong> partners can consume these APIs under controlled conditions.</p>
</li>
</ul>
<p>Understanding both <strong>API styles</strong> (how an API works) and <strong>API types</strong> (who can use it) gives you a complete picture of how APIs are designed and organised.</p>
<hr />
<h2 id="heading-how-rest-works">How REST Works</h2>
<p>In REST, every piece of data you interact with is called a <strong>resource</strong>. A resource is any identifiable "thing" the system manages, such as a player like Cheslin Kolbe, a match, or even the entire United Rugby Championship league.</p>
<p>To manage and reference these resources, we use <strong>identifiers</strong>. This is where <strong>URI</strong> and <strong>URL</strong> come in.</p>
<h3 id="heading-uri-uniform-resource-identifier">URI (Uniform Resource Identifier)</h3>
<p>A <strong>URI</strong> is like a player’s <strong>unique ID in the league database</strong>. It identifies the resource itself, regardless of where it’s stored or how you access it.</p>
<ul>
<li>Example: <code>player:911</code><br />  This identifies player 911 permanently, without specifying how to fetch their data.</li>
</ul>
<p><strong><mark>Key point:</mark></strong> A URI identifies something but doesn’t tell you where or how to access it.</p>
<h3 id="heading-url-uniform-resource-locator">URL (Uniform Resource Locator)</h3>
<p>A <strong>URL</strong> is a <strong>special type of URI</strong> that not only identifies the resource but also tells you <strong>how and where to access it</strong> over a network.</p>
<ul>
<li>Example: <a target="_blank" href="https://tech-journeys.com/players/kolbe￼This"><code>https://tech-journeys.com/players/kolbe</code>  
  </a>This URL identifies Cheslin Kolbe and also tells your system to fetch his data via HTTPS from this exact location.</li>
</ul>
<p><strong><mark>Key point:</mark></strong> All URLs are URIs because they identify a resource, but not all URIs are URLs.</p>
<h3 id="heading-quick-rule-of-thumb">Quick Rule of Thumb</h3>
<ol>
<li><p><strong>URI:</strong> identifies a resource (who/what)</p>
</li>
<li><p><strong>URL:</strong> identifies a resource <strong>and</strong> tells you how to locate it (who/what + where/how)</p>
</li>
<li><p><strong>Relationship:</strong> Every URL is a URI, but not every URI is a URL.</p>
</li>
</ol>
<h3 id="heading-rugby-analogy-summary">Rugby Analogy Summary</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771213348254/c6ba985c-680b-41e1-ae84-afc55082090d.png" alt class="image--center mx-auto" /></p>
<p>Here’s an example written in Python:</p>
<pre><code class="lang-python"><span class="hljs-comment"># Define a list of players (unique identifiers in the system)</span>
player_uris = [
    <span class="hljs-string">"players/kolbe"</span>,
    <span class="hljs-string">"players/smith"</span>,
    <span class="hljs-string">"players/duplessis"</span>,
    <span class="hljs-string">"players/mapimpi"</span>
]

<span class="hljs-comment"># Base URL of our rugby API or website</span>
base_url = <span class="hljs-string">"https://tech-journeys.com/"</span>

<span class="hljs-comment"># Loop through each player and generate their full URL</span>
<span class="hljs-keyword">for</span> uri <span class="hljs-keyword">in</span> player_uris:
    player_url = <span class="hljs-string">f"<span class="hljs-subst">{base_url}</span><span class="hljs-subst">{uri}</span>"</span>
    print(<span class="hljs-string">"Player URI:"</span>, uri)
    print(<span class="hljs-string">"Player URL:"</span>, player_url)
    print(<span class="hljs-string">"-"</span> * <span class="hljs-number">40</span>)  <span class="hljs-comment"># separator for readability</span>
</code></pre>
<h3 id="heading-output">Output</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771212641833/4cdcc6b0-ade7-4ca9-be88-2b355212f22a.png" alt /></p>
<hr />
<h1 id="heading-scenario"><mark>Scenario</mark></h1>
<p>Imagine we are building an international rugby statistics platform. One of our resources is a player.</p>
<p>To interact with that player, REST allows a small set of actions called <strong>HTTP</strong> <strong><em>methods</em></strong>. These are the legal moves of the game, <strong>defining what you can do with each resource</strong>.</p>
<h3 id="heading-get-scout-watching-the-match"><mark>GET</mark> – Scout Watching the Match</h3>
<p>A <code>GET</code> request <strong><em>asks</em></strong> the server <strong><em>for</em></strong> information without changing anything. Think of it as a scout reviewing footage, observing without interfering.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> requests

<span class="hljs-comment"># Get Cheslin Kolbe's stats</span>
response = requests.get(<span class="hljs-string">"https://tech-journeys.com/players/kolbe"</span>) <span class="hljs-comment">#This URL doesn't really exist :)</span>
player_data = response.json()
print(player_data)
</code></pre>
<h3 id="heading-output-1">Output</h3>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Cheslin Kolbe"</span>,
  <span class="hljs-attr">"team"</span>: <span class="hljs-string">"South Africa"</span>,
  <span class="hljs-attr">"position"</span>: <span class="hljs-string">"Wing"</span>,
  <span class="hljs-attr">"special_move"</span>: <span class="hljs-string">"Ankle Breaker"</span>,
  <span class="hljs-attr">"world_cups"</span>: [<span class="hljs-number">2019</span>, <span class="hljs-number">2023</span>]
}
</code></pre>
<h2 id="heading-post-adding-a-new-player"><mark>POST</mark> – Adding a New Player</h2>
<p>A <code>POST</code> request <strong><em>sends</em></strong> <strong><em>new</em></strong> information to the server to create something that <strong>does not <em>yet</em> exist</strong>. This is like officially adding a new player to the squad.</p>
<pre><code class="lang-python">new_player = {
    <span class="hljs-string">"name"</span>: <span class="hljs-string">"Canan Moodie"</span>,
    <span class="hljs-string">"team"</span>: <span class="hljs-string">"South Africa"</span>,
    <span class="hljs-string">"position"</span>: <span class="hljs-string">"Centre"</span>,
    <span class="hljs-string">"world_cups"</span>: [<span class="hljs-number">2023</span>]
}

response = requests.post(<span class="hljs-string">"https://tech-journeys.com/players"</span>, json=new_player)
print(response.status_code)  <span class="hljs-comment"># 201 means created</span>
</code></pre>
<h2 id="heading-put-updating-a-player"><mark>PUT</mark> – Updating a Player</h2>
<p>A <code>PUT</code> request <strong><em>replaces</em></strong> or <strong><em>updates</em></strong> an <strong>existing</strong> resource. For example, updating a player’s position after a tactical change.</p>
<pre><code class="lang-python">updated_position = {
    <span class="hljs-string">"position"</span>: <span class="hljs-string">"Fullback"</span>
}

response = requests.put(<span class="hljs-string">"https://tech-journeys.com/players/kolbe"</span>, json=updated_position)
print(response.status_code)  <span class="hljs-comment"># 200 means success</span>
</code></pre>
<h2 id="heading-delete-removing-a-player"><mark>DELETE</mark> – Removing a Player</h2>
<p>A <code>DELETE</code> request <strong><em>removes</em></strong> a resource <strong>completely</strong>. This is like a <strong>permanent</strong> substitution.</p>
<pre><code class="lang-python">response = requests.delete(<span class="hljs-string">"https://tech-journeys.com/players/retired_player_id"</span>)
print(response.status_code)  <span class="hljs-comment"># 204 means no content, successfully deleted</span>
</code></pre>
<hr />
<h2 id="heading-a-simple-system-design-view">A Simple System Design View</h2>
<p><strong>System design</strong> is the process of planning and organising all the parts of a software system so it works reliably, efficiently, and can handle real-world use. You can think of it as designing a rugby stadium and playbook: you need to know where everything goes, how players move, and how referees, coaches, and spectators interact.</p>
<p>For a REST API, the high-level view looks like this:</p>
<pre><code class="lang-css"><span class="hljs-selector-attr">[Client]</span> <span class="hljs-selector-tag">----------</span>&gt; <span class="hljs-selector-attr">[REST API Server]</span> <span class="hljs-selector-tag">---------</span>&gt; <span class="hljs-selector-attr">[Database]</span>
<span class="hljs-selector-tag">GET</span>/<span class="hljs-selector-tag">POST</span>/<span class="hljs-selector-tag">PUT</span>/<span class="hljs-selector-tag">DELETE</span>                               <span class="hljs-selector-tag">CRUD</span> <span class="hljs-selector-tag">operations</span>
</code></pre>
<ul>
<li><p><strong>Client</strong> – could be a web app, mobile app, or Python script.</p>
</li>
<li><p><strong>REST API Server</strong> – receives requests, enforces rules (HTTP methods), and manages resources.</p>
</li>
<li><p><strong>Database</strong> – stores the resources like players, matches, and stats.</p>
</li>
</ul>
<p>Good system design ensures your API behaves <strong>predictably,</strong> <strong>scales</strong> well, and is <strong>easier to maintain</strong>, like a well-coached rugby team.</p>
<hr />
<h2 id="heading-looking-at-the-language-of-the-game-json">Looking at the Language of the Game: <mark>JSON</mark></h2>
<p>When a server responds, it doesn’t send pictures of Kolbe. It sends <strong><em>data</em></strong>.</p>
<p>That data is usually formatted as <code>JSON</code>, JavaScript Object Notation, <strong>a lightweight text-based structure designed to be easy for both humans and machines to read</strong>. JSON organises information into <strong><em>key-value pairs</em></strong>, much like a stat sheet in rugby.</p>
<p><mark>Example of a player in JSON:</mark></p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Cheslin Kolbe"</span>,
  <span class="hljs-attr">"team"</span>: <span class="hljs-string">"South Africa"</span>,
  <span class="hljs-attr">"position"</span>: <span class="hljs-string">"Wing"</span>,
  <span class="hljs-attr">"special_move"</span>: <span class="hljs-string">"Ankle Breaker"</span>,
  <span class="hljs-attr">"world_cups"</span>: [<span class="hljs-number">2019</span>, <span class="hljs-number">2023</span>]
}
</code></pre>
<p>Here, <code>"name"</code>, <code>"team"</code>, <code>"position"</code> <code>"special_move"</code> and <code>"world_cups"</code> are the <strong><em>keys</em></strong>, and the <strong><em>values</em></strong> <em>describe</em> the player.</p>
<h2 id="heading-api-security">API Security</h2>
<p>You wouldn't just let anyone walk into the changing room, and you shouldn't just let anyone access your data. So make sure Security is <strong>always</strong> at the forefront.</p>
<h3 id="heading-authentication-and-authorisation"><mark>Authentication and Authorisation</mark></h3>
<p><strong>Authentication</strong> answers the question, <strong>who are you?</strong> It verifies identity. In APIs, this is commonly done using an API key or a JWT, JSON Web Token, which is a signed token proving identity for a limited time.</p>
<p><mark>Python example:</mark></p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> requests

headers = {<span class="hljs-string">"Authorization"</span>: <span class="hljs-string">"Bearer YOUR_JWT_TOKEN"</span>}
response = requests.get(<span class="hljs-string">"https://tech-journeys.com/players/kolbe"</span>, headers=headers)
print(response.json())
</code></pre>
<p><strong>Authorisation</strong> answers the question, <strong>what are you allowed to do?</strong> Even after identity is confirmed, the system checks permissions. Just because you have a ticket to the stadium doesn’t mean you can sit in the coaching box (although it would’ve been nice listening to the mastermind Rassie himself). Both checks happen on <strong>every request</strong>.</p>
<h3 id="heading-encryption"><mark>Encryption</mark></h3>
<p>Data travelling between a client and a server <strong>must</strong> be protected. <a target="_blank" href="https://www.cloudflare.com/learning/ssl/what-is-https/">HTTPS</a> uses <a target="_blank" href="https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/">TLS</a>, Transport Layer Security, to encrypt communication. This ensures that if a "hacker" intercepts the data while it’s traveling between the Cape Town server and your phone, all they see is scrambled nonsense.</p>
<h3 id="heading-rate-limiting"><mark>Rate Limiting</mark></h3>
<p>APIs must defend against overload. Rate limiting <strong>restricts</strong> <strong>how many requests a client can make in a given period</strong>, for example 100 requests per minute. This prevents abuse and protects the system from <a target="_blank" href="https://www.cloudflare.com/learning/ddos/glossary/denial-of-service/">Denial-of-Service</a> (<strong>DoS</strong>) attacks, which try to overwhelm servers by flooding them with traffic. You can think of it as crowd control at a sold-out international match, because without limits, the system would collapse under the pressure of <strong>too many requests</strong>.</p>
<hr />
<h2 id="heading-the-approach-ive-been-taking-throughout-my-tech-career">The Approach I’ve Been Taking Throughout My Tech Career</h2>
<p>I’ve found that the most complex systems become simple when you map them onto something you already understand. A <code>GET</code> request becomes observation, a <code>POST</code> request becomes a squad announcement, and security checks become permissions at the gate.</p>
<p>You don’t have to love rugby for this to work (it would’ve been great if you did 😉), but whatever your interest, whether it’s baking, soccer, classic cars, or gardening, map these API concepts to <strong>your</strong> world. Doing so moves the information from your short-term technical memory into long-term common sense, making it easier to recall and <strong>apply in real projects</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[A Comprehensive Guide to ITIL v4]]></title><description><![CDATA[ITIL v4, or the Information Technology Infrastructure Library version 4, is a framework designed to help organisations manage their IT services effectively. It provides a comprehensive set of best practices for making sure IT services are properly al...]]></description><link>https://tech-journeys.com/a-comprehensive-guide-to-itil-v4</link><guid isPermaLink="true">https://tech-journeys.com/a-comprehensive-guide-to-itil-v4</guid><category><![CDATA[ITIL]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Sun, 10 Aug 2025 07:03:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772441716/f9e125a7-47c2-48c4-b208-8f7e0fdb6db6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>ITIL v4, or the <strong>Information Technology Infrastructure Library version 4</strong>, is a framework designed to <strong>help organisations manage their IT services effectively</strong>. It provides a comprehensive set of best practices for making sure IT services are properly aligned with the needs of the business, ensuring IT consistently delivers value. This blog will explore the main components of ITIL v4, its principles, and how it operates to improve service management.</p>
<h4 id="heading-what-is-itil-v4">What is ITIL v4?</h4>
<p>ITIL v4 is the most recent version of the ITIL framework, which has been widely adopted globally since its beginnings in the 1980s. It marks a significant shift from previous versions by incorporating modern philosophies such as <a target="_blank" href="https://agilealliance.org/agile101/"><strong>Agile</strong></a>, <a target="_blank" href="https://www.atlassian.com/devops"><strong>DevOps</strong></a>, and <a target="_blank" href="https://theleanway.net/The-Five-Principles-of-Lean"><strong>Lean</strong></a>, making it much more relevant in today’s fast-paced digital world. ITIL v4 takes a holistic approach to service management, <strong>focusing on the co-creation of value through collaborative efforts between IT and the business,</strong> rather than just on the IT department as a silo. It recognises that the entire <strong>organisation must work together to deliver valuable services</strong>.</p>
<h3 id="heading-key-components-of-itil-v4">Key Components of ITIL v4</h3>
<h4 id="heading-1-the-service-value-system-svs">1. The Service Value System (SVS)</h4>
<p>At the heart of ITIL v4 is the <strong>Service Value System</strong> (SVS). This is a comprehensive model that shows how all an organisation’s components and activities work together to facilitate value creation. The SVS <strong>ensures that the organisation is aligned and works together as a cohesive unit</strong>. The SVS includes several key elements:</p>
<ul>
<li><strong>Guiding Principles</strong>: These are universal recommendations that guide an organisation in all circumstances, regardless of changes in its goals or strategies.</li>
<li><strong>Governance</strong>: This component ensures that policies and continual improvement are aligned with the organisation’s overall objectives and are directed by the governing body.</li>
<li><strong>Service Value Chain</strong>: A flexible operating model that outlines the key activities required to respond to demand and create value.</li>
<li><strong>Practices</strong>: These are the sets of organisational resources designed for performing work or accomplishing an objective. ITIL v4 presents 34 practices that build on the processes from previous versions.</li>
<li><strong>Continual Improvement</strong>: A recurring activity that ensures the organisation is always enhancing its services and practices. This is a core theme throughout the entire framework.</li>
</ul>
<h4 id="heading-2-the-guiding-principles">2. The Guiding Principles</h4>
<p>ITIL v4 has <strong>seven guiding principles</strong> that help organisations adopt and adapt the framework to their specific needs. These principles are designed to be practical and applicable in any situation:</p>
<ol>
<li><strong>Focus on Value</strong>: Everything you do should directly or indirectly create value for stakeholders.</li>
<li><strong>Start Where You Are</strong>: Don’t rip and replace your existing systems. Instead, assess what you have and how it can be improved.</li>
<li><strong>Progress Iteratively with Feedback</strong>: Implement changes in small, manageable steps and continuously gather feedback to refine your approach.</li>
<li><strong>Collaborate and Promote Visibility</strong>: Encourage teamwork and transparency across all levels and departments to avoid silos.</li>
<li><strong>Think and Work Holistically</strong>: Recognise that services are part of a larger, interconnected system. Consider all components and how they interact.</li>
<li><strong>Keep It Simple and Practical</strong>: Avoid unnecessary complexity and bureaucracy. Focus on what is essential to achieve your objectives.</li>
<li><strong>Optimise and Automate</strong>: Streamline manual processes and use automation where it makes sense to improve efficiency and reduce human error.</li>
</ol>
<h4 id="heading-3-the-service-value-chain-svc">3. The Service Value Chain (SVC)</h4>
<p>The <strong>Service Value Chain</strong> is a central element of the SVS. It is an operational model that consists of six activities that organisations can use to create value in response to demand. <strong>The SVC is highly flexible and can be adapted for any scenario</strong>. Its activities are:</p>
<ul>
<li><strong>Plan</strong>: Understand the organisation’s vision, current status, and objectives, and create plans for improvement.</li>
<li><strong>Improve</strong>: Continuously enhance products, services, and practices across the value chain.</li>
<li><strong>Engage</strong>: Foster relationships with all stakeholders, including customers, suppliers, and partners, to understand their needs and requirements.</li>
<li><strong>Design and Transition</strong>: Develop and implement new or changed services, ensuring they meet expectations for quality, cost, and time.</li>
<li><strong>Obtain/Build</strong>: Acquire or develop the necessary resources, whether hardware, software, or personnel, for service delivery.</li>
<li><strong>Deliver and Support</strong>: Ensure services are delivered effectively and provide support to users, managing any incidents and requests.</li>
</ul>
<h4 id="heading-4-the-practices">4. The Practices</h4>
<p>ITIL v4 expands on the traditional processes by introducing <strong>34 practices</strong> that encompass various aspects of service management. These practices are sets of resources and capabilities that are flexible and can be tailored to an organisation’s specific needs. They are grouped into <strong>three</strong> main categories:</p>
<ol>
<li><strong>General Management Practices</strong>: These are practices adopted and adapted for service management from general business management domains (e.g., Change Enablement, Information Security Management).</li>
<li><strong>Service Management Practices</strong>: These were developed specifically for service management and are based on a long history of best practices (e.g., Incident Management, Service Desk).</li>
<li><strong>Technical Management Practices</strong>: These are adapted from the technology management domain for specific technical services (e.g., Infrastructure and Platform Management).</li>
</ol>
<h3 id="heading-how-itil-v4-works-in-an-organisation">How ITIL v4 Works in an Organisation</h3>
<p>Implementing ITIL v4 is a journey of continuous improvement, not a one-time project. It typically involves a few key steps:</p>
<ol>
<li><strong>Assessment</strong>: An organisation begins by assessing its current service management practices to understand its strengths and weaknesses, and to identify areas for improvement.</li>
<li><strong>Training and Awareness</strong>: Staff members are trained on ITIL v4 principles and practices to ensure a common understanding and to get buy-in from all levels.</li>
<li><strong>Adoption of Practices</strong>: Organisations select the most relevant practices from ITIL v4 and integrate them into their existing processes, tailoring them to their specific context.</li>
<li><strong>Continual Improvement</strong>: An organisation establishes a culture of continual improvement, regularly reviewing and refining its practices based on feedback, performance metrics, and a changing business environment.</li>
</ol>
<h4 id="heading-conclusion">Conclusion</h4>
<p>ITIL v4 provides a robust framework for organisations seeking to enhance their IT service management capabilities. By focusing on value creation, adopting the guiding principles, and using the Service Value Chain and practices, organisations can align their IT services with business objectives, boost efficiency, and foster better collaboration. As the digital landscape continues to evolve, ITIL v4 remains a vital and flexible tool for organisations aiming to thrive in a competitive environment.</p>
]]></content:encoded></item><item><title><![CDATA[ISO 27001: An Essential Guide to Information Security]]></title><description><![CDATA[ISO 27001 is an internationally recognised standard for Information Security Management Systems (ISMS). It provides a systematic approach to managing sensitive company information, ensuring its confidentiality, integrity, and availability. This blog ...]]></description><link>https://tech-journeys.com/iso-27001-an-essential-guide-to-information-security</link><guid isPermaLink="true">https://tech-journeys.com/iso-27001-an-essential-guide-to-information-security</guid><category><![CDATA[ISO 27001]]></category><category><![CDATA[compliance ]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Sun, 10 Aug 2025 06:31:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772355024/e3c0a244-b2b5-4e8f-9f77-1c85126e8972.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>ISO 27001 is an internationally recognised standard for <strong>Information Security Management Systems</strong> (ISMS). It provides a systematic approach to managing sensitive company information, ensuring its confidentiality, integrity, and availability. This blog delves into the intricacies of ISO 27001, exploring its framework, principles, implementation process, and the benefits it offers to organisations.</p>
<h3 id="heading-what-is-iso-27001">What is ISO 27001?</h3>
<p>ISO 27001 is part of the <a target="_blank" href="https://www.iso.org/standard/iso-iec-27000-family">ISO/IEC 27000 family of standards</a>, which focuses on <strong>Information Security Management</strong>. The standard outlines the requirements for establishing, implementing, maintaining, and continually improving an ISMS. It is designed to <strong>help organisations manage</strong> their <strong>information security risks</strong> effectively, ensuring that they can <strong>protect</strong> their <strong>data from unauthorised access</strong>, <strong>breaches</strong>, and other <strong>threats</strong>.</p>
<h3 id="heading-key-components-of-iso-27001">Key Components of ISO 27001</h3>
<h4 id="heading-1-information-security-management-system-isms">1. Information Security Management System (ISMS)</h4>
<p>At the core of ISO 27001 is the ISMS, which is a systematic approach to managing sensitive information. It encompasses <strong>people</strong>, <strong>processes</strong>, and <strong>technology</strong>, ensuring that all aspects of information security are addressed. The ISMS is designed to identify, assess, and manage information security risks, providing a framework for continuous improvement.</p>
<h4 id="heading-2-risk-assessment-and-treatment">2. Risk Assessment and Treatment</h4>
<p>ISO 27001 emphasises <strong>the importance of risk assessment and treatment</strong>. Organisations must identify potential security risks, evaluate their impact, and determine appropriate measures to mitigate them. This process involves:</p>
<p>• <strong>Risk Identification</strong>: Recognising potential threats and vulnerabilities.</p>
<p>• <strong>Risk Analysis</strong>: Evaluating the likelihood and impact of identified risks.</p>
<p>• <strong>Risk Evaluation</strong>: Prioritising risks based on their significance.</p>
<p>• <strong>Risk Treatment</strong>: Implementing controls to manage and mitigate risks.</p>
<h4 id="heading-3-control-objectives-and-controls">3. Control Objectives and Controls</h4>
<p>ISO 27001 includes a <strong>comprehensive set of control objectives and controls that organisations can implement to address identified risks</strong>. These controls are categorised into various domains, such as:</p>
<p>• <strong>Access Control</strong>: Ensuring that only authorised personnel can access sensitive information.</p>
<p>• <strong>Asset Management</strong>: Identifying and managing information assets to protect their value.</p>
<p>• <strong>Incident Management</strong>: Establishing procedures for responding to information security incidents.</p>
<p>• <strong>Compliance</strong>: Ensuring adherence to legal, regulatory, and contractual obligations.</p>
<h4 id="heading-4-continual-improvement">4. Continual Improvement</h4>
<p>A <strong>fundamental principle of ISO 27001</strong> is the concept of <strong>continual improvement</strong>. Organisations are encouraged to regularly review and update their ISMS to adapt to changing risks and business environments. This involves conducting internal audits, management reviews, and ongoing training for staff.</p>
<h3 id="heading-implementation-process">Implementation Process</h3>
<p>Implementing ISO 27001 involves several key steps:</p>
<p><strong>1. Define the Scope</strong>: Determine the boundaries of the ISMS, including the information assets to be protected.</p>
<p><strong>2. Conduct a Risk Assessment</strong>: Identify and assess risks to information security.</p>
<p><strong>3. Develop a Risk Treatment Plan</strong>: Outline the controls to be implemented to mitigate identified risks.</p>
<p><strong>4. Implement Controls</strong>: Put in place the necessary security measures and policies.</p>
<p><strong>5.</strong> <strong>Monitor and Review</strong>: Continuously monitor the effectiveness of the ISMS and make adjustments as needed.</p>
<p><strong>6. Internal Audit</strong>: Conduct regular audits to ensure compliance with ISO 27001 requirements.</p>
<p><strong>7. Management Review</strong>: Senior management should review the ISMS to ensure it remains effective and aligned with organisational goals.</p>
<p><strong>8. Certification</strong>: Organisations can seek certification from an accredited body to demonstrate compliance with ISO 27001.</p>
<h3 id="heading-benefits-of-iso-27001">Benefits of ISO 27001</h3>
<p>Implementing ISO 27001 offers numerous benefits, including:</p>
<p>• <strong>Enhanced Security</strong>: A structured approach to managing information security risks leads to improved protection of sensitive data.</p>
<p>• <strong>Regulatory Compliance</strong>: Helps organisations comply with legal and regulatory requirements related to information security.</p>
<p>• <strong>Increased Trust</strong>: Certification can enhance an organisation’s reputation and build trust with clients and stakeholders.</p>
<p>• <strong>Operational Efficiency</strong>: Streamlined processes and improved risk management can lead to greater operational efficiency.</p>
<p>• <strong>Competitive Advantage</strong>: Organisations that demonstrate a commitment to information security can differentiate themselves in the marketplace.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>ISO 27001 is a vital standard for organisations seeking to establish a robust <strong>Information Security Management System</strong>. By understanding its framework, implementing its principles, and committing to continual improvement, organisations can effectively manage their information security risks and protect their valuable data assets. The journey towards ISO 27001 certification not only enhances security but also fosters a culture of accountability and resilience in the face of evolving threats.</p>
]]></content:encoded></item><item><title><![CDATA[Why Documentation Isn’t Just a Chore]]></title><description><![CDATA[If you’ve ever spent hours deciphering someone else’s cryptic configuration, or frantically tried to recall that one crucial step you performed months ago, you’ll understand the silent agony of poor (or non-existent) documentation. Just like overthin...]]></description><link>https://tech-journeys.com/importance-of-documentation</link><guid isPermaLink="true">https://tech-journeys.com/importance-of-documentation</guid><category><![CDATA[Technical writing ]]></category><category><![CDATA[documentation]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Tue, 05 Aug 2025 18:01:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772362240/52744ff4-1314-421c-a78b-10641b057cf4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you’ve ever spent hours deciphering someone else’s cryptic configuration, or frantically tried to recall that one crucial step you performed months ago, you’ll understand the silent agony of poor (or non-existent) documentation. Just like overthinking can stall our progress, the lack of clear documentation can cripple our teams and hinder our individual growth.</p>
<p>In the world of <strong>IT,</strong>  whether we’re on the front lines of helpdesk support, managing critical infrastructure, building automation pipelines, or writing integrations, it’s easy to prioritise <strong><em>doing</em></strong> over <strong><em>explaining</em></strong>. We troubleshoot, we fix, we deploy, and we move on. Documentation often feels like red tape, a slowdown we can’t afford.</p>
<p>But what if documentation isn’t a burden? What if it’s a <em>force multiplier</em> i.e, a way to increase the value of the work we’ve already done?</p>
<h3 id="heading-what-good-documentation-looks-like">What Good Documentation Looks Like</h3>
<p>Good documentation isn’t about writing War and Peace for every single task. It’s about creating clear, concise, and easily accessible resources that help ourselves and our colleagues understand:</p>
<ul>
<li><p><strong>What was done:</strong> The exact steps taken to configure a system, resolve an issue, or implement a change.</p>
</li>
<li><p><strong>Why it was done:</strong> The reasoning behind decisions, the context of the problem, and the intended outcome.</p>
</li>
<li><p><strong>How it was done:</strong> The specific tools, commands, and configurations used.</p>
</li>
<li><p><strong>Where to find it:</strong> A centralised and organised system for storing and retrieving information.</p>
</li>
</ul>
<h3 id="heading-a-real-world-process-for-writing-better-documentation">A Real-World Process for Writing Better Documentation</h3>
<blockquote>
<p>Creating documentation isn’t about perfection, it’s more about <strong>clarity</strong>, <strong>consistency</strong>, and <strong>actionability</strong>. The flow below outlines a practical approach I use to create high-impact, team-friendly documentation.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772359680/75721d4b-c1a4-4799-b28c-92d32c52ec95.gif" alt="This diagram was created using draw.io" /></p>
<p><strong>Documentation can take many forms:</strong></p>
<ul>
<li><p>Knowledge base articles.</p>
</li>
<li><p>How-to guides.</p>
</li>
<li><p>Workflows.</p>
</li>
<li><p>Troubleshooting guides.</p>
</li>
<li><p>Release notes.</p>
</li>
<li><p>Onboarding/Off-boarding processes.</p>
</li>
<li><p>User manuals.</p>
</li>
<li><p>Infrastructure diagrams and playbooks for operations teams.</p>
</li>
</ul>
<p>The key is to tailor the format and depth to <strong>suit the <em>audience and purpose</em>   without compromising clarity</strong>.</p>
<h3 id="heading-the-hidden-power-of-documented-processes">The Hidden Power of Documented Processes</h3>
<p>Just as <a target="_blank" href="https://medium.com/@luqmaanmarthinus93/from-overthinking-to-execution-confronting-analysis-paralysis-in-tech-18ee46701e2d">analysis paralysis</a> can stem from a desire to “get it right,” the reluctance to document can sometimes come from a feeling that “it’s faster if I just do it myself.” While this might be true in the short term, it creates <strong>significant long-term risks</strong>.</p>
<h3 id="heading-preventing-the-single-point-of-failure"><strong>Preventing the Single Point of Failure:</strong></h3>
<p>One of the most critical benefits of thorough documentation is its ability to <strong>mitigate</strong> the risk of <strong>a single point of failure</strong>. Imagine a scenario where only one person on your team knows how to troubleshoot a critical system or perform a key deployment. What happens when that person is unavailable due to illness, vacation, or a change in employment?</p>
<p>Suddenly, the team is scrambling, productivity grinds to a halt, and stress levels skyrocket. This is where documentation acts as a vital safety net. By clearly outlining processes and solutions, we empower the entire team to:</p>
<ul>
<li><p><strong>Troubleshoot independently:</strong> When issues arise, well-documented procedures allow other team members to diagnose and resolve problems without relying solely on the “expert.”</p>
</li>
<li><p><strong>Onboard new team members efficiently:</strong> Comprehensive documentation provides a valuable resource for new hires to quickly get up to speed on systems and processes.</p>
</li>
<li><p><strong>Maintain consistency:</strong> Documented standards and procedures ensure that tasks are performed consistently, reducing errors and improving reliability.</p>
</li>
<li><p><strong>Share knowledge and learn from each other:</strong> Documentation becomes a living repository of team knowledge, fostering collaboration and continuous learning.</p>
</li>
<li><p><strong>Reduce reliance on tribal knowledge:</strong> Tacit knowledge held only by individuals is a significant risk. Documentation helps to codify this knowledge and make it accessible to everyone.</p>
</li>
</ul>
<h3 id="heading-my-journey-towards-documentation-discipline">My Journey Towards Documentation Discipline</h3>
<p>Like many, I used to view documentation as a necessary evil. It felt time-consuming and often got pushed to the bottom of the priority list. However, after experiencing firsthand the chaos and frustration caused by a lack of documentation, I’ve come to see it as an indispensable part of effective IT practice.</p>
<p>I’ve started making a conscious effort to document as I go, even for seemingly small tasks. I’ve also championed the creation of a centralised knowledge base for my team. The initial investment of time has already paid dividends in terms of reduced support requests, faster troubleshooting, and a more resilient team.</p>
<h3 id="heading-a-call-to-document-empower-yourself-and-your-team">A Call to Document: Empower Yourself and Your Team</h3>
<p>It’s time we shift our perspective on documentation because it’s an investment in our collective knowledge, our team’s resilience, and our own future success.</p>
<p>Just as we challenged ourselves to embrace “comfortable incompletion” in the pursuit of progress, let’s commit to embracing consistent and clear documentation. It’s a simple yet powerful way to prevent bottlenecks, empower our colleagues, and ensure that the knowledge we gain doesn’t walk out the door with any single individual.</p>
<p>Start small. Document one key process this week. Share your knowledge. You’ll be surprised by the positive impact it has on yourself and your team.🙂</p>
]]></content:encoded></item><item><title><![CDATA[From Overthinking to Execution: Confronting Analysis Paralysis in Tech]]></title><description><![CDATA[Analysis Paralysis
If you’ve ever gone down a rabbit hole trying to find the “perfect” resolution for a challenging ticket, rewritten your troubleshooting notes five times just to make it sound right, or delayed starting a certification because you d...]]></description><link>https://tech-journeys.com/analysis-paralysis-in-tech</link><guid isPermaLink="true">https://tech-journeys.com/analysis-paralysis-in-tech</guid><category><![CDATA[decision making]]></category><category><![CDATA[analysis paralysis]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Tue, 05 Aug 2025 08:47:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772349781/0390fdc6-953f-426b-b3b3-d84a6bb47cf2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-analysis-paralysis">Analysis Paralysis</h2>
<p>If you’ve ever gone down a rabbit hole trying to find the “perfect” resolution for a challenging ticket, rewritten your troubleshooting notes five times just to make it sound right, or delayed starting a certification because you didn’t feel 100% ready, you’re not the only one. Most of us in IT have been there. It’s not laziness or lack of discipline. It’s analysis paralysis which is a common experience among professionals in all areas of IT.</p>
<p>This article explores how overthinking can subtly stall <strong>career growth</strong>, <strong>personal development</strong>, and <strong>technical confidence</strong>. More importantly, it offers practical strategies I’m using to break through it.</p>
<h3 id="heading-what-is-analysis-paralysis">What Is Analysis Paralysis?</h3>
<p>Analysis paralysis is a state of inaction caused by over-analysing choices, potential outcomes, or the fear of making the wrong decision. It’s often mistaken for diligence or caution, but in reality, it <strong>undermines progress</strong>.</p>
<p>In IT, it typically shows up as:</p>
<ul>
<li><p>Constantly switching between tools, methods, or documentation without actually resolving the issue.</p>
</li>
<li><p>Obsessing over the “perfect” solution instead of implementing a working fix.</p>
</li>
<li><p>Consuming endless content but producing no tangible results.</p>
</li>
</ul>
<p>Over time, this leads to frustration, imposter syndrome, and burnout. Not from working too hard, but from overthinking for too long.</p>
<h3 id="heading-why-its-common-in-it-roles">Why It’s Common in IT Roles</h3>
<p>IT professionals, especially those who are detail-oriented, introverted, and/or self-taught are particularly vulnerable to this trap. We’re trained to anticipate failure scenarios, weigh up options, and avoid misconfiguration. However, that mindset, when applied to every single task, can become counterproductive.</p>
<p><strong>Contributing Factors:</strong></p>
<ul>
<li><p><strong>Perfectionism:</strong> The belief that only flawless work is worth sharing or implementing.</p>
</li>
<li><p><strong>Fear of failure:</strong> Especially in front of a user or a manager.</p>
</li>
<li><p><strong>Tool overload:</strong> The paralysis that comes from having too many options for a given task.</p>
</li>
<li><p><strong>Imposter syndrome:</strong> Feeling the need to “know more” before helping a user or starting a project.</p>
</li>
</ul>
<p>When these factors combine, even small decisions such as choosing the best approach to a ticket or deciding on a new piece of software to test  can feel overwhelming especially when it impacts the business.</p>
<h3 id="heading-how-im-working-through-it">How I’m Working Through It</h3>
<p>I haven’t completely overcome this, but I’ve developed practical strategies coupled with mindfulness that help me take consistent action while staying technically disciplined. The working methods listed below is what I‘ve been using daily in my work and personal projects.</p>
<ol>
<li><p><strong>Prioritise Delivery Over Perfection</strong>: Rather than waiting until something is “perfectly documented” or “fully automated,” I commit to delivering a first iteration. A working solution however basic , creates momentum, builds confidence, and uncovers genuine problems worth solving.</p>
</li>
<li><p><strong>Impose Intentional Constraints:</strong> Rather than keeping all options open, an approach that often leads to decision fatigue ,  I intentionally narrow my choices. For each project, I commit to a single scripting language, one troubleshooting methodology, or one specific tool. This practice prevents me from falling into the “<a target="_blank" href="https://thetreasureswithin.net/shiny-object-syndrome/#:~:text=new%20shiny%20idea.-,What%20Is%20Shiny%20Object%20Syndrome?,for%20new%20trends%20to%20follow.">shiny object syndrome</a>” trap, where chasing new technologies distracts from execution. Clear constraints reduce cognitive overhead and force deeper focus, leading to better outcomes and a more disciplined workflow.</p>
</li>
<li><p><strong>Document While You Learn :</strong> Creating documentation  whether it be a ticketing system, a team wiki, or a personal notebook  forces structure into learning. It transforms passive reading into active knowledge-building. If I can explain a concept or a solution clearly, I understand it well enough to act on it.</p>
</li>
<li><p><strong>Set External Accountability:</strong> Self-imposed deadlines are easy to ignore. External ones are harder. I’ve started sharing ticket progress or project updates with colleagues. It creates a gentle pressure to follow through.</p>
</li>
<li><p><strong>Normalise Imperfect Output:</strong> It’s tempting to compare ourselves to polished help guides or perfectly organised repositories. But what actually earns respect in the industry is consistently turning up, visibly solving problems, and documenting the journey.</p>
</li>
</ol>
<h3 id="heading-the-core-skill-comfortable-incompletion">The Core Skill: Comfortable Incompletion</h3>
<p>In an environment saturated with tools, knowledge bases, and endless updates, the most valuable skill is the ability to act without <strong>knowing everything</strong>(which is impossible anyway).</p>
<p>Progress usually comes from execution under uncertainty.<br />In other words: <strong>start first. Refine later.</strong></p>
<h3 id="heading-a-challenge-if-youre-currently-stuck">A Challenge, If You’re Currently Stuck</h3>
<p>If you’ve been delaying a project, ticket or are stuck in research mode, try this:</p>
<ul>
<li><p>Choose one task you’ve postponed.</p>
</li>
<li><p>Ask yourself: <strong>“Realistically, how long would this take me if I focused on just getting it done?”</strong> This simple question helps cut through overthinking and gives you a rough timebox to work within. It brings clarity to what might otherwise feel vague or overwhelming.</p>
</li>
<li><p>Use <a target="_blank" href="https://pomofocus.io/app"><strong>Pomofocus</strong></a> to help you get the ball rolling.</p>
</li>
<li><p><strong>DON’T</strong> be afraid to ask for help. 🙂</p>
</li>
<li><p>Write a short summary of what you learned or struggled with.</p>
</li>
</ul>
<p>Do this not to impress anyone, but to rewire the habit.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Overthinking is a symptom of caring deeply about doing things right. This same drive, when channeled into action, becomes a powerful strength.</p>
<p>To unlock this strength, we must shift our focus from seeking perfection to embracing progress. We can achieve this by <strong>designing, documenting, testing, and iterating</strong>, even when things aren’t perfect. By <strong>normalising building before we feel completely ready</strong>, we can transform our tendency to overthink into a powerful force for creation and innovation.</p>
]]></content:encoded></item><item><title><![CDATA[Desktop, Laptop, or Server? Choosing the Right Tool for the Right Job]]></title><description><![CDATA[In the world of computing, the terms desktop, laptop, and server often get thrown around interchangeably. But like comparing a sports car, a motorcycle, and a heavy-duty truck, each is engineered for a fundamentally different mission.
This guide brea...]]></description><link>https://tech-journeys.com/desktop-laptop-or-server</link><guid isPermaLink="true">https://tech-journeys.com/desktop-laptop-or-server</guid><category><![CDATA[proxmox]]></category><category><![CDATA[Homelab]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[server]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Sun, 06 Jul 2025 16:36:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772473873/b235cb42-b4d2-41d2-bada-9a08e8823c7b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the world of computing, the terms desktop, laptop, and server often get thrown around interchangeably. But like comparing a sports car, a motorcycle, and a heavy-duty truck, each is engineered for a fundamentally different mission.</p>
<p>This guide breaks down the essential differences  and why, for home lab setups, even an old laptop or desktop can be repurposed into something powerful.</p>
<p><strong>Desktops: The Personal Productivity Machine</strong></p>
<p><strong>What is a Desktop?</strong><br />A desktop computer is designed for individual use. It’s your daily driver for tasks like browsing, editing documents, gaming, content creation, or video calls. It prioritises user experience, responsiveness, and visual performance.</p>
<p><strong>Typical Hardware Features:</strong></p>
<ul>
<li><p>CPU: High-clock-speed processors like Intel Core i5/i7/i9 or AMD Ryzen  which is great for single-threaded workloads.</p>
</li>
<li><p>RAM: 8–32GB (non-ECC), optimised for <strong>personal</strong> productivity.</p>
</li>
<li><p>Storage: Fast SSDs for OS/apps + optional HDDs for data. Usually no RAID.</p>
</li>
<li><p>GPU: Dedicated graphics cards for gaming, design, or video editing.</p>
</li>
<li><p>Networking: 1x Gigabit Ethernet + Wi-Fi.</p>
</li>
<li><p>Redundancy: Almost none. If a part dies, the system goes down.</p>
</li>
<li><p>Form Factor: Towers, small form factor (SFF), or all-in-one.</p>
</li>
<li><p>OS: Windows, macOS, Ubuntu/Fedora with GUI.</p>
</li>
</ul>
<p><strong>Typical Use Cases:</strong></p>
<ul>
<li><p>Browsing, email, office work.</p>
</li>
<li><p>Gaming and content creation.</p>
</li>
<li><p>Media streaming and personal cloud.</p>
</li>
<li><p>Learning platforms and dev environments.</p>
</li>
</ul>
<p><strong>Laptops: Portable Desktops  but with limits</strong></p>
<p><strong>What is a Laptop?</strong></p>
<p>A laptop is a compact, battery-powered computer designed for mobility. It offers near-desktop functionality with the convenience of portability.</p>
<p><strong>Hardware Characteristics:</strong></p>
<ul>
<li><p>CPU: Laptop-grade variants of desktop chips (lower TDP).</p>
</li>
<li><p>RAM: Typically 8–32GB, often soldered or limited in upgradeability.</p>
</li>
<li><p>Storage: SSD or NVMe, usually only one slot.</p>
</li>
<li><p>GPU: Integrated or lower-tier dedicated GPU.</p>
</li>
<li><p>Networking: Wi-Fi primary, sometimes Ethernet.</p>
</li>
<li><p>Redundancy: None.</p>
</li>
<li><p>Battery: Built-in UPS equivalent, but not ideal for 24/7 uptime.</p>
</li>
<li><p>Form Factor: Portable, all-in-one.</p>
</li>
<li><p>OS: Same as desktops.</p>
</li>
</ul>
<p><strong>Typical Use Cases:</strong></p>
<ul>
<li><p>Travel and mobile productivity.</p>
</li>
<li><p>Learning and experimentation.</p>
</li>
<li><p>Remote management interface.</p>
</li>
<li><p>Light-duty personal servers.</p>
</li>
</ul>
<p><strong>Servers: The Always-On Backbone of the Network</strong></p>
<p><strong>What is a Server?</strong><br />It’s a purpose-built to deliver services to other machines over a network. It’s designed for 24/7 uptime, stability under load, and scalability. Servers run critical infrastructure: websites, databases, business apps, and more.</p>
<p><strong>Typical Hardware Features:</strong></p>
<ul>
<li><p>CPU: Multi-socket, multi-core chips (Intel Xeon, AMD EPYC).</p>
</li>
<li><p>RAM: 64GB–1TB+ with ECC for data integrity and uptime.</p>
</li>
<li><p>Storage: Redundant arrays (RAID), hot-swappable drives, enterprise SSDs/HDDs.</p>
</li>
<li><p>GPU: Minimal (integrated or headless). High-end GPUs only for specialised workloads.</p>
</li>
<li><p>Networking: Multiple NICs, often 10GbE+, with bonding/redundancy.</p>
</li>
<li><p>Redundancy: Dual power supplies, redundant fans, RAID, failover NICs.</p>
</li>
<li><p>Form Factor: Rack-mount (1U/2U/4U) or tower, which is often noisy and heavy.</p>
</li>
<li><p>OS: Server-grade distros (Ubuntu Server, RHEL, Debian, Windows Server )<br />  <strong>Note</strong>: I’m <strong>not</strong> a big Windows fan so you won’t be seeing that much content relating to Windows OS, you’re <strong>most</strong> welcome 😄).</p>
</li>
</ul>
<p><strong>Typical Use Cases:</strong></p>
<ul>
<li><p>Web, database, and application hosting.</p>
</li>
<li><p>File sharing and centralised storage.</p>
</li>
<li><p>Virtualisation and container orchestration.</p>
</li>
<li><p>Identity services (AD/LDAP), backup servers.</p>
</li>
</ul>
<p><strong>Core Differences:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772468827/b6a4a6dd-4e51-4165-8454-8c6cb16b8f2b.png" alt /></p>
<p>**Turning Desktops and Laptops into Home Lab Servers<br />**In resource-constrained environments, using a desktop or even a laptop as a home lab server makes perfect sense:</p>
<ul>
<li><p>Low upfront cost  - use what you already have.</p>
</li>
<li><p>Lower power draw  -  ideal in high electricity cost areas.</p>
</li>
<li><p>Hands-on learning  -  great for Linux, Docker, Proxmox, etc.</p>
</li>
</ul>
<p><strong>Practical Tips for Repurposing Desktops &amp; Laptops</strong></p>
<p>When converting a desktop or laptop into a server, treat it like a production system with the following best practices:</p>
<p><strong>Optimisation Tips:</strong></p>
<ul>
<li><p>Remove unused peripherals (webcams, audio cards).</p>
</li>
<li><p>Disable unused devices in BIOS.</p>
</li>
<li><p>Replace GPU (if unused): Lower idle power, less heat.</p>
</li>
</ul>
<p><strong>Power &amp; Protection:</strong></p>
<ul>
<li><p>Use a UPS  especially in power-unstable regions(load shedding).</p>
</li>
<li><p>Enable automatic restarts in BIOS after power loss.</p>
</li>
<li><p>Clean regularly  as dust kills airflow and shortens lifespan.</p>
</li>
</ul>
<p><strong>Cooling &amp; Noise:</strong></p>
<ul>
<li><p>Improve airflow or run side-panel open.</p>
</li>
<li><p>Tune fan curves for balance.</p>
</li>
</ul>
<p><strong>Know the Limits:</strong></p>
<ul>
<li><p>Software RAID instead of hardware.</p>
</li>
<li><p>Accept lack of ECC RAM  -  mitigate with backups.</p>
</li>
<li><p>No hot-swap? Keep backups and spare parts.</p>
</li>
</ul>
<p><strong>Conclusion</strong><br />A desktop/laptop is your personal workstation, responsive and graphics-ready. A server is designed for non-stop, multi-user workloads. But when approached intelligently(do your research), a desktop/laptop can be used as a lab-grade server  giving you a platform to learn, experiment, and even deploy services that you’d use in the real-world.</p>
<p><strong>Actually</strong>, before I conclude, this is a Dell Latitude 5500 8th Gen Core i5 that I purchased in July 2024 off Facebook marketplace for 750 ZAR and it’s running Proxmox VE:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772470426/f1990c8c-c1eb-44ef-843c-b6e2859b331b.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772472104/5d697182-62b7-41de-a921-1b1ff7a05dee.jpeg" alt /></p>
<p>Yep, it looks ugly as hell but it’s been reliable since the date of purchase.</p>
<p>It came with a 256GB NVMe SSD and 4GB DDR4 RAM but has since been upgraded to a 512GB NVMe SSD and 32GB DDR4 RAM after months of saving.</p>
<p>In environments where budget, power consumption, and access are limited or simply unaffordable, don’t wait for the “perfect” gear. Start with what you have, if you don’t have anything yet, do some research on desktops/laptops(specs) that’s capable of helping you achieve whatever your use-case might be.</p>
<p>Your repurposed desktop or laptop might just be the hero your homelab deserves.</p>
]]></content:encoded></item><item><title><![CDATA[Understanding Virtualisation and Containerisation]]></title><description><![CDATA[In the ever-evolving landscape of IT, the quest for efficiency, scalability, and resource optimisation has led to the widespread adoption of two powerful technologies: virtualisation and containerisation. While often discussed in the same breath, the...]]></description><link>https://tech-journeys.com/understanding-virtualisation-and-containerisation</link><guid isPermaLink="true">https://tech-journeys.com/understanding-virtualisation-and-containerisation</guid><category><![CDATA[containers]]></category><category><![CDATA[containerization]]></category><category><![CDATA[virtualization]]></category><category><![CDATA[virtual machine]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Sun, 06 Jul 2025 16:30:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772369909/2dee21d4-5e6e-46dc-8a2e-0524dcaf0e6d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the ever-evolving landscape of IT, the quest for efficiency, scalability, and resource optimisation has led to the widespread adoption of two powerful technologies: <strong>virtualisation</strong> and <strong>containerisation</strong>. While often discussed in the same breath, they represent distinct approaches to abstracting applications and their environments, each with its unique strengths and use cases. Let’s delve into what they are, the problems they solve, and their fundamental differences.</p>
<p><strong>Virtualisation: The Power of the Virtual Machine</strong></p>
<p><strong>What it is</strong>:<br />At its core, virtualisation is the technology that allows you to create <strong>software-based</strong>, or “<strong>virtual</strong>,” versions of computing resources, such as servers, storage devices, networks, and even operating systems. Imagine having a single powerful physical server, and being able to run multiple, independent “virtual machines” (VMs) on it, each behaving like a completely separate physical computer.</p>
<p>This magic is performed by a piece of software called a <a target="_blank" href="https://aws.amazon.com/what-is/hypervisor/">hypervisor</a>. The hypervisor sits directly on the physical hardware (Type-1, or bare-metal, like Proxmox VE(my favorite) or VMware ESXi) or on top of an existing operating system (Type-2, or hosted, like VirtualBox or VMware Workstation). It allocates the physical resources (CPU, RAM, storage, network) to each VM and manages their execution, ensuring they run in isolation from each other. Each VM includes its own operating system (the “guest OS”) and applications.</p>
<p><strong>Problems it solves</strong>:<br />Before virtualisation, deploying a new application often meant dedicating a physical server to it. This led to:</p>
<ul>
<li><p>Underutilisation of hardware: Most servers are not constantly running at 100% capacity, meaning significant computational power was often wasted.</p>
</li>
<li><p>Server sprawl: A growing number of physical servers meant increased power consumption, cooling costs, and physical space requirements.</p>
</li>
<li><p>Deployment complexity: Setting up a new server, installing the OS, and configuring applications was a time-consuming process.</p>
</li>
<li><p>Resource conflicts: Different applications on the same physical server could have conflicting software dependencies, leading to instability.</p>
</li>
<li><p>Disaster recovery challenges: Recovering a failed physical server and its applications could be a lengthy and complex ordeal.</p>
</li>
</ul>
<p><strong>Virtualisation directly addresses these issues by</strong>:</p>
<ul>
<li><p>Maximising hardware utilisation: Multiple VMs can share the same physical hardware, significantly increasing the return on investment for server infrastructure.</p>
</li>
<li><p>Reducing physical infrastructure: Fewer physical servers mean lower power consumption, reduced cooling costs, and a smaller data center footprint.</p>
</li>
<li><p>Faster provisioning: VMs can be quickly cloned, deployed from templates, or spun up on demand, drastically reducing deployment times.</p>
</li>
<li><p>Enhanced isolation: Each VM operates in its own isolated environment, preventing conflicts between applications and ensuring stability.</p>
</li>
<li><p>Improved disaster recovery: VMs can be easily backed up, replicated, and restored, leading to quicker recovery times in the event of hardware failure or data loss.</p>
</li>
</ul>
<p><strong>Containerisation: The Lightweight Revolution</strong></p>
<p><strong>What it is</strong>:<br />Containerisation is a more <strong>lightweight</strong> form of virtualisation that packages an application and all its dependencies (code, runtime, libraries, configuration files) into a single, self-contained unit called a “container.” Unlike VMs, containers <strong>do not</strong> include a full operating system. Instead, they share the host operating system’s kernel.</p>
<p>A “container engine” (like Docker) manages these containers, providing the necessary isolation and resource management. Think of it as a highly efficient, portable, and isolated environment specifically for running applications.</p>
<p><strong>Problems it solves:</strong></p>
<p>While virtualisation solved many problems, new challenges emerged, particularly in the realm of application development and deployment:</p>
<ul>
<li><p>“It works on my machine” syndrome: Developers often faced issues where applications ran perfectly on their local development environment but failed in testing or production environments due to subtle differences in underlying configurations or dependencies.</p>
</li>
<li><p>Slower deployment and startup: Even with VMs, booting a full operating system for each application could be time-consuming.</p>
</li>
<li><p>Resource overhead for microservices: As applications became more modular (microservices), spinning up a separate VM for each small service was resource-intensive and inefficient.</p>
</li>
<li><p>Portability across environments: Ensuring an application behaved consistently across different cloud providers or on-premises infrastructure could be challenging.</p>
</li>
</ul>
<p><strong>Containerisation tackles these problems head-on:</strong></p>
<ul>
<li><p>Environmental consistency: By bundling all dependencies, containers ensure that an application runs consistently from development to testing to production, eliminating environment-related bugs.</p>
</li>
<li><p>Rapid deployment and startup: Containers start up in seconds (or even milliseconds) because they don’t need to boot an entire OS, enabling faster development cycles and quicker scaling.</p>
</li>
<li><p>Lightweight and efficient: Sharing the host kernel means containers consume significantly fewer resources than VMs, allowing for higher density of applications on a single server.</p>
</li>
<li><p>Unparalleled portability: A container can run on any system that has a compatible container engine, regardless of the underlying infrastructure, making it ideal for hybrid and multi-cloud strategies.</p>
</li>
<li><p>Simplified dependency management: All application dependencies are packaged within the container, simplifying installation and preventing conflicts with other applications on the host system.</p>
</li>
</ul>
<p><strong>Key Differences: A Side-by-Side Comparison:</strong></p>
<p>While both technologies abstract resources, their approach and scope differ fundamentally:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772367674/9061491d-03da-4e34-84f3-f6b5bb868400.png" alt /></p>
<p><strong>Conclusion</strong><br />Neither virtualisation nor containerisation is inherently “better” than the other. They are powerful tools that solve different problems and excel in different scenarios.<br /><strong><em>Virtualisation</em></strong> provides robust isolation and the flexibility to run diverse operating systems, making it a cornerstone of cloud computing and traditional server consolidation.<br /><strong><em>Containerisation</em></strong>, with its lightweight nature and rapid deployment capabilities, has become the de facto standard for modern, agile application development and microservices architectures.</p>
<p>Understanding their distinct characteristics allow us to choose the right tool for the job, building efficient, scalable, and resilient IT infrastructure in our homelabs or business.</p>
]]></content:encoded></item><item><title><![CDATA[Why Proxmox VE Became My New Home After VirtualBox]]></title><description><![CDATA[For years, VirtualBox was my trusty steed in the world of virtualisation. It was the first tool I reached for when I needed to spin up a new operating system for testing, development, or just plain curiosity. It’s user-friendly, free, and gets the jo...]]></description><link>https://tech-journeys.com/why-proxmox-ve-became-my-new-home-after-virtualbox</link><guid isPermaLink="true">https://tech-journeys.com/why-proxmox-ve-became-my-new-home-after-virtualbox</guid><category><![CDATA[proxmox]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[Homelab]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Sun, 06 Jul 2025 16:25:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772379897/d8d8ba67-9213-4747-9c9d-802548a34c81.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For years, VirtualBox was my trusty steed in the world of virtualisation. It was the first tool I reached for when I needed to spin up a new operating system for testing, development, or just plain curiosity. It’s user-friendly, free, and gets the job done for most desktop virtualisation needs. However, as my home lab grew and my virtualisation demands became more sophisticated, I found myself hitting the limits of what VirtualBox could comfortably offer. That’s when I began my search for a more robust solution, and ultimately, made the switch to Proxmox Virtual Environment (VE).</p>
<p>This wasn’t a sudden, impulsive decision. It was a gradual realisation that my needs had outgrown the capabilities of a desktop hypervisor and migrated towards the realm of a Type-1, bare-metal solution. Here’s a breakdown of the key factors that propelled me from VirtualBox to Proxmox VE.</p>
<hr />
<h2 id="heading-the-inherent-limitations-of-a-type-2-hypervisor">The Inherent Limitations of a Type-2 Hypervisor</h2>
<p>VirtualBox, like VMware Workstation or Hyper-V on a desktop OS, is a Type-2 hypervisor. This means it runs on top of an existing operating system. While convenient for quick setups, this architecture introduces a layer of overhead. Resource allocation is managed by the host OS, which can lead to inefficiencies and performance bottlenecks, especially when running multiple demanding virtual machines concurrently. I noticed this particularly with disk I/O and network throughput, where my VMs would occasionally feel sluggish despite ample underlying hardware.</p>
<p>Proxmox VE, on the other hand, is a Type-1 hypervisor (bare-metal). It installs directly onto the hardware, giving it direct access and control over the system’s resources. This fundamental difference translates into significantly better performance, lower latency, and more efficient resource utilisation for virtual machines and containers.</p>
<hr />
<h2 id="heading-beyond-basic-vms-the-power-of-containerisation">Beyond Basic VMs: The Power of Containerisation</h2>
<p>One of the most compelling features that drew me to Proxmox VE was its integrated support for Linux Containers (LXC) in addition to Kernel-based Virtual Machines (KVM). While VirtualBox is solely focused on VMs, Proxmox VE offers a choice. For many of my lightweight applications, LXC containers are amazing!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772376246/24e4ddad-dc51-44b1-bd54-d7550a795a36.png" alt /></p>
<p>Containers are far more lightweight than traditional VMs. They share the host kernel, consuming fewer resources (CPU, RAM, storage) and starting up almost instantaneously. This is ideal for applications like DNS servers, monitoring tools, or small web services where the overhead of a full VM is unnecessary. Being able to effortlessly deploy both KVM VMs and LXC containers from a single, unified interface has streamlined my workflow immensely and allowed me to maximise the efficiency of my hardware.</p>
<hr />
<h2 id="heading-centralised-management-and-advanced-features">Centralised Management and Advanced Features</h2>
<p>As my number of virtual machines grew, managing them individually through the VirtualBox GUI became increasingly cumbersome. While VirtualBox offers some command-line tools, they don’t compare to the comprehensive management capabilities of Proxmox VE.</p>
<p>Proxmox VE provides a powerful, web-based management interface that allows for centralised control of all virtual machines, containers, storage, and networking. This unified dashboard is intuitive and feature-rich. I gained access to features like:</p>
<ul>
<li><p><strong>Live Migration:</strong> The ability to move running VMs between nodes in a cluster with no downtime is invaluable for maintenance or load balancing.</p>
</li>
<li><p><strong>High Availability (HA)</strong>: While not fully implemented in my current setup, the option to configure HA for critical VMs provides peace of mind for future expansion.</p>
</li>
<li><p><strong>Integrated Backup and Restore</strong>: Proxmox VE includes robust backup and restore functionalities, making disaster recovery scenarios much more manageable than manual methods in VirtualBox</p>
</li>
<li><p><strong>Flexible Storage Options:</strong> Proxmox VE natively supports various storage technologies like ZFS, LVM, and Ceph, offering greater flexibility and performance for my virtualised environments.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772377914/f1ec58c2-cc91-4dd3-87be-61d09cfe14b8.png" alt /></p>
<hr />
<h2 id="heading-the-community-and-future-proofing">The Community and Future-Proofing</h2>
<p>Finally, the strong and active community surrounding Proxmox VE was a significant draw. When encountering challenges or seeking best practices, the wealth of information available through forums, wikis, and documentation is immense. This vibrant ecosystem provides a sense of confidence that the platform will continue to evolve and be well-supported in the long term.</p>
<p>While VirtualBox remains an excellent tool for quick, single-user virtualisation on a desktop, for anyone looking to build a more robust, scalable, and efficient home lab or small-scale server environment, Proxmox VE is a clear winner. The transition was a learning curve, but the benefits in performance, flexibility, and management have been undeniable. My home lab has truly found its new, more powerful home and it’s very unlikely that I’ll be turning back.</p>
]]></content:encoded></item><item><title><![CDATA[Part 2: Organising Your Digital Workspace with Homepage]]></title><description><![CDATA[Bringing Order to Your Digital Workspace
Introduction
While keeping a physical workspace tidy is essential for focus and productivity, the same principles apply to our digital environments. Over time, I realised that having multiple browser tabs open...]]></description><link>https://tech-journeys.com/part-2-organising-your-digital-workspace-with-homepage</link><guid isPermaLink="true">https://tech-journeys.com/part-2-organising-your-digital-workspace-with-homepage</guid><category><![CDATA[Homelab]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Docker compose]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Fri, 14 Mar 2025 00:32:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772487205/214e8fad-e637-4d98-babd-d8f40abfd09d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-bringing-order-to-your-digital-workspace">Bringing Order to Your Digital Workspace</h2>
<h3 id="heading-introduction">Introduction</h3>
<p>While keeping a physical workspace tidy is essential for focus and productivity, the same principles apply to our digital environments. Over time, I realised that having multiple browser tabs open, scattered bookmarks, and disorganised files slowed me down just as much as a cluttered desk. To streamline my workflow, I explored <a target="_blank" href="https://gethomepage.dev/"><strong>Homepage</strong></a>, a self-hosted dashboard that centralises access to all essential work resources.</p>
<h3 id="heading-why-use-a-self-hosted-dashboard">Why Use a Self-Hosted Dashboard?</h3>
<p>If you frequently juggle multiple tools, platforms, and websites, a dashboard can significantly improve efficiency. Instead of rummaging through bookmarks or typing URLs manually, everything is accessible in one place. Here’s how <strong>Homepage</strong> helped me bring order to my digital workspace:</p>
<h3 id="heading-whats-this-homepage-you-speak-of">“What’s this ‘Homepage’ you speak of?”</h3>
<ul>
<li>It’s a lightweight, highly customisable dashboard that acts as a central hub for quick access to applications, services, and web links.</li>
</ul>
<p>Let’s dive into it<em>🙂</em></p>
<hr />
<h3 id="heading-1-deploying-with-docker">1. Deploying with Docker</h3>
<p>Since I run most of my self-hosted services in Docker, setting up Homepage is pretty straightforward.</p>
<p>Here’s how you can deploy it:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># create a directory called homepage and cd into it. </span>
mkdir -p ~/dashboard/homepage &amp;&amp; <span class="hljs-built_in">cd</span> ~/dashboard/homepage
</code></pre>
<pre><code class="lang-bash"><span class="hljs-comment">#create a docker-compose.yml file </span>
nano docker-compose.yml
</code></pre>
<p>Paste the following configuration(be sure to read the comments):</p>
<pre><code class="lang-yaml"><span class="hljs-meta">---</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">homepage:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">ghcr.io/gethomepage/homepage:latest</span>
    <span class="hljs-attr">container_name:</span> <span class="hljs-string">homepage</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-number">3000</span><span class="hljs-string">:3000</span>
    <span class="hljs-attr">env_file:</span> <span class="hljs-string">.env</span> <span class="hljs-comment"># Make sure to create this .env file in your current working directory (use touch .env)</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./config:/app/config</span> <span class="hljs-comment"># Homepage will create this for you.</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">/var/run/docker.sock:/var/run/docker.sock</span> <span class="hljs-comment"># (optional) For docker integrations, see alternative methods</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">PUID:</span> <span class="hljs-string">$PUID</span> <span class="hljs-comment"># Set this to your user ID (you can find it by running `id -u`)</span>
      <span class="hljs-attr">PGID:</span> <span class="hljs-string">$PGID</span> <span class="hljs-comment"># Set this to your group ID (you can find it by running `id -g`)</span>
      <span class="hljs-attr">TZ:</span> <span class="hljs-string">Africa/Johannesburg</span> <span class="hljs-comment"># set to your own timezone</span>
    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span>
</code></pre>
<h3 id="heading-2-accessing-the-default-dashboard">2. Accessing the default dashboard</h3>
<p>Once deployed, you can access the dashboard via <code>[http://&lt;your-server-ip&gt;:3000]</code></p>
<p>Homepage has a user-friendly YAML-based configuration file, making it easy to customise layouts, themes, categories and all sorts<em>🙂</em></p>
<blockquote>
<p>Note: The icons we will be using are sourced from <a target="_blank" href="https://github.com/homarr-labs/dashboard-icons/blob/main/ICONS.md">Homarr Labs Dashboard Icons</a>, where you can explore a wide variety of icons to further personalise your dashboard.</p>
</blockquote>
<p>Your default dashboard should look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772479181/6e1befbc-7bbc-4cba-ad16-163807cdc9d7.png" alt /></p>
<h3 id="heading-3-updating-the-servicesyaml-file">3. Updating the <code>services.yaml</code> File</h3>
<p>Now let’s customise the dashboard with your own services.</p>
<h4 id="heading-step-1-locate-the-servicesyaml-file-in-the-config-directory">Step 1: Locate the <code>services.yaml</code> file in the config directory:</h4>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> ~/dashboard/homepage/config &amp;&amp; nano services.yaml
</code></pre>
<h4 id="heading-step-2-add-your-services">Step 2: Add Your Services</h4>
<p>Now, you can copy and paste the following configuration into the <code>services.yaml</code> file. The example config below will organise your dashboard with categories for project management, automation, cloud services, and networking but feel free to customise it according to your needs:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">services:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">Project Management:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Asana:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/asana.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://app.asana.com</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Task</span> <span class="hljs-string">&amp;</span> <span class="hljs-string">project</span> <span class="hljs-string">management</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Jira:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/jira.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-jira-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Agile</span> <span class="hljs-string">project</span> <span class="hljs-string">tracking</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Notion:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/notion.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-notion-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Notes,</span> <span class="hljs-string">docs,</span> <span class="hljs-string">and</span> <span class="hljs-string">collaboration</span>

  <span class="hljs-bullet">-</span> <span class="hljs-string">Automation</span> <span class="hljs-string">&amp;</span> <span class="hljs-attr">Workflows:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">n8n:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/n8n.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-n8n-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Workflow</span> <span class="hljs-string">automation</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">Cloud Services:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Azure:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/azure.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://portal.azure.com</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Microsoft</span> <span class="hljs-string">cloud</span> <span class="hljs-string">platform</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Microsoft 365:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/microsoft-365.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-microsoft-365-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Cloud</span> <span class="hljs-string">productivity</span> <span class="hljs-string">suite</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">SharePoint:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/microsoft-sharepoint.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-sharepoint-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Document</span> <span class="hljs-string">management</span> <span class="hljs-string">&amp;</span> <span class="hljs-string">collaboration</span>

  <span class="hljs-bullet">-</span> <span class="hljs-string">Networking</span> <span class="hljs-string">&amp;</span> <span class="hljs-attr">Proxy:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">Nginx Proxy Manager:</span>
          <span class="hljs-attr">icon:</span> <span class="hljs-string">https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/nginx-proxy-manager.png</span>
          <span class="hljs-attr">href:</span> <span class="hljs-string">http://your-nginx-proxy-manager-link-here</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Reverse</span> <span class="hljs-string">proxy</span> <span class="hljs-string">&amp;</span> <span class="hljs-string">SSL</span> <span class="hljs-string">management</span>
</code></pre>
<h4 id="heading-step-3-save-and-close-the-file">Step 3: Save and Close the File</h4>
<p>Save and close the file (in nano: press <code>Ctrl + O</code>, <code>Enter</code> to save, then <code>Ctrl + X</code> to exit).</p>
<h4 id="heading-step-4-reload-the-page-or-restart-the-container">Step 4: Reload the page or restart the container:</h4>
<pre><code class="lang-bash"><span class="hljs-comment"># make sure you're in the homepage directory</span>
docker compose restart
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772480729/865c9845-dc82-44b3-b394-3c185a39ede5.png" alt /></p>
<p>Tools and services all neatly organised into categories.</p>
<h3 id="heading-4-adding-a-background-image">4. Adding a Background Image</h3>
<p>Homepage allows you to easily add a custom background image via the <code>settings.yaml</code> file. This is a great way to personalise your dashboard further. Follow these steps to add your background image:</p>
<h4 id="heading-step-1-locate-the-settingsyaml-file">Step 1: Locate the <code>settings.yaml</code> file:</h4>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> ~/dashboard/homepage/config &amp;&amp; nano settings.yaml
</code></pre>
<h4 id="heading-step-2-add-the-background-image-setting">Step 2: Add the Background Image Setting:</h4>
<pre><code class="lang-yaml"><span class="hljs-attr">background:</span>
  <span class="hljs-attr">image:</span> <span class="hljs-string">https://images.unsplash.com/photo-1502790671504-542ad42d5189?auto=format&amp;fit=crop&amp;w=2560&amp;q=80</span>
</code></pre>
<p>You can also adjust filters (blur, brightness, saturation) to achieve the look you want. These settings are based on Tailwind CSS classes, so you can use the values described in the <a target="_blank" href="https://tailwindcss.com/docs/filter">Tailwind CSS documentation</a>.</p>
<blockquote>
<p>P.S I’m no expert in this regard, just following the documentation <em>🙂</em></p>
</blockquote>
<p>For more detailed information on background image settings, including filter options, check out the <a target="_blank" href="https://gethomepage.dev/configs/settings/#background-image">Homepage docs</a> and <a target="_blank" href="https://unsplash.com/">Unsplash</a> (make sure to <strong>copy the image URL</strong> when referencing it in your settings.yaml file):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772482421/fb7036a6-5e34-4992-a29e-451597f9a392.png" alt /></p>
<h4 id="heading-step-3-save-and-close-the-file-1">Step 3: Save and Close the File</h4>
<h4 id="heading-step-4-restart-homepage">Step 4: Restart Homepage:</h4>
<pre><code class="lang-bash">docker compose restart
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772485021/8b8c6d09-2772-46ed-931f-b7519a1d6216.png" alt /></p>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>Just as a tidy desk improves focus, an organised digital environment boosts productivity.</p>
<p>Don’t shy away from exploring more customisations, integrations, and features to truly tailor your dashboard to fit your needs. The possibilities are endless, and with Homepage, you have the control to make your workspace as productive and personalised as you want it to be.<em>🙂</em></p>
]]></content:encoded></item><item><title><![CDATA[Part 1: The importance of a Neat and Tidy Office Space to boost Productivity and Organisation]]></title><description><![CDATA[The Impact of an Organised Workspace
Introduction
When the shift to hybrid and remote work took place during COVID, I found myself working from home more often than not. While this offered flexibility, it also presented the unexpected challenge of ke...]]></description><link>https://tech-journeys.com/the-importance-of-a-neat-and-tidy-office-space-boosting-productivity-and-organisation</link><guid isPermaLink="true">https://tech-journeys.com/the-importance-of-a-neat-and-tidy-office-space-boosting-productivity-and-organisation</guid><category><![CDATA[Productivity]]></category><category><![CDATA[Time management]]></category><category><![CDATA[stress management]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Wed, 12 Mar 2025 23:20:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772398866/5c04a844-72fc-44a3-aa87-5556648eeff4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-the-impact-of-an-organised-workspace">The Impact of an Organised Workspace</h3>
<h4 id="heading-introduction">Introduction</h4>
<p>When the shift to hybrid and remote work took place during COVID, I found myself working from home more often than not. While this offered flexibility, it also presented the unexpected challenge of keeping my workspace tidy and organised. Over time, I discovered just how much my physical environment affected my focus, productivity, and overall well-being.</p>
<p>In this blog, I’ll share my personal experience with maintaining an organised workspace, the negative impact of clutter, and how I extended this organisation into my digital workflow.</p>
<blockquote>
<p><strong>Note: Part 1</strong> is aimed at a general audience, but <strong>Part 2</strong>, which will be published in my upcoming blog, is more intended for a technical audience or anyone curious about exploring the technical side of things. In Part 2, we’ll dive into setting up <a target="_blank" href="https://gethomepage.dev/installation/docker/"><strong>Homepage</strong></a>, a self-hosted dashboard to help streamline navigation across work tools so stay tuned! 🙂</p>
</blockquote>
<h3 id="heading-why-a-tidy-office-space-matters">Why a Tidy Office Space Matters</h3>
<p>A clean workspace isn’t just about aesthetics; it directly impacts productivity and mental clarity. Here’s how keeping an organised office has personally helped me and how it can benefit you:</p>
<h4 id="heading-1-increased-productivity">1. Increased Productivity</h4>
<p>A clutter-free desk means fewer distractions, allowing for deeper focus. When everything is in its place, you don’t waste time searching for documents, cables, or notes.</p>
<h4 id="heading-2-reduced-stress-and-anxiety">2. Reduced Stress and Anxiety</h4>
<p>At one point, my workspace became overwhelming. Papers, filled with mostly scribbled notes and research books I use, began to pile up. Cables were tangled (and still are to some extent, though I’m making progress with better cable management 🙂), and my desk just felt chaotic. After decluttering, I immediately noticed a reduction in stress.</p>
<p>Studies show that cluttered environments contribute to anxiety, and I can certainly attest to that (<a target="_blank" href="https://www.verywellmind.com/how-mental-health-and-cleaning-are-connected-5097496">Verywell Mind</a>).</p>
<h4 id="heading-3-better-time-management">3. Better Time Management</h4>
<p>Once I organised my space, I realised how much time I had been wasting searching for misplaced items. Keeping things tidy naturally led to better time management.</p>
<h4 id="heading-4-improved-professionalism">4. Improved Professionalism</h4>
<p>Working remotely means being on video calls often. A clean background not only makes a strong impression but also reflects an organised approach to work.</p>
<h4 id="heading-5-better-physical-health">5. Better Physical Health</h4>
<p>Dust and clutter can lead to allergies and poor air quality. Cleaning regularly improved my workspace’s air quality, which in turn boosted my energy levels.</p>
<h3 id="heading-the-negative-impact-of-a-cluttered-office">The Negative Impact of a Cluttered Office</h3>
<p>From my experience, a disorganised office can lead to:</p>
<ul>
<li><p><strong>Reduced efficiency  -</strong> Wasting time searching for things.</p>
</li>
<li><p><strong>Mental overload  -</strong> Clutter can overwhelm your brain, making it harder to focus.</p>
</li>
<li><p><strong>Missed deadlines</strong>  -  Important tasks get buried in the chaos.</p>
</li>
<li><p><strong>Increased frustration</strong>  - A messy environment can create unnecessary stress.</p>
</li>
</ul>
<p>By tidying up my workspace(both physical and digital), I felt more in control of my day.</p>
]]></content:encoded></item><item><title><![CDATA[Runtipi: Self-Hosting Made Incredibly Simple]]></title><description><![CDATA[Why Self-Hosting Shouldn’t Be a Headache
Have you ever considered self-hosting your own apps but got overwhelmed by endless Docker commands, YAML files, and troubleshooting? You’re not alone. While the reward of getting everything to work is great, t...]]></description><link>https://tech-journeys.com/runtipi-self-hosting-made-incredibly-simple</link><guid isPermaLink="true">https://tech-journeys.com/runtipi-self-hosting-made-incredibly-simple</guid><category><![CDATA[Homelab]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Docker compose]]></category><category><![CDATA[self-hosted]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Wed, 05 Mar 2025 22:36:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772405176/0f10dc2b-cc3b-4c0c-a6d4-5511e30c1fad.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-why-self-hosting-shouldnt-be-a-headache">Why Self-Hosting Shouldn’t Be a Headache</h3>
<p>Have you ever considered self-hosting your own apps but got overwhelmed by endless Docker commands, YAML files, and troubleshooting? You’re not alone. While the reward of getting everything to work is great, the journey can be frustrating. I know the pain of trying to set up a simple service, only to hit roadblocks that eat up hours of time.</p>
<p>That’s where Runtipi comes in. It eliminates the hassle and lets you deploy self-hosted apps with ease, even if you’ve never touched Docker before(you’re missing out though 😄).</p>
<h3 id="heading-what-is-runtipi-and-why-should-you-care">What is Runtipi, and Why Should You Care?</h3>
<p>Runtipi simplifies self-hosting by handling container management, reverse proxy setup, SSL certificates, and app installations , all from an easy-to-use web dashboard. No need to get lost in config files or manually install dependencies. Just choose an app, hit install, and you’re good to go.</p>
<h3 id="heading-whos-runtipi-for-spoiler-almost-everyone">Who’s Runtipi For? (Spoiler: Almost Everyone 🙂)</h3>
<h3 id="heading-1-newbies-who-want-a-frictionless-start">1. Newbies Who Want a Frictionless Start</h3>
<p>Want to self-host without feeling like you need a degree in DevOps? Runtipi has your back.</p>
<h3 id="heading-2-techies-who-dont-want-to-waste-time">2. Techies Who Don’t Want to Waste Time</h3>
<p>You know your way around a terminal, but you don’t always have time to manually configure <code>docker-compose.yml</code> files for every app.</p>
<h3 id="heading-3-home-lab-enthusiasts-who-value-simplicity">3. Home Lab Enthusiasts Who Value Simplicity</h3>
<p>Tinkering is fun, but spending hours debugging container issues is the worst. Runtipi keeps things simple so you can spend more time <strong>USING</strong> your apps.</p>
<h3 id="heading-getting-started">Getting started:</h3>
<h3 id="heading-step-1-installing-runtipi">Step 1: Installing Runtipi</h3>
<p>Run this single command on your Linux server:</p>
<pre><code class="lang-bash">curl -L https://setup.runtipi.io | bash
</code></pre>
<h3 id="heading-step-2-open-the-web-dashboard">Step 2: Open the Web Dashboard</h3>
<p>Once installed, navigate to <a target="_blank" href="http://your-server-ip">http://your-server-ip</a> in your browser to access the Runtipi web dashboard (it uses the default HTTP protocol, so there’s no need to specify a port).</p>
<h3 id="heading-step-3-demo">Step 3: Demo</h3>
<blockquote>
<p>For a quick overview, check out the demo <a target="_blank" href="https://drive.google.com/file/d/1bv-KBvgVZq4Yty9hkOktcwBui1MgLjT4/view?usp=drive_link"><strong>here</strong></a>. Note that during this demo, I wasn’t prompted to set up an account, as I had already tested the setup prior to posting this blog. If you’re setting it up fresh, you might be asked to create an account, which is part of the usual process.</p>
</blockquote>
<h3 id="heading-step-3-deploy-an-app">Step 3: Deploy an App</h3>
<p>Choose any app from the list and install it with just one click. It’s that easy! Of course, you can always add extra layers of security if you want.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772403232/c983eeac-32ae-4a0a-911f-bb4b634b5cd1.png" alt /></p>
<p>Example of how easy it is to install an app.</p>
<h3 id="heading-runtipi-makes-self-hosting-easier-but-challenges-are-worth-embracing">Runtipi Makes Self-Hosting Easier, But Challenges are Worth Embracing</h3>
<p>While Runtipi simplifies the process of deploying self-hosted applications with its one-click install feature, it’s important to remember that there’s value in tackling challenges. <strong>Efficient workflows</strong> are essential, but <strong>embracing complex problems and finding innovative solutions also leads to growth</strong>. This setup makes it easier for everyone, from newcomers to seasoned pros, but don’t shy away from opportunities to expand your skills by tackling more intricate tasks.</p>
<h3 id="heading-ready-to-give-it-a-shot">Ready to Give It a Shot?</h3>
<p>Head over to <a target="_blank" href="https://runtipi.io/">Runtipi’s official website</a> and see for yourself. Self-hosting doesn’t have to be complicated! 🙂🕺💃</p>
]]></content:encoded></item><item><title><![CDATA[Smart Monitoring  - Get Notified About Ubuntu Updates with n8n workflows]]></title><description><![CDATA[Inspired by n8n’s official documentation, this workflow ensures your Ubuntu server stays updated with the latest software patches and security enhancements  without the hassle of manual checks.

Overview
Keeping your server secure and up to date is c...]]></description><link>https://tech-journeys.com/smart-monitoring-get-notified-about-ubuntu-updates-with-n8n</link><guid isPermaLink="true">https://tech-journeys.com/smart-monitoring-get-notified-about-ubuntu-updates-with-n8n</guid><category><![CDATA[n8n]]></category><category><![CDATA[automation]]></category><category><![CDATA[workflow]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Wed, 05 Mar 2025 03:48:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772393206/674e3310-5835-4f77-8988-d2b305380c93.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Inspired by n8n’s <a target="_blank" href="https://n8n.io/workflows/2925-send-email-if-server-has-upgradable-packages/">official documentation</a>, this workflow ensures your Ubuntu server stays updated with the latest software patches and security enhancements  without the hassle of manual checks.</p>
</blockquote>
<h4 id="heading-overview">Overview</h4>
<p>Keeping your server secure and up to date is crucial, but constantly checking for package upgrades can be time-consuming. This automated workflow streamlines the process by running a daily script that scans for available updates and instantly notifies you via email, ensuring you never miss a critical update.</p>
<h3 id="heading-how-it-works">How It Works</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772386348/35ac21e1-faff-4a3a-b1fd-a09416554941.png" alt /></p>
<p>This workflow checks for upgradable packages and sends instant email notifications.</p>
<p><strong>Daily Monitoring</strong></p>
<ul>
<li>The workflow connects to your Ubuntu server once a day and checks for any upgradable packages.</li>
</ul>
<p><strong>Instant Email Alerts</strong></p>
<ul>
<li>If updates are available, the system triggers an automatic email notification with details of the pending upgrades.</li>
</ul>
<h3 id="heading-getting-started">Getting Started</h3>
<p>Setting up this workflow requires just two key steps:</p>
<p><strong>Configuring SSH Access</strong>  -  Allow the workflow to securely connect to your Ubuntu server and check for updates.</p>
<p><strong>Setting Up Email Notifications</strong>  - Enable automated alerts by providing SMTP credentials.</p>
<h3 id="heading-1-configure-ssh-access">1. Configure SSH Access</h3>
<p>Provide your Ubuntu server’s SSH credentials so the workflow can securely check for available updates. I’ll be using a <strong>username/password</strong>, but you can also <strong>import your private key</strong> for authentication.name/password but you can import your private key as well:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772387929/deebbfa7-c6d4-4398-bc4b-170d044112bb.png" alt /></p>
<p>This command checks for packages that are ready to be upgraded.</p>
<h3 id="heading-2-set-up-email-notifications">2. Set Up Email Notifications</h3>
<p>Enter your <strong>SMTP credentials</strong> to enable the system to send real-time email alerts whenever updates are available.</p>
<h3 id="heading-testing-the-workflow">Testing the Workflow</h3>
<p>Once everything is set up, it’s time to test the workflow and ensure it’s working as expected.</p>
<h4 id="heading-1-running-the-workflow">1. Running the Workflow</h4>
<ul>
<li><p>Manually trigger the workflow in <strong>n8n</strong> or wait for the scheduled execution.</p>
</li>
<li><p>The workflow connects to your Ubuntu server and checks for available package updates.</p>
</li>
</ul>
<h4 id="heading-2-checking-the-output">2. Checking the Output</h4>
<ul>
<li><p>If upgradable packages are found, an email notification should be sent to your inbox.</p>
</li>
<li><p>Verify that the email contains a list of pending updates.</p>
</li>
</ul>
<h4 id="heading-3-confirming-success">3. Confirming Success</h4>
<ul>
<li><p><strong>SSH Connection Successful</strong>  - The workflow successfully accessed the Ubuntu server.</p>
</li>
<li><p><strong>Update Check Completed</strong>  - The script detected available upgrades.</p>
</li>
<li><p><strong>Email Notification Received</strong>  - An alert was delivered with the update details.</p>
</li>
</ul>
<p><strong>Results:</strong> The workflow ran smoothly, automatically monitoring and notifying about pending updates.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772389515/aeb95399-371b-41db-8b62-d3409941fc1e.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772391433/82215a17-da76-4c31-a1b5-43ac43a70ccc.png" alt /></p>
<p>Email containing the list of packages ready to be upgraded.</p>
<h3 id="heading-why-use-this-workflow">Why Use This Workflow?</h3>
<p><strong>Stay Secure &amp; Up to Date</strong><br />Receive instant notifications about available software updates, ensuring your server remains secure and performs optimally.</p>
<p><strong>Hands-Free Automation</strong><br />No more manual checks  -  This workflow continuously monitors and alerts you about upgrades, saving you time and effort.</p>
<p><strong>Fully Customisable</strong><br />Easily adjust the check frequency and fine-tune notification settings to match your specific needs.</p>
<p>With this <strong>n8n-powered automation</strong>, you can focus on critical tasks while keeping your Ubuntu servers secure and up to date.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>By setting up a workflow to monitor and notify you about available package upgrades, you can ensure your server remains secure and up to date.</p>
<p>This workflow is <strong>fully customisable</strong>, allowing you to adjust the frequency of checks and notification settings to fit your needs.</p>
]]></content:encoded></item><item><title><![CDATA[Automate System Monitoring & Alerting with Uptime Kuma and Freshdesk]]></title><description><![CDATA[In this guide, I will demonstrate how to set up Uptime Kuma to monitor a system, send email alerts to Freshdesk when downtime is detected, and automatically create a ticket with the appropriate priority and assignment.


This setup showcases a real-w...]]></description><link>https://tech-journeys.com/automate-system-monitoring-alerting-with-uptime-kuma-and-freshdesk</link><guid isPermaLink="true">https://tech-journeys.com/automate-system-monitoring-alerting-with-uptime-kuma-and-freshdesk</guid><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Tue, 04 Mar 2025 15:35:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772463646/5f78df6d-b44f-4384-a0cf-ceca0a854e12.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this guide, I will demonstrate how to set up Uptime Kuma to monitor a system, send email alerts to Freshdesk when downtime is detected, and automatically create a ticket with the appropriate priority and assignment.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772446909/ef937fce-6a41-41b1-ad95-f031263c3b88.gif" alt /></p>
<blockquote>
<p>This setup showcases a real-world integration that streamlines incident management by ensuring downtime alerts are promptly turned into actionable tickets, reducing manual intervention and improving response times.</p>
</blockquote>
<h3 id="heading-prerequisites">Prerequisites</h3>
<ul>
<li><p>Before we begin, ensure you have the following:</p>
</li>
<li><p><a target="_blank" href="https://docs.docker.com/engine/install/ubuntu/"><strong>Docker</strong></a> <strong>&amp;</strong> <a target="_blank" href="https://docs.docker.com/compose/install/linux/"><strong>Docker Compose</strong></a> installed on an <strong>Ubuntu 22.04 server</strong>.</p>
</li>
<li><p>A <strong>Freshdesk account</strong> (<a target="_blank" href="https://www.freshworks.com/freshdesk/lp/home/?tactic_id=6780391&amp;utm_source=google-adwords&amp;utm_medium=FD-Search-Brand-Broad-MEA-Tier-2&amp;utm_campaign=FD-Search-Brand-Broad-MEA-Tier-2&amp;utm_term=freshdesk%20plans&amp;device=c&amp;matchtype=e&amp;network=g&amp;gclid=CjwKCAiAw5W-BhAhEiwApv4goJ0heygRCG1iS9pt0HGjg7lLmOnCU9dvi_M7qGcBRFsHFMnMgY9KBhoCVfsQAvD_BwE&amp;audience=kwd-47765166336&amp;ad_id=718584053892&amp;gad_source=1">Free plan</a>  - simply  scroll to the bottom of their website to sign up).</p>
</li>
<li><p>A <strong>custom Freshdesk email address</strong> for ticket creation (e.g., <code>support@yourcompany.freshdesk.com</code>).</p>
</li>
<li><p><strong>SMTP credentials</strong> for sending emails from <strong>Uptime Kuma</strong>.</p>
</li>
</ul>
<h3 id="heading-what-is-uptime-kuma">What is Uptime Kuma?</h3>
<p>A self-hosted monitoring tool that allows you to track the uptime and performance of your <strong>websites, APIs, and services</strong>.</p>
<h3 id="heading-key-features">Key Features:</h3>
<ul>
<li><p><strong>Supports multiple monitoring options</strong>: <strong>HTTP, HTTPS, TCP, ICMP Ping, DNS</strong>, and more.</p>
</li>
<li><p><strong>Customizable alerts</strong>:</p>
</li>
<li><p><strong>Email, webhooks, Slack, Discord</strong>, etc.</p>
</li>
<li><p><strong>User-friendly web UI</strong> for viewing uptime history and logs.</p>
</li>
<li><p><strong>Multi-user support</strong> for team-based monitoring.</p>
</li>
<li><p><strong>Easy Docker deployment</strong> for quick setup.</p>
</li>
</ul>
<h3 id="heading-problem-statement">Problem Statement</h3>
<p>Manual system monitoring is <strong>inefficient,</strong> if your system goes down, you need to be notified immediately.</p>
<h3 id="heading-how-this-automation-works">How This Automation Works:</h3>
<ul>
<li><p><strong>Uptime Kuma</strong> detects <strong>downtime</strong> and sends an <strong>alert email</strong> to <strong>Freshdesk</strong>.</p>
</li>
<li><p><strong>Freshdesk</strong> automatically <strong>creates a ticket</strong> based on the alert.</p>
</li>
<li><p>An <strong>automation rule</strong> in Freshdesk ensures that:</p>
</li>
</ul>
<ol>
<li><p>The <strong>ticket priority</strong> is set to <strong>Urgent</strong>.</p>
</li>
<li><p>The <strong>ticket type</strong> is classified as an <strong>Incident</strong>.</p>
</li>
<li><p>The ticket is <strong>assigned to a specific group</strong> for streamlined handling.</p>
</li>
<li><p>The ticket is <strong>automatically assigned to a designated agent</strong>.</p>
</li>
</ol>
<p>This setup <strong>removes the need for manual intervention</strong>, ensuring that critical system outages are promptly addressed by the right team. It also <strong>enhances incident response time</strong> by guaranteeing that no downtime goes unnoticed.</p>
<h3 id="heading-step-1-deploy-uptime-kuma-with-docker-compose">Step 1: Deploy Uptime Kuma with Docker Compose</h3>
<p>Create a directory for <strong>Uptime Kuma</strong> and a <code>docker-compose.yml</code> file:</p>
<pre><code class="lang-bash">mkdir -p ~/uptime-kuma &amp;&amp; <span class="hljs-built_in">cd</span> ~/uptime-kuma
</code></pre>
<pre><code class="lang-bash">nano docker-compose.yml
</code></pre>
<p>Paste the following configuration in your <code>docker-compose.yml</code> file:</p>
<pre><code class="lang-yaml"><span class="hljs-meta">---</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">uptime-kuma:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">louislam/uptime-kuma:latest</span>
    <span class="hljs-attr">container_name:</span> <span class="hljs-string">uptime-kuma</span>
    <span class="hljs-attr">restart:</span> <span class="hljs-string">always</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">"3001:3001"</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">uptime-kuma-data:/app/data</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">TZ=Africa/Johannesburg</span> <span class="hljs-comment">#specify your own time-zone</span>
<span class="hljs-attr">volumes:</span>
<span class="hljs-attr">uptime-kuma-data:</span>
</code></pre>
<p>Save and exit (<code>CTRL+X</code>, <code>Y</code>, <code>Enter</code>), then start the container:</p>
<pre><code class="lang-bash">docker compose up -d
</code></pre>
<p>Make sure uptime kuma is running:</p>
<pre><code class="lang-bash">docker ps
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772448616/8ced382a-71c3-412d-8b48-465cd091cf75.png" alt /></p>
<p>Container status is healthy</p>
<p>Access <strong>Uptime Kuma</strong> at:<br /><code>http://&lt;your-host-ip&gt;:3001</code></p>
<p>Create your admin account:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772449990/9e01aba1-400c-49e9-a7b5-257164ba8a04.png" alt /></p>
<h3 id="heading-step-2-adding-a-system-to-monitor">Step 2: Adding a system to monitor</h3>
<ol>
<li><p>Click on the <strong>“Add New Monitor”</strong> button at the top-left.</p>
</li>
<li><p>In the <strong>“Add New Monitor”</strong> window, fill in the details:</p>
</li>
<li><p><strong>Monitor Type:</strong> Choose <code>HTTP(s)</code> for website monitoring.</p>
</li>
<li><p><strong>Name:</strong> Enter a descriptive name for your monitor (e.g., <code>Network IP Scanner</code>).</p>
</li>
<li><p><strong>URL:</strong> Enter your website URL (e.g., <code>[https://mylan.com]</code><a target="_blank" href="https://mysite.com%29.">.</a></p>
</li>
<li><p><strong>Method:</strong> Select <code>GET</code> (default).</p>
</li>
<li><p><strong>Heartbeat Interval:</strong> Set the time interval for Uptime Kuma to check your site (e.g., 30 seconds).</p>
</li>
<li><p><strong>Retries:</strong> Configure how many times Kuma should retry if the check fails.</p>
</li>
<li><p><strong>Notification Settings:</strong> Choose the method you want to use for your alerts, in this demo, I’m using Email(SMTP).</p>
</li>
<li><p><strong>Tags:</strong> (Optional) Add tags to organise your monitors.</p>
</li>
<li><p>Click <strong>“Save”</strong> to start monitoring.</p>
</li>
<li><p>The monitor should now appear in your <strong>Uptime Kuma dashboard</strong>.</p>
</li>
<li><p>If the site is online, it should show a green <strong>“UP”</strong> status(screenshot below):</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772451684/3a15effe-2af2-4d8f-a0bf-b6605b6d6fae.png" alt /></p>
<h3 id="heading-step-3-configure-notifications-email">Step 3: Configure Notifications (Email)</h3>
<ol>
<li><p>Go to <strong>Settings &gt; Notification</strong>.</p>
</li>
<li><p>Click <strong>Add New Notification</strong> and select a notification method (<strong>Email SMTP</strong>), this requires a valid user mailbox along with your SMTP provider settings.</p>
</li>
</ol>
<blockquote>
<p><strong>Note</strong>: I’ve added my Freshdesk email address in the <strong>To:</strong> field.</p>
</blockquote>
<p>3. Follow your email provider setup instructions and save the settings.</p>
<p>4. Link the notification to the service you want to monitor.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772453126/17341450-08c9-4f44-a936-c567663ca247.png" alt /></p>
<h3 id="heading-verifying-ticket-creation-after-an-outagescreenshot-below">Verifying ticket creation after an outage(screenshot below)</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772454699/d8e01af2-9d73-4c28-bd64-628a2c5a1a68.png" alt /></p>
<p>As you can see, Uptime Kuma has successfully created a ticket. However, Freshdesk applies default settings, requiring manual updates that can be easily overlooked as more tickets come in. <strong>Let’s automate this to streamline the process</strong> 😊.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772455966/25191b13-1210-4596-9278-4a7de6d34c56.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772457518/3d686f0d-f465-4482-a969-ff0d89aeb7c4.png" alt /></p>
<p>Uptime Kuma ticket created in Freshdesk with default settings.</p>
<h3 id="heading-step-4-automatically-assign-tickets-and-set-priority-to-urgent">Step 4: Automatically Assign Tickets and Set Priority to Urgent</h3>
<p>To ensure downtime alerts are handled efficiently, we’ll create an <strong>automation rule</strong> in Freshdesk to automatically assign tickets and set the appropriate priority.</p>
<h4 id="heading-steps-to-create-the-rule">Steps to Create the Rule:</h4>
<ol>
<li><p>In Freshdesk, navigate to <strong>Admin → Automations</strong>.</p>
</li>
<li><p>Click <strong>New Rule</strong> and give it a name, e.g., <strong>“Uptime Kuma Alerts”</strong>.</p>
</li>
<li><p>Apply the following <strong>conditions and actions</strong>:</p>
</li>
</ol>
<h4 id="heading-rule-configuration">Rule Configuration:</h4>
<p><strong>Event:</strong></p>
<ul>
<li>When a <strong>ticket is created.</strong></li>
</ul>
<p><strong>Conditions:</strong></p>
<p>If <strong>Requester Email</strong> is <code>*uptime_kuma@yourdomain.com*</code></p>
<ul>
<li>AND if <strong>Subject</strong> contains <code>[? Down]</code></li>
</ul>
<p><strong>Actions:</strong></p>
<ul>
<li><p>Set <strong>Type</strong> to <strong>Incident</strong></p>
</li>
<li><p>Set <strong>Priority</strong> to <strong>Urgent</strong></p>
</li>
<li><p>Assign to <strong>Group: Technical Support</strong></p>
</li>
<li><p>Assign to <strong>Agent: Luqmaan</strong></p>
</li>
</ul>
<blockquote>
<p><strong>Note:</strong> Before creating this rule, identify a <strong>consistent part of the subject line</strong> that never changes (e.g., <code>*[? Down]*</code>). First, test how Uptime Kuma formats its email subjects by allowing it to generate a ticket. Then, use that fixed pattern in your rule to ensure accuracy.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772459236/b2c181fb-2822-4022-afd1-d9da36e516cc.png" alt /></p>
<p>After previewing, saving, and enabling the rule, your configuration should look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772460448/1a95dc3d-f656-4389-b03b-3b23554dc23f.png" alt /></p>
<blockquote>
<p>You can create multiple rules to customise ticket handling for different services, ensuring that only specific alerts have predefined priorities.</p>
</blockquote>
<h3 id="heading-final-testing">Final Testing</h3>
<p>The automation is now in action. After testing, the rules worked exactly as expected where tickets were created with the correct priority, type, and assignments. Your system is now set up for seamless incident management.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772462090/9c740fd6-51c2-4545-8d60-ecdab0d926ec.png" alt /></p>
<p>Our automation rules are now in action, ensuring immediate response when a critical system goes offline.</p>
<h3 id="heading-taking-it-a-step-further">Taking It a Step Further</h3>
<p>To fully automate the incident lifecycle, feel free to create another Freshdesk automation rule that <strong>automatically closes tickets</strong> when Uptime Kuma detects the service is back online. Since Uptime Kuma raises a separate alert when the system recovers, you can use a similar rule to match the subject line and set the ticket status to <strong>Closed</strong>.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>By integrating Uptime Kuma with Freshdesk, we’ve built an <strong>automated incident management system</strong> that ensures downtime is detected, assigned, and resolved without manual intervention. This setup <strong>improves response times, reduces human error, and streamlines IT operations</strong>.</p>
<p>More importantly, these <strong>integration and automation skills</strong> are valuable across various platforms and workflows. As I continue refining my expertise, I am focused on <strong>building efficient, scalable solutions that connect and automate systems seamlessly.</strong></p>
]]></content:encoded></item><item><title><![CDATA[Setting up Google Workspace with a custom domain]]></title><description><![CDATA[What exactly is a Google workspace?
In short, Google workspace is a popular business suite consisting of world class productivity & collaboration apps and tools which includes a professional business email service that lets you use your own domain na...]]></description><link>https://tech-journeys.com/setting-up-google-workspace-with-a-custom-domain</link><guid isPermaLink="true">https://tech-journeys.com/setting-up-google-workspace-with-a-custom-domain</guid><category><![CDATA[Google]]></category><category><![CDATA[Google Workspace]]></category><category><![CDATA[dns]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Fri, 07 Jun 2024 12:48:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772431634/cd2b7bd8-0676-4ebf-b438-efeb5b30e922.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-what-exactly-is-a-google-workspace">What exactly is a Google workspace?</h3>
<p>In short, Google workspace is a popular business suite consisting of world class productivity &amp; collaboration apps and tools which includes a professional business email service that lets you use your own domain name, your own email addresses in the Google ecosystem.</p>
<p>To get started, you need to have an existing domain or you would have to purchase one from a domain registrar, however, in this guide we’ll assume you already have one.</p>
<p>Once you have our domain, head to <a target="_blank" href="https://workspace.google.com">https://workspace.google.com</a> .</p>
<p>Next, follow the on-screen prompts as seen below:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772411130/9d46f384-b483-4849-89ba-99de139676de.png" alt /></p>
<p>Create your <strong>Business name</strong>, add the <strong>Number of employees</strong> &amp; select your <strong>Region</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772412473/41e11ff9-56a5-4b59-8ef8-32db5962669b.png" alt /></p>
<p>In the next step, you’ll need to provide your <strong>contact info</strong> and then click <strong>Next</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772414108/f4a2a9fd-8530-41aa-ba71-ed91e824aa51.png" alt /></p>
<p>Since you have an existing domain, select <strong>Yes</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772415645/92ec0bde-6041-415e-98a0-68f69b812d40.png" alt /></p>
<p>You will then go ahead and add your existing domain and click <strong>Next</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772417098/4ae3fc58-dbd8-4cd3-b557-7b5bed0a72bd.png" alt /></p>
<p>As you can see, emails sent to our domain won’t be affected until you’ve set up your email with your new account:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772418315/00c3e088-524f-471b-92b0-108f82de3b89.png" alt /></p>
<p>Create a username to sign into your Google Workspace account:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772419976/8a56c7f0-6a5f-4a39-ac23-074f496085cd.png" alt /></p>
<p>After agreeing to the Ts &amp; Cs, you’ll be asked to sign into your Google workspace account.</p>
<p>Next, you’ll need to <strong>verify</strong> your Identity:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772421405/e5150eb9-9704-4a2a-b6fd-f9400f3624d4.png" alt /></p>
<p>After you’ve verified your number, agree to the Ts &amp; Cs and select the 14 day free trial which requires your credit card information.</p>
<blockquote>
<p><strong>Important note</strong>: If this is for testing purposes, I would strongly suggest setting a reminder to delete your account before the trial period expires.</p>
</blockquote>
<p>Now it’s time for the “fun” part 🙂</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772423146/99205ee2-d134-468b-9ef3-508a363bba7f.png" alt /></p>
<p>Before proceeding to step two, follow the on-screen prompt that’s instructing you to log into your Domain registrar’s website where you’ve purchased your domain from.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772424695/05803984-343d-40ba-9e00-94d8cf04cc03.png" alt /></p>
<p>Next, you’ve guessed it, you need to <strong>add Google’s MX records</strong> as per the instructions seen below under your domain:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772426640/df260b6b-ff42-4493-b505-076155c6f257.png" alt /></p>
<p>Here’s an example of what it should look like:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772428032/640a5372-45f2-412c-9c1c-05664fbc4252.png" alt /></p>
<p>As per the instructions, you need to <strong>add another MX record</strong> with the <strong>priority set to 15</strong> and the unique Verification code.</p>
<p>Once you’ve added these two entries, go back to the admin console and click <strong>Activate Gmail</strong>. If all is correct, you should see the following window and then click <strong>Finish</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772429808/245db634-e1f2-4943-b35a-9d90be817e04.png" alt /></p>
<h3 id="heading-next-steps">Next steps</h3>
<p>Now that you’ve completed setting up your Google Workspace account with your own domain, you can go ahead and create users, groups etc. and explore all the features this suite has to offer.</p>
]]></content:encoded></item><item><title><![CDATA[Safeguarding yourself and your data in the Digital Age]]></title><description><![CDATA[Practical Steps to Protect Your Digital World
As our reliance on technology grows, it becomes imperative to practice security awareness as well as implementing robust cybersecurity measures to safeguard both ourselves and our sensitive information fr...]]></description><link>https://tech-journeys.com/how-to-safeguard-yourself-and-your-data-in-the-digital-age</link><guid isPermaLink="true">https://tech-journeys.com/how-to-safeguard-yourself-and-your-data-in-the-digital-age</guid><category><![CDATA[Security]]></category><category><![CDATA[digital security]]></category><category><![CDATA[#cybersecurity]]></category><category><![CDATA[securityawareness]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Fri, 07 Jun 2024 12:29:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772437128/3c8bb5c2-f716-4e5c-b79c-37c6e121c944.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-practical-steps-to-protect-your-digital-world">Practical Steps to Protect Your Digital World</h3>
<p>As our reliance on technology grows, it becomes imperative to practice security awareness as well as implementing robust cybersecurity measures to safeguard both ourselves and our sensitive information from the ever-present threats in the cyber realm.</p>
<ul>
<li><p><strong>Practice safe browsing habits</strong>: Be cautious when clicking on links in emails and/or websites(consider looking into using a browser such as <a target="_blank" href="https://brave.com/">Brave</a> as it’s main focus is on safe and private browsing as well as blocking Ads).</p>
</li>
<li><p><strong>Be aware of phishing scams</strong>: The <a target="_blank" href="https://www.enisa.europa.eu/topics/incident-response/glossary/what-is-social-engineering">Social Engineering</a> techniques carried out by threat actors are becoming more and more sophisticated with the goal of tricking you as the target into revealing sensitive information. Be cautious of emails containing URLs or messages requesting sensitive information, especially if they originate from an unknown source.</p>
</li>
<li><p><strong>Avoid downloading attachments or software from unknown sources</strong>: When it comes to attachments, always be mindful when downloading attachments by making sure it was sent from a trusted sender(check whether you recognise the senders’ email address as well as the Display name since this can also be <a target="_blank" href="https://www.investopedia.com/terms/s/spoofing.asp">Spoofed</a>). Whether it’s from a colleague or outside your organisation, it won’t hurt contacting them first to confirm especially when you weren’t expecting any attachments. As for software downloads, make sure you’re downloading from the vendors official website.</p>
</li>
<li><p><strong>Keep both System &amp; Application Software up to date</strong>: Unpatched systems are one of the most significant sources of security vulnerabilities, and keeping your systems updated is the best way to mitigate this.</p>
</li>
<li><p><strong>Use strong and unique passwords</strong>: Ensure that your password consists of at least 12 characters long and that includes a mixture of uppercase and lowercase letters, numbers, as well as special characters. It’s extremely important that you <strong>DON’T</strong> use the same password for multiple accounts so I would strongly suggest you look into using a <a target="_blank" href="https://www.malwarebytes.com/what-is-password-manager#:~:text=A%20password%20manager%20is%20a,locked%20behind%20a%20master%20password.">Password Manager</a> to auto-generate your passwords(these password managers provides a safe way to store your passwords unless you have high levels of paranoia and prefer self-hosting your own password manager  (good luck with that 🙂 ). Some options to look at are: <a target="_blank" href="https://bitwarden.com/">Bitwarden</a>, <a target="_blank" href="https://nordpass.com/">NordPass</a> and if you’re technologically inclined then consider checking out <a target="_blank" href="https://keepass.info/">KeePass</a>.</p>
</li>
<li><p><strong>Enable multi-factor authentication(MFA)</strong>: This provides an additional layer of security to your accounts by requiring a second form of authentication, such as a code sent to your mobile device via text, or using an Authenticator app such as Twilio Authy, Microsoft Authenticator, Google Authenticator etc.</p>
</li>
<li><p><strong>Encrypt &amp; back up your data</strong>: Disk encryption acts as a safeguard, preventing unauthorised access to the contents of your drive in the event of a lost or stolen device.<br />  If your organisation uses a Cloud storage solution, ensure that you back up your data online as this could prevent dataloss and protect you from unforeseen challenges such as potential cyberattacks or hardware failures. It’s also extremely important to adhere to your organisations Compliance policies when considering to copy any work related content to your personal devices that isn’t company-owned.</p>
</li>
<li><p><strong>Have endpoint security solutions on all your devices</strong>: Antivirus software can detect and prevent malicious software from infecting your device. Keeping your antivirus software up to date and running regular scans will ensure your device is secure.</p>
</li>
<li><p><strong>Reducing your digital footprint</strong>: Be mindful about your online presence such as the personal information you share online, the platforms you use as well as the people you’re sharing it with. Avoid posting sensitive information such as your residential address or any financial information on social media.</p>
</li>
</ul>
<p>To conclude, security awareness is an important aspect of our digital lives and it’s up to us to take the necessary precautions in order to protect ourselves from the constantly evolving threat landscape. By adhering to the tips outlined above and maintaining constant vigilance, you can minimise the risk of falling victim to any form of cyberattack.</p>
]]></content:encoded></item><item><title><![CDATA[Spice up your Github profile to stand out from the rest]]></title><description><![CDATA[In this guide, we’ll explore how to create a well-crafted GitHub profile that you can use as your gateway to new opportunities and career growth. Whether you’re transitioning to a higher role in tech or aiming to inspire others, this guide will help ...]]></description><link>https://tech-journeys.com/how-to-create-your-github-profile</link><guid isPermaLink="true">https://tech-journeys.com/how-to-create-your-github-profile</guid><category><![CDATA[GitHub]]></category><category><![CDATA[profile]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Fri, 07 Jun 2024 00:55:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755773833318/959188ee-5f41-467b-8ab4-e3376717b064.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this guide, we’ll explore how to create a well-crafted GitHub profile that you can use as your gateway to new opportunities and career growth. Whether you’re transitioning to a higher role in tech or aiming to inspire others, this guide will help you create a profile that truly reflects your tech journey and capabilities.</p>
<h3 id="heading-getting-started">Getting started</h3>
<ul>
<li>In order to create a <em>special</em> repository i.e having the README.md file to appear on our Github profile, we need to ensure our repo name <strong>matches</strong> our username:</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772527189/c42c12e1-47c5-476d-81c7-d89a9377e0f0.png" alt /></p>
<ul>
<li><p>As seen in the message displayed above, we need to set the visibility of our repo to <code>Public</code>.</p>
</li>
<li><p>Add a <code>README.md</code> file to this repository which we’ll use to showcase our skills &amp; link our projects.</p>
</li>
</ul>
<p>Note: Even if you don’t have any projects to showcase yet, setting up an attractive profile is still a good starting point so let’s keep going 🙂.</p>
<ul>
<li>Click Create repository.</li>
</ul>
<p>Once done, it’s time to spice up our README.md file:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772528712/f4f5b8cf-2712-4614-9967-93cb6d27bcb2.png" alt /></p>
<p>When clicking on Edit README or the pen (🖊️) icon, you will see an auto-generated template we can use to add our info. However, if you’re looking to make it more eye-catching, I’ve included a few sites to help you generate your Github Readme according to your needs: 🙂</p>
<p><a target="_blank" href="https://profile-readme-generator.com/">Profile Readme Generator(option 1)</a></p>
<p><a target="_blank" href="https://rahuldkjain.github.io/gh-profile-readme-generator/">Profile Readme Generator(option 2)</a></p>
<p><a target="_blank" href="https://github.com/abhisheknaiidu/awesome-github-profile-readme">Profile Readme Generator(option 3)</a></p>
<p>If you want to get the image URLs or GIFs, you can use your preferred search engine or even utilise ChatGPT to help generate the proper URL that you can add to your README.md file.</p>
<p>Another useful site to check out is <a target="_blank" href="https://shields.io/badges/static-badge">Shields.io</a> to edit static badges with customised text and colors.</p>
<p>Once you’re happy, go ahead and commit the changes to see how your profile looks (this is what your potential employer would be seeing and I’m sure they would be impressed 🙂):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772530267/1b9e14af-58f6-4a4b-8c7a-812110e64efd.png" alt /></p>
<p>Github profile(preview)</p>
<p>Below is what the code looks like so please feel free to use it and customise it according to your needs:</p>
<pre><code class="lang-markdown"><span class="hljs-section"># Hi there, I'm [Your<span class="hljs-emphasis">_Name] 👋


## About Me
As a Desktop Support Manager, I am deeply motivated to progress into more technical roles within the industry whilst actively assisting others in their career transitions. With a blend of foundational and advanced experience across various tools and technologies, I am here to share my journey, skills, and projects, aiming to inspire and support anyone seeking to maximize their potential.

## 🛠 Tools &amp; Technologies

![<span class="hljs-string">AWS</span>](<span class="hljs-link">https://img.shields.io/badge/AWS-232F3E?style=for-the-badge&amp;logo=amazon-aws&amp;logoColor=white</span>)
![<span class="hljs-string">Azure</span>](<span class="hljs-link">https://img.shields.io/badge/Azure-0078D4?style=for-the-badge&amp;logo=microsoft-azure&amp;logoColor=white</span>)
![<span class="hljs-string">Google Workspace</span>](<span class="hljs-link">https://img.shields.io/badge/Google_Workspace-4285F4?style=for-the-badge&amp;logo=google&amp;logoColor=white</span>)
![<span class="hljs-string">GAM Tool</span>](<span class="hljs-link">https://img.shields.io/badge/GAM-00A82D?style=for-the-badge&amp;logoColor=white</span>)
![<span class="hljs-string">imapsync</span>](<span class="hljs-link">https://img.shields.io/badge/imapsync-24A1C1?style=for-the-badge&amp;logo=imapsync&amp;logoColor=white</span>)
![<span class="hljs-string">Zoom</span>](<span class="hljs-link">https://img.shields.io/badge/Zoom-2D8CFF?style=for-the-badge&amp;logo=zoom&amp;logoColor=white</span>)
![<span class="hljs-string">Asana</span>](<span class="hljs-link">https://img.shields.io/badge/Asana-FC636B?style=for-the-badge&amp;logo=asana&amp;logoColor=white</span>)
![<span class="hljs-string">Freshdesk</span>](<span class="hljs-link">https://img.shields.io/badge/Freshdesk-2B79D8?style=for-the-badge&amp;logo=freshdesk&amp;logoColor=white</span>)
![<span class="hljs-string">Bitdefender</span>](<span class="hljs-link">https://img.shields.io/badge/Bitdefender-FF1100?style=for-the-badge&amp;logo=bitdefender&amp;logoColor=white</span>)
![<span class="hljs-string">AnyDesk</span>](<span class="hljs-link">https://img.shields.io/badge/AnyDesk-EA1F24?style=for-the-badge&amp;logo=anydesk&amp;logoColor=white</span>)
![<span class="hljs-string">TeamViewer</span>](<span class="hljs-link">https://img.shields.io/badge/TeamViewer-0E8EE9?style=for-the-badge&amp;logo=teamviewer&amp;logoColor=white</span>)
![<span class="hljs-string">Docker</span>](<span class="hljs-link">https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&amp;logo=docker&amp;logoColor=white</span>)
![<span class="hljs-string">Python</span>](<span class="hljs-link">https://img.shields.io/badge/Python-3776AB?style=for-the-badge&amp;logo=python&amp;logoColor=white</span>)
![<span class="hljs-string">Bash</span>](<span class="hljs-link">https://img.shields.io/badge/Bash-4EAA25?style=for-the-badge&amp;logo=gnu-bash&amp;logoColor=white</span>)
![<span class="hljs-string">UniFi</span>](<span class="hljs-link">https://img.shields.io/badge/UniFi-0559C9?style=for-the-badge&amp;logo=ubiquiti&amp;logoColor=white</span>)
![<span class="hljs-string">Ubuntu</span>](<span class="hljs-link">https://img.shields.io/badge/Ubuntu-E95420?style=for-the-badge&amp;logo=ubuntu&amp;logoColor=white</span>)
![<span class="hljs-string">Debian</span>](<span class="hljs-link">https://img.shields.io/badge/Debian-A81D33?style=for-the-badge&amp;logo=debian&amp;logoColor=white</span>)
![<span class="hljs-string">Windows</span>](<span class="hljs-link">https://img.shields.io/badge/Windows_10-0078D6?style=for-the-badge&amp;logo=windows&amp;logoColor=white</span>)
![<span class="hljs-string">Windows</span>](<span class="hljs-link">https://img.shields.io/badge/Windows_11-0078D6?style=for-the-badge&amp;logo=windows&amp;logoColor=white</span>)
![<span class="hljs-string">macOS</span>](<span class="hljs-link">https://img.shields.io/badge/macOS-000000?style=for-the-badge&amp;logo=apple&amp;logoColor=white</span>)
![<span class="hljs-string">pfSense</span>](<span class="hljs-link">https://img.shields.io/badge/pfSense-336791?style=for-the-badge&amp;logo=pfsense&amp;logoColor=white</span>)
![<span class="hljs-string">OPNsense</span>](<span class="hljs-link">https://img.shields.io/badge/OPNsense-342B0E?style=for-the-badge&amp;logoColor=white</span>)
![<span class="hljs-string">Grafana</span>](<span class="hljs-link">https://img.shields.io/badge/Grafana-F46800?style=for-the-badge&amp;logo=grafana&amp;logoColor=white</span>)
![<span class="hljs-string">Zabbix</span>](<span class="hljs-link">https://img.shields.io/badge/Zabbix-00BFFF?style=for-the-badge&amp;logo=zabbix&amp;logoColor=white</span>)
![<span class="hljs-string">OpenLDAP</span>](<span class="hljs-link">https://img.shields.io/badge/OpenLDAP-2C2255?style=for-the-badge&amp;logo=openldap&amp;logoColor=white</span>)
![<span class="hljs-string">Prometheus</span>](<span class="hljs-link">https://img.shields.io/badge/Prometheus-E6522C?style=for-the-badge&amp;logo=prometheus&amp;logoColor=white</span>)
![<span class="hljs-string">Pi-hole</span>](<span class="hljs-link">https://img.shields.io/badge/Pi--hole-F60D1A?style=for-the-badge&amp;logo=pihole&amp;logoColor=white</span>)
![<span class="hljs-string">Traefik</span>](<span class="hljs-link">https://img.shields.io/badge/Traefik-24A1C1?style=for-the-badge&amp;logo=traefik&amp;logoColor=white</span>)

## 🔧 Projects
Here are some of the projects I've worked on:

### [<span class="hljs-string">Project Name</span>](<span class="hljs-link">https://github.com/yourusername/projectname</span>)
![<span class="hljs-string">Project Screenshot</span>](<span class="hljs-link">https://via.placeholder.com/600x400.png?text=Project+Screenshot</span>) <span class="xml"><span class="hljs-comment">&lt;!-- Replace with your image URL --&gt;</span></span>
- <span class="hljs-strong">**Description:**</span> A brief description of the project.
- <span class="hljs-strong">**Technologies Used:**</span> List the technologies used in the project.
- <span class="hljs-strong">**Features:**</span> Highlight key features of the project.

### [<span class="hljs-string">Another Project</span>](<span class="hljs-link">https://github.com/yourusername/anotherproject</span>)
![<span class="hljs-string">Project Screenshot</span>](<span class="hljs-link">https://via.placeholder.com/600x400.png?text=Project+Screenshot</span>) <span class="xml"><span class="hljs-comment">&lt;!-- Replace with your image URL --&gt;</span></span>
- <span class="hljs-strong">**Description:**</span> A brief description of the project.
- <span class="hljs-strong">**Technologies Used:**</span> List the technologies used in the project.
- <span class="hljs-strong">**Features:**</span> Highlight key features of the project.

## 🌱 Currently Learning
I'm currently expanding my knowledge in:
- Advanced Docker
- Cloud Security
- Python
- Working with APIs
- Powershell

## 📫 How to Reach Me

![<span class="hljs-string">Contact Me</span>](<span class="hljs-link">https://via.placeholder.com/1200x300.png?text=Contact+Me</span>) <span class="xml"><span class="hljs-comment">&lt;!-- Replace with your image URL --&gt;</span></span>

- <span class="hljs-strong">**Email:**</span> your.email@example.com
- <span class="hljs-strong">**LinkedIn:**</span> [<span class="hljs-string">Your LinkedIn Profile</span>](<span class="hljs-link">https://linkedin.com/in/yourprofile</span>)
- <span class="hljs-strong">**Twitter:**</span> [<span class="hljs-string">@yourhandle</span>](<span class="hljs-link">https://twitter.com/yourhandle</span>)
- <span class="hljs-strong">**Blog:**</span> [<span class="hljs-string">Tech-Journey</span>](<span class="hljs-link">https://yourblog.com</span>)

## 📈 GitHub Stats
![<span class="hljs-string">Your GitHub Stats</span>](<span class="hljs-link">https://github-readme-stats.vercel.app/api?username=yourusername&amp;show_icons=true&amp;theme=radical</span>)
![<span class="hljs-string">Top Languages</span>](<span class="hljs-link">https://github-readme-stats.vercel.app/api/top-langs/?username=yourusername&amp;layout=compact&amp;theme=radical</span>)

## 🏆 Achievements
![<span class="hljs-string">Achievements</span>](<span class="hljs-link">https://via.placeholder.com/1200x300.png?text=Achievements</span>) <span class="xml"><span class="hljs-comment">&lt;!-- Replace with your image URL --&gt;</span></span>
- GitHub Star
- Open Source Contributor

## 🖥️ Setup
Here are some of the tools and environments I work with:
![<span class="hljs-string">Setup</span>](<span class="hljs-link">https://via.placeholder.com/1200x300.png?text=Setup</span>) <span class="xml"><span class="hljs-comment">&lt;!-- Replace with your image URL --&gt;</span></span>

- <span class="hljs-strong">**Editors:**</span> VSCode
- <span class="hljs-strong">**Version Control:**</span> Git, GitHub, GitLab
- <span class="hljs-strong">**CI/CD:**</span> GitHub Actions

Thank you for visiting my profile! Feel free to check out my repositories and connect with me.</span></span>
</code></pre>
<h3 id="heading-well-done">Well done!</h3>
<p>We’ve covered how to enhance our Github Readme profile to showcase our skills, experience and projects effectively. It’s important to note that your README is not just a technical document but also an opportunity to share your journey which will most likely open more doors of opportunity to climb up the ladder either at your current workplace or at a new company and as an added bonus, you’re inspiring others to do the same.</p>
]]></content:encoded></item><item><title><![CDATA[Unifi Controller installation on ubuntu server 22.04 using bash scripting]]></title><description><![CDATA[Encountering hurdles during software installations can be a frustrating experience, especially when outdated instructions lead to dependency issues, errors as well as security concerns. Recently, while setting up my Unifi software on Ubuntu 22.04, I ...]]></description><link>https://tech-journeys.com/how-to-install-unifi-controller-using-bash</link><guid isPermaLink="true">https://tech-journeys.com/how-to-install-unifi-controller-using-bash</guid><category><![CDATA[Ubiquiti]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Bash]]></category><category><![CDATA[automation]]></category><category><![CDATA[sysadmin]]></category><dc:creator><![CDATA[Luqmaan Marthinus]]></dc:creator><pubDate>Thu, 06 Jun 2024 21:18:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772521363/04296b6c-3a54-4dca-a6ba-a06106e1eba8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Encountering hurdles during software installations can be a frustrating experience, especially when outdated instructions lead to dependency issues, errors as well as security concerns. Recently, while setting up my Unifi software on Ubuntu 22.04, I faced such challenges. The latest Unifi controller version required MongoDB 3.6 (up to v4.4), yet the <a target="_blank" href="https://help.ui.com/hc/en-us/articles/220066768-Updating-and-Installing-Self-Hosted-UniFi-Network-Servers-Linux">instructions</a> referred to an expired GPG key for MongoDB 3.6. Additionally, encountering <a target="_blank" href="https://askubuntu.com/questions/1403619/mongodb-install-fails-on-ubuntu-22-04-depends-on-libssl1-1-but-it-is-not-insta">dependency</a> problems added to the complexity.</p>
<p>Overcoming these obstacles required thorough research &amp; perseverance, qualities I strongly encourage you to embrace when confronted with similar challenges. Demonstrating resourcefulness in this manner can lead to successful outcomes as long as you don’t give up.</p>
<h3 id="heading-purpose">Purpose</h3>
<p>Eager to get this system up &amp; running with minimal steps involved, the goals I had in mind was being able to streamline the setup process, ensure consistency, &amp; easily reproduce the installation on multiple servers to manage my network infrastructure.</p>
<p>With that being said, let’s move on to the good stuff :)</p>
<h3 id="heading-script-overview">Script overview:</h3>
<p>Our script performs the following actions:</p>
<ul>
<li><p>Temporarily adding the Focal security repository to resolve unmet dependencies for <code>libssl1.1</code>.</p>
</li>
<li><p>Update package lists &amp; upgrades installed packages on our system.</p>
</li>
<li><p>Adds the Unifi repository to the sources list for easy access to Unifi packages.</p>
</li>
<li><p>Download the Unifi repository GPG key to verify the authenticity of the downloaded packages.</p>
</li>
<li><p>Install MongoDB 4.4 to meet the Unifi controller’s dependencies.</p>
</li>
<li><p>Install the Unifi controller package.</p>
</li>
<li><p>Initiate &amp; enables the Unifi service to ensure it runs automatically.</p>
</li>
<li><p>Verifying the status of the Unifi service to ensure it’s running properly.</p>
</li>
<li><p>Writes the output to the screen as well as a log file in our current directory.</p>
</li>
</ul>
<h3 id="heading-running-the-script">Running the script:</h3>
<p>To utilise the script, we need to:</p>
<ol>
<li><p>Copy/paste the script into your preferred text editor.</p>
</li>
<li><p>Customise the script as needed(if you know what you’re doing).</p>
</li>
<li><p>Make the script executable by running <code>chmod +x name_of_your_script[.sh](http://script.sh)</code>.</p>
</li>
<li><p>Run the script with <code>./name_of_your_script[.sh](http://script.sh)</code>.</p>
</li>
<li><p>Follow the on-screen prompts for installation.</p>
</li>
<li><p>Ensure port 8443 is open for Unifi controller access.<br /> The Unifi controller runs on port 8443 so make sure the port is open (if ufw is active, simply run <code>sudo ufw allow 8443 &amp;&amp; ufw reload</code>)</p>
</li>
</ol>
<pre><code class="lang-bash"><span class="hljs-meta">#!/bin/bash</span>

<span class="hljs-comment">#Write the output to a log file (Optional)</span>
LOG_FILE=<span class="hljs-string">"unifi_installation.log"</span>

<span class="hljs-comment">#Set the script to exit immediately if any command returns a non-zero status</span>
<span class="hljs-built_in">set</span> -e

<span class="hljs-comment">#print error message &amp; exit</span>
<span class="hljs-function"><span class="hljs-title">print_error_and_exit</span></span>() {
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Error: <span class="hljs-variable">$1</span>"</span> | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
<span class="hljs-built_in">exit</span> 1
}

<span class="hljs-comment">#check whether the command was successful.</span>
<span class="hljs-function"><span class="hljs-title">check_success</span></span>() {
<span class="hljs-keyword">if</span> [ $? -ne 0 ]; <span class="hljs-keyword">then</span>
print_error_and_exit <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span>
<span class="hljs-keyword">fi</span>
}

<span class="hljs-comment">#Here we create a function to log messages which can be very useful for troubleshooting.</span>
<span class="hljs-function"><span class="hljs-title">log_message</span></span>() {
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
}

<span class="hljs-comment">#Add Focal security repository temporarily to fix unmet dependencies.</span>
log_message <span class="hljs-string">"Adding Focal security repository temporarily to fix unmet dependencies..."</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"deb http://security.ubuntu.com/ubuntu focal-security main"</span> | sudo tee /etc/apt/sources.list.d/focal-security.list | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
check_success <span class="hljs-string">"Failed to add Focal security repository."</span>
sudo apt update
check_success <span class="hljs-string">"Failed to update packages."</span>

<span class="hljs-comment">#Install dependency(update this line if any additional dependencies are required or remove or comment it out if you already have this library installed.)</span>
sudo apt install -y libssl1.1
check_success <span class="hljs-string">"Failed to install libssl1.1."</span>
sudo rm /etc/apt/sources.list.d/focal-security.list
check_success <span class="hljs-string">"Failed to remove Focal security repository."</span>
sudo apt update
check_success <span class="hljs-string">"Failed to update packages after removing Focal security repository."</span>

<span class="hljs-comment">#Update package lists &amp; upgrade installed packages</span>
log_message <span class="hljs-string">"Updating package lists &amp; upgrading installed packages..."</span>
sudo apt update &amp;&amp; sudo apt upgrade -y | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
check_success <span class="hljs-string">"Failed to update and upgrade packages."</span>

<span class="hljs-comment">#Add Unifi's repository to sources list.</span>
log_message <span class="hljs-string">"Adding Unifi repository to sources list..."</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">'deb https://www.ui.com/downloads/unifi/debian stable ubiquiti'</span> | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.list | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
check_success <span class="hljs-string">"Failed to add Unifi's repository to sources list."</span>

<span class="hljs-comment">#Download Unifi's repository GPG key.</span>
log_message <span class="hljs-string">"Downloading Unifi's repository GPG key..."</span>
wget -qO - https://dl.ui.com/unifi/unifi-repo.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/unifi-repo.gpg | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
check_success <span class="hljs-string">"Failed to download Unifi's repository GPG key."</span>

<span class="hljs-comment"># Install MongoDB 4.4</span>
log_message <span class="hljs-string">"Installing MongoDB 4.4..."</span>
sudo apt install gnupg -y
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-org-4.4.gpg
<span class="hljs-built_in">echo</span> <span class="hljs-string">"deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse"</span> | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
sudo apt update
sudo apt install -y mongodb-org
check_success <span class="hljs-string">"Failed to install MongoDB 4.4."</span>

<span class="hljs-comment"># Install the Unifi package</span>
log_message <span class="hljs-string">"Installing UniFi..."</span>
sudo apt update &amp;&amp; sudo apt install unifi -y | tee -a <span class="hljs-string">"<span class="hljs-variable">$LOG_FILE</span>"</span>
check_success <span class="hljs-string">"Failed to install Unifi."</span>

<span class="hljs-comment"># Start &amp; enable the Unifi service</span>
log_message <span class="hljs-string">"Starting &amp; enabling Unifi service..."</span>
sudo systemctl start unifi
check_success <span class="hljs-string">"Failed to start Unifi service."</span>
sudo systemctl <span class="hljs-built_in">enable</span> unifi
check_success <span class="hljs-string">"Failed to enable Unifi service."</span>

<span class="hljs-comment"># Check the status of the Unifi service</span>
log_message <span class="hljs-string">"Checking the status of the Unifi service..."</span>
<span class="hljs-keyword">if</span> systemctl is-active --quiet unifi; <span class="hljs-keyword">then</span>
log_message <span class="hljs-string">"Unifi service is running."</span>
<span class="hljs-keyword">else</span>
print_error_and_exit <span class="hljs-string">"Unifi service failed to start."</span>
<span class="hljs-keyword">fi</span>

<span class="hljs-comment"># Output the web interface URL to the screen.</span>
log_message <span class="hljs-string">"Unifi installation complete. Browse to https://localhost:8443/ to access the Unifi web interface."</span>
</code></pre>
<h3 id="heading-output-amp-results">Output &amp; results:</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772492627/a7313e84-d660-4af9-aabf-335c8f6ef4cb.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772494888/e894a863-ccf2-41e1-8cd8-d289b9a7cd89.png" alt /></p>
<p>After our script has finished, we should see a log file in our present working directory that provides transparency throughout the installation process:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772496270/8c0ac9ac-1b04-475b-b389-9e3f6d4f9b9d.png" alt /></p>
<p>If the script executed successfully, browse to <a target="_blank" href="https://localhost:8443/">https://&lt;your_server_ip&gt;:8443/</a> to access the Unifi web interface.</p>
<h3 id="heading-configuring-the-unifi-controller">Configuring the unifi controller</h3>
<p>Since this is a Homelab, you might have your own requirements so I won’t be diving too deep but it will be enough to get you up &amp; running.</p>
<p>The first few on-screen prompts is self explanatory but I’ll add some screenshots as we go through the setup process.</p>
<h3 id="heading-step-1-setting-up-your-controller">Step 1 — Setting up your controller</h3>
<p>Complete the below &amp; click Next.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772497617/190a2a6d-a595-436e-b75f-c105aa4392e2.png" alt /></p>
<h3 id="heading-step-2-sign-in-options">Step 2 — Sign-in options</h3>
<p>Here I’ll be creating a local account but feel free to read up on the options listed below or check out: <a target="_blank" href="https://help.ui.com/hc/en-us/articles/11444786290071-Connecting-to-and-Managing-UniFi-Deployments">Connecting to and Managing Unifi Deployments</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772498906/7306b977-db03-44eb-b612-dae00184d267.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772499975/91a8c825-a5c0-4480-9f55-a4cb7e448484.png" alt /></p>
<h3 id="heading-step-3-set-credentials">Step 3 — Set credentials</h3>
<p>Click Finish after filling in your credentials.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772501524/e01bcf2c-4c82-464b-b68c-36fedb8d297b.png" alt /></p>
<h3 id="heading-step-4-configuring-our-network">Step 4 — Configuring our network</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772502911/c7eb8311-360e-436b-acef-b1f4f9ed4668.png" alt /></p>
<p>The steps below is where we’ll set our <a target="_blank" href="https://www.techtarget.com/searchmobilecomputing/definition/service-set-identifier">SSID</a>(Wifi Name) &amp; <a target="_blank" href="https://www.techopedia.com/definition/22921/wi-fi-protected-access-pre-shared-key-wpa-psk">Pre-Shared Key</a>(Wifi Password).</p>
<p>Under the <strong>Advanced</strong> options, the only change I’ve made was <em>deselecting**</em>BandSteering** as not all my devices are in close range to where my access point is placed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772504815/f7423e60-f7ad-4d68-bfed-1bec68f022af.png" alt /></p>
<p>As you scroll down, make sure to select <strong>WPA2</strong> as the <strong>security protocol</strong> or <a target="_blank" href="https://www.pandasecurity.com/en/mediacenter/wpa-vs-wpa2/">WPA2/WPA3</a> depending whether your clients supports it.</p>
<p>There’s a list of options you can read up on &amp; play around with to figure out what works best for you.</p>
<p>After successfully creating our Network, it should look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772506373/9e86e01a-4767-4fd2-8aeb-34a4d9ac194c.png" alt /></p>
<h3 id="heading-step-5-adopting-our-unifi-devices">Step 5 — Adopting our unifi devices</h3>
<p>In this example, I will be connecting a <a target="_blank" href="https://store.ui.com/us/en/collections/unifi-wifi-flagship-high-capacity/products/uap-ac-pro">UAP-AC-PRO</a>.</p>
<p>In order to <a target="_blank" href="https://help.ui.com/hc/en-us/articles/360012622613-UniFi-Device-Adoption">adopt</a> the device, we need to reset it by navigating to the left pane under <strong><em>Unifi Devices</em></strong> =&gt; <strong><em>Click to Learn More</em></strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772507866/f4d352ed-b4b0-415f-a437-58062f3750a6.png" alt /></p>
<p>After successfully resetting our Unifi device/s, proceed with the adoption process &amp; wait until it finishes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772509566/13ef6179-0dec-458d-b9b3-740643b87a57.png" alt /></p>
<p>Once done, you should see the following:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772511339/25bec62b-6c28-4683-bd0d-608e43ae19cf.png" alt /></p>
<h3 id="heading-step-6-testing-our-access-point">Step 6 — Testing our access point</h3>
<p>Use your Mobile/PC to connect to your access point &amp; run a speed test:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772512913/020e1ea3-2acc-4c3e-bb35-f86b5efca1e1.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772516517/27672907-60af-48d1-a801-e2a6c2dc76d8.png" alt /></p>
<p>To view connected devices, click on <strong>Client Devices</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772518088/4e309ed2-bddc-4dd1-928f-151a506cd300.png" alt /></p>
<p>Well done! you’ve successfully installed &amp; configured your Unifi controller as well as setting up your Unifi device/s.</p>
<h3 id="heading-step-7-assigning-a-static-ip-addressoptional">Step 7 — Assigning a static IP Address(optional)</h3>
<p>If you don’t want dynamic IPs assigned to your Unifi device/s, you can set a static one which is what I’ll be demonstrating as an optional step: There’s more options available in the <strong>Settings</strong> menu that you can adjust based on your specific requirements.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755772519268/0af5d6b4-9a5e-4ceb-96c4-e9558c5a8c67.png" alt /></p>
<p>After applying the changes, it’s safe to say our Unifi controller now stands ready for deployment &amp; offering a scalable solution to manage our network infrastructure.</p>
<h3 id="heading-final-thoughts">Final thoughts</h3>
<p>As technology evolves &amp; software dependencies change, it’s essential to adapt &amp; find innovative solutions to navigate these challenges. If you’re looking into expanding your horizons &amp; dedicated in becoming the IT wizard your were destined to be, <strong><em>DON’T</em></strong> stop learning/exploring or back down from any challenges that could help further your career.</p>
<p>By sharing my experience on the challenges I encountered, I hope to empower other IT professionals or someone looking to break into the Tech industry facing similar obstacles in their IT endeavours.</p>
<p>With the proper tools, right attitude &amp; <strong>determination</strong>, any obstacle can be overcome, paving the way to success in the ever-evolving landscape of technology.</p>
]]></content:encoded></item></channel></rss>