<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Amin Haiqal</title>
    <description>The latest articles on DEV Community by Amin Haiqal (@amin_haiqal_2b12dc1098e18).</description>
    <link>https://dev.to/amin_haiqal_2b12dc1098e18</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899185%2F21f64187-d80c-4ef3-9f56-74fb7c0b1a8b.png</url>
      <title>DEV Community: Amin Haiqal</title>
      <link>https://dev.to/amin_haiqal_2b12dc1098e18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amin_haiqal_2b12dc1098e18"/>
    <language>en</language>
    <item>
      <title>Understanding Bastion Hosts: The Quite Gatekeepers of Modern Infrastructure</title>
      <dc:creator>Amin Haiqal</dc:creator>
      <pubDate>Sun, 03 May 2026 17:20:08 +0000</pubDate>
      <link>https://dev.to/amin_haiqal_2b12dc1098e18/understanding-bastion-hosts-the-quite-gatekeepers-of-modern-infrastructure-436m</link>
      <guid>https://dev.to/amin_haiqal_2b12dc1098e18/understanding-bastion-hosts-the-quite-gatekeepers-of-modern-infrastructure-436m</guid>
      <description>&lt;p&gt;There is a moment every developer reaches, usually late at night, when something breaks and you realize you no longer understand your own setup.&lt;/p&gt;

&lt;p&gt;At first, it feels manageable. One VPS, one IP address, one SSH command. You memorize it. You trust it. You build on top of it.&lt;/p&gt;

&lt;p&gt;Then comes the second server. And the third. Suddenly you are juggling keys, IPs, environments, and access rules. You forget which key belongs to which machine. You paste commands from old terminal history hoping they still work. You log into the wrong server and restart the wrong service.&lt;/p&gt;

&lt;p&gt;You tell yourself it is fine.&lt;/p&gt;

&lt;p&gt;Then one day you notice something you should not ignore. Failed login attempts in your logs. Unknown IPs hitting port 22. Maybe nothing happens. Maybe something does and you do not notice until later.&lt;/p&gt;

&lt;p&gt;And without realizing it, you have exposed multiple machines directly to the internet, each one listening on port 22, each one waiting.&lt;/p&gt;

&lt;p&gt;This is where the idea of a bastion host enters. Not as a luxury, but as something you wish you had set up earlier.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bastion Host: A Single Door in a Wall of Servers
&lt;/h2&gt;

&lt;p&gt;A bastion host is not complicated in concept, but it is powerful in consequence.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;single, hardened server&lt;/strong&gt; that acts as the &lt;strong&gt;only entry point&lt;/strong&gt; into your infrastructure.&lt;/p&gt;

&lt;p&gt;Instead of connecting directly to every VPS you own, you connect to one machine, the bastion, and from there, you move inward.&lt;/p&gt;

&lt;p&gt;In essence, you replace chaos with structure. Many doors become one.&lt;/p&gt;

&lt;p&gt;Without a bastion host, your access pattern looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your device → SSH → VPS A  
Your device → SSH → VPS B  
Your device → SSH → VPS C  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every server is exposed. Every server is a target.&lt;/p&gt;

&lt;p&gt;With a bastion host, the pattern changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your device → SSH → Bastion Host → SSH → Internal VPS  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, only one machine is visible to the outside world. The rest exist behind it, quiet and unreachable unless you pass through the gate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More Than It Seems
&lt;/h2&gt;

&lt;p&gt;At first glance, this may feel like an unnecessary layer. After all, connecting directly works.&lt;/p&gt;

&lt;p&gt;But infrastructure rarely fails loudly. It fails slowly, through small mistakes that stack up until something finally breaks.&lt;/p&gt;

&lt;p&gt;A bastion host reduces those risks in ways that compound over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Smaller Attack Surface
&lt;/h3&gt;

&lt;p&gt;Instead of exposing every server, you expose only one. This drastically reduces the number of entry points an attacker can probe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Centralized Control
&lt;/h3&gt;

&lt;p&gt;Authentication, access policies, and SSH keys can be managed in one place. You no longer need to remember which key is on which machine or update them one by one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observability
&lt;/h3&gt;

&lt;p&gt;A bastion host becomes a natural checkpoint. Every connection passes through it. Logging and auditing become practical instead of something you keep postponing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network Isolation
&lt;/h3&gt;

&lt;p&gt;Your internal servers no longer need public IP addresses. They can live in private networks, invisible to the outside world.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mistakes That Lead Here
&lt;/h2&gt;

&lt;p&gt;Most developers do not start with a bastion host. They arrive at it after something goes wrong.&lt;/p&gt;

&lt;p&gt;Along the way, they make choices that feel harmless in isolation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opening port 22 on every VPS&lt;/li&gt;
&lt;li&gt;Using password-based authentication because it is faster&lt;/li&gt;
&lt;li&gt;Reusing SSH keys across multiple machines&lt;/li&gt;
&lt;li&gt;Running everything as root because it is convenient&lt;/li&gt;
&lt;li&gt;Skipping monitoring because nothing has broken yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these decisions feel catastrophic on their own. But together, they create a system that is hard to reason about and easy to break.&lt;/p&gt;

&lt;p&gt;A bastion host is not just a tool. It is a way to regain control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building a Bastion: The Practical Shape
&lt;/h2&gt;

&lt;p&gt;At its simplest, setting up a bastion host involves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provisioning a dedicated VPS&lt;/li&gt;
&lt;li&gt;Hardening SSH access (key-based authentication, disabling passwords)&lt;/li&gt;
&lt;li&gt;Restricting inbound traffic via firewall rules&lt;/li&gt;
&lt;li&gt;Allowing the bastion to connect to internal servers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From there, your workflow changes. You no longer connect directly to your target machines. You pass through the bastion on purpose.&lt;/p&gt;

&lt;p&gt;It adds a step. But it also removes guesswork.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Modern Shift: The Bastion in Your Browser
&lt;/h2&gt;

&lt;p&gt;Traditionally, bastion hosts are accessed through terminal clients like PuTTY or Termius.&lt;/p&gt;

&lt;p&gt;But the way we interact with systems is changing.&lt;/p&gt;

&lt;p&gt;You are not always at your laptop. Sometimes you are on your phone, trying to fix something quickly. Maybe a service is down. Maybe a deployment failed. You open your terminal app and realize it is not set up, or the key is missing, or the connection fails.&lt;/p&gt;

&lt;p&gt;You lose time when you do not have it.&lt;/p&gt;

&lt;p&gt;This raises a practical question:&lt;/p&gt;

&lt;p&gt;What if the bastion host itself exposed a &lt;strong&gt;web-based terminal&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Not a replacement for SSH, but a layer above it.&lt;/p&gt;

&lt;p&gt;In this model, the flow evolves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Phone browser  
   ↓  
Web application (hosted on bastion)  
   ↓ (WebSocket)  
Backend service  
   ↓ (SSH)  
Target VPS  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of opening a terminal app, you open a browser. The bastion becomes not just a gateway, but an interface you can reach from anywhere.&lt;/p&gt;

&lt;p&gt;It is still SSH underneath. Still secure. Still structured. But now it is accessible when you actually need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trade-offs of This Approach
&lt;/h2&gt;

&lt;p&gt;This modern approach introduces new capabilities, but also new responsibilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You Gain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Access from any device, including mobile&lt;/li&gt;
&lt;li&gt;A centralized interface for multiple servers&lt;/li&gt;
&lt;li&gt;The ability to extend with features like session management or logging&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You Risk
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Increased complexity in your system&lt;/li&gt;
&lt;li&gt;A larger surface area at the application layer&lt;/li&gt;
&lt;li&gt;The need for strong authentication and HTTPS enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are trading simplicity in infrastructure for flexibility in access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security: The Non-Negotiable Layer
&lt;/h2&gt;

&lt;p&gt;A bastion host is only as strong as its configuration.&lt;/p&gt;

&lt;p&gt;Whether traditional or web-based, certain principles remain constant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use SSH keys instead of passwords&lt;/li&gt;
&lt;li&gt;Enforce HTTPS for any web interface&lt;/li&gt;
&lt;li&gt;Implement authentication (sessions, tokens, or similar)&lt;/li&gt;
&lt;li&gt;Apply rate limiting to prevent abuse&lt;/li&gt;
&lt;li&gt;Isolate user sessions where possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bastion is your front line. If it is weak, everything behind it is exposed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Bastion Hosts Quietly Power the World
&lt;/h2&gt;

&lt;p&gt;This pattern is not niche. It is foundational.&lt;/p&gt;

&lt;p&gt;Bastion hosts are used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud environments to access private instances&lt;/li&gt;
&lt;li&gt;Enterprise infrastructure for controlled internal access&lt;/li&gt;
&lt;li&gt;DevOps workflows where environments must remain isolated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are rarely visible in diagrams shown to end users, but they are almost always there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing: From Convenience to Intentional Design
&lt;/h2&gt;

&lt;p&gt;At the beginning, direct access feels faster. Simpler. Easier.&lt;/p&gt;

&lt;p&gt;But as systems grow, that convenience turns into confusion. You forget what is exposed, what is protected, and what is safe.&lt;/p&gt;

&lt;p&gt;A bastion host introduces a boundary. A place where access is deliberate instead of accidental.&lt;/p&gt;

&lt;p&gt;It does not remove complexity. It gives you a way to manage it.&lt;/p&gt;

&lt;p&gt;And over time, that difference matters more than anything else.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on Practice
&lt;/h2&gt;

&lt;p&gt;This exploration is not purely theoretical.&lt;/p&gt;

&lt;p&gt;It is the foundation for an open-source project I am building, &lt;strong&gt;Axelyn Bastion&lt;/strong&gt;, a lightweight, web-based bastion host designed for practical, mobile-friendly access to VPS environments.&lt;/p&gt;

&lt;p&gt;If you're interested in following the project, exploring updates, or seeing how this idea evolves in practice, you can visit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://axelyn.com/" rel="noopener noreferrer"&gt;https://axelyn.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is not to reinvent SSH, but to make it reachable when you actually need it.&lt;/p&gt;

&lt;p&gt;Because the real problem is not connecting to your servers.&lt;/p&gt;

&lt;p&gt;It is being able to do it when things are already going wrong.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7swfkkzt1oiphyrwo66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7swfkkzt1oiphyrwo66.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Thought This Was a Payment Problem. I Was Wrong.</title>
      <dc:creator>Amin Haiqal</dc:creator>
      <pubDate>Thu, 30 Apr 2026 14:41:00 +0000</pubDate>
      <link>https://dev.to/amin_haiqal_2b12dc1098e18/i-thought-this-was-a-payment-problem-i-was-wrong-5636</link>
      <guid>https://dev.to/amin_haiqal_2b12dc1098e18/i-thought-this-was-a-payment-problem-i-was-wrong-5636</guid>
      <description>&lt;p&gt;&lt;code&gt;prev article&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9" class="crayons-story__hidden-navigation-link"&gt;Building a Strata Finance System (Because the Current Way Isn’t Working)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/amin_haiqal_2b12dc1098e18" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899185%2F21f64187-d80c-4ef3-9f56-74fb7c0b1a8b.png" alt="amin_haiqal_2b12dc1098e18 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/amin_haiqal_2b12dc1098e18" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Amin Haiqal
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Amin Haiqal
                
              
              &lt;div id="story-author-preview-content-3587772" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/amin_haiqal_2b12dc1098e18" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899185%2F21f64187-d80c-4ef3-9f56-74fb7c0b1a8b.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Amin Haiqal&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9" id="article-link-3587772"&gt;
          Building a Strata Finance System (Because the Current Way Isn’t Working)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  What I Learned After Trying to Model Strata Finance Properly
&lt;/h2&gt;

&lt;p&gt;When I first started thinking about this problem, I assumed it was simple.&lt;/p&gt;

&lt;p&gt;Strata finance is just about tracking payments, right?&lt;/p&gt;

&lt;p&gt;Who paid, who didn’t, and how much is outstanding.&lt;/p&gt;

&lt;p&gt;But the moment I tried to model it properly, that assumption broke down.&lt;/p&gt;




&lt;h2&gt;
  
  
  It’s Not a Payment Problem
&lt;/h2&gt;

&lt;p&gt;At first glance, it feels like the main job is to record money:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create charges&lt;/li&gt;
&lt;li&gt;record payments&lt;/li&gt;
&lt;li&gt;calculate balances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That part is straightforward.&lt;/p&gt;

&lt;p&gt;The real complexity shows up when you try to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why is this unit still overdue?&lt;/li&gt;
&lt;li&gt;Did they already send payment?&lt;/li&gt;
&lt;li&gt;Did someone follow up?&lt;/li&gt;
&lt;li&gt;What happened last week?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s when you realize:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not just about money.&lt;br&gt;&lt;br&gt;
It’s about tracking what is happening over time.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Thinking in Terms of One Unit
&lt;/h2&gt;

&lt;p&gt;To simplify things, I stopped thinking about the entire system.&lt;/p&gt;

&lt;p&gt;I focused on just one unit.&lt;/p&gt;

&lt;p&gt;Let’s say Unit A-12.&lt;/p&gt;

&lt;p&gt;Every month, something predictable happens.&lt;/p&gt;

&lt;p&gt;A new charge is created.&lt;/p&gt;

&lt;p&gt;That charge represents what the unit owes for that month.&lt;/p&gt;

&lt;p&gt;So far, nothing complicated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Payments Come In
&lt;/h2&gt;

&lt;p&gt;At some point, the resident makes a payment.&lt;/p&gt;

&lt;p&gt;But here’s where things start to get messy in real life.&lt;/p&gt;

&lt;p&gt;Payments don’t always match what is owed.&lt;/p&gt;

&lt;p&gt;Someone might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pay partially&lt;/li&gt;
&lt;li&gt;pay for multiple months at once&lt;/li&gt;
&lt;li&gt;send the wrong amount&lt;/li&gt;
&lt;li&gt;send proof without clear reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system cannot immediately assume the payment is valid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So instead of marking it as “paid”, the system has to pause.&lt;/p&gt;

&lt;p&gt;The payment exists, but it is &lt;strong&gt;waiting to be verified&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This small detail turns out to be very important.&lt;/p&gt;

&lt;p&gt;Because this is where confusion usually starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Payment, Multiple Charges
&lt;/h2&gt;

&lt;p&gt;Another thing I didn’t expect at first:&lt;/p&gt;

&lt;p&gt;A single payment is rarely clean.&lt;/p&gt;

&lt;p&gt;If a unit owes for three months and pays one lump sum, that payment needs to be split across multiple charges.&lt;/p&gt;

&lt;p&gt;So the system has to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which charge is being paid first?&lt;/li&gt;
&lt;li&gt;how much goes to each one?&lt;/li&gt;
&lt;li&gt;what is still left unpaid?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is something spreadsheets struggle with.&lt;/p&gt;

&lt;p&gt;Because it’s not just a list anymore.&lt;/p&gt;

&lt;p&gt;It’s a relationship.&lt;/p&gt;




&lt;h2&gt;
  
  
  The System Is Actually a Timeline
&lt;/h2&gt;

&lt;p&gt;The biggest shift in thinking came from this realization:&lt;/p&gt;

&lt;p&gt;A unit is not just “paid” or “unpaid”.&lt;/p&gt;

&lt;p&gt;It goes through states.&lt;/p&gt;

&lt;p&gt;At different points in time, the same unit can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;newly billed&lt;/li&gt;
&lt;li&gt;overdue&lt;/li&gt;
&lt;li&gt;followed up&lt;/li&gt;
&lt;li&gt;promised to pay&lt;/li&gt;
&lt;li&gt;partially paid&lt;/li&gt;
&lt;li&gt;disputed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And these states don’t replace each other.&lt;/p&gt;

&lt;p&gt;They build on top of each other.&lt;/p&gt;

&lt;p&gt;Which means the system needs to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what happened&lt;/li&gt;
&lt;li&gt;when it happened&lt;/li&gt;
&lt;li&gt;who did it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not just the final number.&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow-Ups Matter More Than Numbers
&lt;/h2&gt;

&lt;p&gt;Something else became very clear.&lt;/p&gt;

&lt;p&gt;Most systems focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;charges&lt;/li&gt;
&lt;li&gt;payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But very few track what admins actually do.&lt;/p&gt;

&lt;p&gt;In reality, collections depend heavily on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calling residents&lt;/li&gt;
&lt;li&gt;sending reminders&lt;/li&gt;
&lt;li&gt;negotiating payments&lt;/li&gt;
&lt;li&gt;escalating cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this is not recorded, the system is incomplete.&lt;/p&gt;

&lt;p&gt;Because the most important question becomes unanswered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What action has been taken so far?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Not Everyone Pays the Same Way
&lt;/h2&gt;

&lt;p&gt;Another layer of complexity is human.&lt;/p&gt;

&lt;p&gt;Some residents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;always pay on time&lt;/li&gt;
&lt;li&gt;occasionally delay&lt;/li&gt;
&lt;li&gt;never pay unless chased&lt;/li&gt;
&lt;li&gt;request installment plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treating all units the same doesn’t work.&lt;/p&gt;

&lt;p&gt;So the system needs a way to &lt;strong&gt;categorize behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not to label people—but to prioritize attention.&lt;/p&gt;

&lt;p&gt;Because not all overdue cases are equal.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Tracking to Clarity
&lt;/h2&gt;

&lt;p&gt;At this point, I realized I wasn’t just building a way to record data.&lt;/p&gt;

&lt;p&gt;I was trying to build something that answers a simple but powerful question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who needs attention right now?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s very different from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who hasn’t paid?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the first leads to action.&lt;/p&gt;

&lt;p&gt;The second just creates a list.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Changed for Me
&lt;/h2&gt;

&lt;p&gt;This shifted how I think about the system entirely.&lt;/p&gt;

&lt;p&gt;Instead of focusing on features, I’m now focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how information flows&lt;/li&gt;
&lt;li&gt;how states change over time&lt;/li&gt;
&lt;li&gt;how decisions are made&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system is less about storing data, and more about &lt;strong&gt;making the current situation clear&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This Is Going
&lt;/h2&gt;

&lt;p&gt;Now that the workflow is clearer, the next step is to translate this into something structured.&lt;/p&gt;

&lt;p&gt;A system that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;track charges and payments properly&lt;/li&gt;
&lt;li&gt;handle partial and multi-month payments&lt;/li&gt;
&lt;li&gt;record follow-ups consistently&lt;/li&gt;
&lt;li&gt;classify units automatically&lt;/li&gt;
&lt;li&gt;surface what needs attention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s what I’ll be building next.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You’re Dealing With This
&lt;/h2&gt;

&lt;p&gt;If you’ve ever had to manage collections, follow up on overdue payments, or piece together financial records manually, you’ve probably seen some version of this.&lt;/p&gt;

&lt;p&gt;I’m actively building in this space, and also open to working with teams that want to improve their internal systems.&lt;/p&gt;

&lt;p&gt;You can reach me here:&lt;br&gt;
&lt;a href="https://axelyn.com/" rel="noopener noreferrer"&gt;https://axelyn.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building a Strata Finance System (Because the Current Way Isn’t Working)</title>
      <dc:creator>Amin Haiqal</dc:creator>
      <pubDate>Wed, 29 Apr 2026 17:29:30 +0000</pubDate>
      <link>https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9</link>
      <guid>https://dev.to/amin_haiqal_2b12dc1098e18/building-a-strata-finance-system-because-the-current-way-isnt-working-3j9</guid>
      <description>&lt;p&gt;There’s a quiet kind of chaos in how many strata communities manage their finances.&lt;/p&gt;

&lt;p&gt;On the surface, everything looks fine. There’s a spreadsheet somewhere. Numbers are filled in. Rows are coloured. Someone is “handling it.”&lt;/p&gt;

&lt;p&gt;But the moment you start asking simple questions, things begin to fall apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who still owes money?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Since when?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did they already send their payment?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was it verified?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who followed up last?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No one has a clean answer. Not immediately. Not confidently.&lt;/p&gt;

&lt;p&gt;Because the answers don’t live in one place.&lt;/p&gt;

&lt;p&gt;They live across spreadsheets, WhatsApp conversations, emails, and memory. Sometimes in someone’s head. Sometimes nowhere at all.&lt;/p&gt;




&lt;p&gt;Over time, the system becomes less of a system and more of a patchwork.&lt;/p&gt;

&lt;p&gt;A spreadsheet is used to track balances. Another column is used to mark who has paid. Colours are introduced to signal urgency. &lt;strong&gt;Green means safe&lt;/strong&gt;. &lt;strong&gt;Red means overdue&lt;/strong&gt;. &lt;strong&gt;Yellow means “needs attention,”&lt;/strong&gt; whatever that means this week.&lt;/p&gt;

&lt;p&gt;Meanwhile, payment proofs arrive through WhatsApp. Screenshots, bank slips, forwarded messages. They get buried under new messages, lost in group chats, or forgotten entirely.&lt;/p&gt;

&lt;p&gt;Follow-ups happen, but inconsistently. One admin calls. Another sends a message. Someone promises to pay. There is no record of it. A week later, the cycle repeats.&lt;/p&gt;

&lt;p&gt;Residents dispute their balances. Admins double-check manually. Time is spent verifying things that should have been obvious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing is technically broken. But nothing is reliable either.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;At some point, it becomes clear that the problem is not effort.&lt;/p&gt;

&lt;p&gt;It’s structure.&lt;/p&gt;

&lt;p&gt;So I started thinking about what a better system would look like; not in terms of features, but in terms of clarity. What if there was a single place that could answer, without hesitation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who owes what, since when, and what has been done about it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question became the starting point.&lt;/p&gt;




&lt;p&gt;The system I’m building is not meant to replace people. It’s meant to replace the uncertainty around the work they are already doing.&lt;/p&gt;

&lt;p&gt;Every charge—maintenance fees, sinking funds, penalties—should be recorded clearly, tied to a specific unit, with a known due date.&lt;/p&gt;

&lt;p&gt;Every payment should be traceable. If a resident submits proof, it should not disappear into a chat thread. It should enter a flow. It should be verified or rejected. It should leave a trace.&lt;/p&gt;

&lt;p&gt;Balances should not require manual calculation. They should exist as a result of what has already happened—charges issued, payments verified. Nothing more, nothing less.&lt;/p&gt;

&lt;p&gt;Overdue units should not be guessed. They should be classified automatically, based on how long they’ve been unpaid, or whether they’ve ever paid at all.&lt;/p&gt;

&lt;p&gt;And follow-ups; arguably the most human part of the process—should still be tracked. Not to control people, but to ensure continuity. So that when someone looks at a unit, they don’t just see numbers. They see history.&lt;/p&gt;

&lt;p&gt;What was said. What was promised. What comes next.&lt;/p&gt;




&lt;p&gt;Some residents won’t be able to pay everything at once. That’s reality.&lt;/p&gt;

&lt;p&gt;So the system needs to handle that too. Installment plans shouldn’t live in scattered notes or informal agreements. They should be structured, visible, and measurable. Something both sides can understand.&lt;/p&gt;




&lt;p&gt;When all of this comes together, the goal isn’t complexity.&lt;/p&gt;

&lt;p&gt;It’s clarity.&lt;/p&gt;

&lt;p&gt;A dashboard that doesn’t try to impress, but simply shows what matters. Total outstanding amounts. Overdue units. Payments waiting to be verified. The cases that need attention today.&lt;/p&gt;

&lt;p&gt;Not more data. Just the right data, in the right place.&lt;/p&gt;




&lt;p&gt;This is not just software for the sake of it.&lt;/p&gt;

&lt;p&gt;It’s an attempt to turn a fragmented, manual workflow into something dependable. Something that reduces doubt instead of adding to it.&lt;/p&gt;




&lt;p&gt;I’m building this in public because I don’t think this problem is unique.&lt;/p&gt;

&lt;p&gt;If you’ve ever had to manage payments, follow up on overdue accounts, or piece together financial records from different places, you’ve probably seen some version of this.&lt;/p&gt;

&lt;p&gt;So this is as much an exploration as it is a build.&lt;/p&gt;

&lt;p&gt;What does a reliable workflow actually look like?&lt;/p&gt;

&lt;p&gt;And how do we get there, step by step?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;That’s what I’ll be figuring out next.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;If you're dealing with this kind of workflow and trying to make it more reliable, I’d be interested to hear how you’re approaching it.&lt;/p&gt;

&lt;p&gt;I’m currently building in this space, and also open to working with teams that want to improve their internal systems.&lt;/p&gt;

&lt;p&gt;You can reach me here:&lt;br&gt;
&lt;a href="https://axelyn.com/" rel="noopener noreferrer"&gt;https://axelyn.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From Inventory Chaos to a Real-Time Command Center</title>
      <dc:creator>Amin Haiqal</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:40:32 +0000</pubDate>
      <link>https://dev.to/amin_haiqal_2b12dc1098e18/from-inventory-chaos-to-a-real-time-command-center-12gl</link>
      <guid>https://dev.to/amin_haiqal_2b12dc1098e18/from-inventory-chaos-to-a-real-time-command-center-12gl</guid>
      <description>&lt;p&gt;&lt;strong&gt;A system that doesn’t exist yet but probably should&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;At some point, every growing eCommerce system hits a strange wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not traffic.&lt;/li&gt;
&lt;li&gt;Not sales.&lt;/li&gt;
&lt;li&gt;Not even infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just… &lt;strong&gt;inventory&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;It usually starts small.&lt;/p&gt;

&lt;p&gt;A product goes out of stock on one platform but still shows as available on another. An order slips through. Then another. Someone from operations jumps in, exports a CSV, fixes a number, uploads it back and by then those problems solved.&lt;/p&gt;

&lt;p&gt;Until it happens again.&lt;/p&gt;

&lt;p&gt;Now imagine that but across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shopify&lt;/li&gt;
&lt;li&gt;multiple marketplaces&lt;/li&gt;
&lt;li&gt;warehouse systems&lt;/li&gt;
&lt;li&gt;internal spreadsheets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And none of them agree with each other.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Moment Things Stop Making Sense
&lt;/h3&gt;

&lt;p&gt;There’s a point where teams stop asking:&lt;/p&gt;

&lt;p&gt;“Why is this wrong?”&lt;/p&gt;

&lt;p&gt;…and start asking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which system is correct?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s when you know the problem isn’t operational anymore. It’s &lt;strong&gt;architectural&lt;/strong&gt;. Because under the surface, every system believes it owns the truth.&lt;/p&gt;




&lt;h3&gt;
  
  
  A System With Too Many Writers
&lt;/h3&gt;

&lt;p&gt;Inventory updates are happening everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orders reduce stock in Shopify&lt;/li&gt;
&lt;li&gt;warehouses adjust quantities&lt;/li&gt;
&lt;li&gt;internal tools override numbers manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each system writes data and none of them coordinate. From a distributed systems perspective, this is almost guaranteed to fail not because of bugs but because &lt;strong&gt;there is no single authority over state&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Hidden Cost
&lt;/h3&gt;

&lt;p&gt;At first, it looks like noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a few mismatches&lt;/li&gt;
&lt;li&gt;some manual fixes&lt;/li&gt;
&lt;li&gt;occasional refunds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But over time, the system starts leaking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;overselling becomes normal&lt;/li&gt;
&lt;li&gt;stockouts happen while inventory still exists&lt;/li&gt;
&lt;li&gt;operations slow down&lt;/li&gt;
&lt;li&gt;decisions rely on outdated data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, growth itself becomes constrained. Not by demand. But by uncertainty.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Shift in Thinking
&lt;/h3&gt;

&lt;p&gt;At this point, it’s tempting to patch things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add more sync jobs&lt;/li&gt;
&lt;li&gt;increase polling frequency&lt;/li&gt;
&lt;li&gt;introduce more scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those don’t solve the problem. They just move it around. The real shift comes from re-framing the question and not&lt;/p&gt;

&lt;p&gt;“How do we sync systems better?”&lt;/p&gt;

&lt;p&gt;but&lt;/p&gt;

&lt;p&gt;“What if no system is allowed to update inventory directly?”&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That’s where this design begins.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  A Different Approach: Treat Everything as an Event
&lt;/h3&gt;

&lt;p&gt;Instead of letting systems mutate inventory freely:&lt;/p&gt;

&lt;p&gt;Every change becomes an event.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an order is placed&lt;/li&gt;
&lt;li&gt;stock is adjusted&lt;/li&gt;
&lt;li&gt;a warehouse update happens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing updates inventory directly anymore. Everything reports that something happened. &lt;/p&gt;

&lt;p&gt;That single constraint changes everything.&lt;/p&gt;




&lt;h3&gt;
  
  
  Introducing a Controlled Flow
&lt;/h3&gt;

&lt;p&gt;Once everything is an event, the system can enforce a pipeline:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Event → Queue → Processing → Central State → Sync Out&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead of chaos, there is flow we can do and instead of conflict, there is order we can make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the Real Control Happens?&lt;/strong&gt;&lt;br&gt;
At the center of this design is something intentionally restrictive:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A central inventory service.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It has one job which is maintain the only version of truth. No marketplace. No warehouse system. No internal tool. None of them are allowed to write inventory directly anymore. They can only send signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But why This Matters More Than It Seems?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn’t just about structure, it’s about control over state because once there is only one place where inventory can change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;conflicts can be detected&lt;/li&gt;
&lt;li&gt;duplicates can be ignored&lt;/li&gt;
&lt;li&gt;rules can be enforced consistently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, consistency is mostly luck. Speaking reality, things will still go wrong even with this design. The system has to deal with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicate events&lt;/li&gt;
&lt;li&gt;delayed updates&lt;/li&gt;
&lt;li&gt;simultaneous changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the pipeline need to include safeguards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;idempotency (so the same event doesn’t apply twice)&lt;/li&gt;
&lt;li&gt;timestamps (to reject stale updates)&lt;/li&gt;
&lt;li&gt;versioning (to prevent overwrites)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Subtle but Important Flip
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
Every system tries to stay in sync with every other system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
Every system stays in sync with one system.&lt;/p&gt;

&lt;p&gt;That shift reduces complexity more than any optimization ever could then something interesting happens.Everything will became simpler once the central state is reliable&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syncing outward is predictable&lt;/li&gt;
&lt;li&gt;dashboards reflect reality&lt;/li&gt;
&lt;li&gt;operations stop guessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the first time, someone can ask:&lt;/p&gt;

&lt;p&gt;“What’s our stock right now?”&lt;/p&gt;

&lt;p&gt;…and actually trust the answer.&lt;/p&gt;

&lt;p&gt;This System Doesn’t Exist (Yet)&lt;/p&gt;

&lt;p&gt;This is still a design.&lt;/p&gt;

&lt;p&gt;A proposal. A system on paper.&lt;/p&gt;

&lt;p&gt;But the problems it addresses are very real and I believe very common.&lt;/p&gt;

&lt;p&gt;And the pattern shows up everywhere, whenever multiple systems are allowed to mutate the same data independently…&lt;/p&gt;

&lt;p&gt;…consistency becomes an accident.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;Most inventory problems don’t come from bad tools. They come from systems that were never designed to agree. Fixing that isn’t about adding more logic, it’s about deciding very clearly where truth is allowed to live.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>distributedsystems</category>
      <category>webdev</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
