<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://23blocks.com/developers/blog</id>
    <title>Dev Zone Blog</title>
    <updated>2026-07-31T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://23blocks.com/developers/blog"/>
    <subtitle>Dev Zone Blog</subtitle>
    <icon>https://23blocks.com/developers/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[We're Open-Sourcing All of 23blocks]]></title>
        <id>https://23blocks.com/developers/blog/open-sourcing-23blocks</id>
        <link href="https://23blocks.com/developers/blog/open-sourcing-23blocks"/>
        <updated>2026-07-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Starting today, all 20+ 23blocks backend blocks are open source. Here's why the code was never the moat, what's released, what stays paid, and what changes for existing customers (nothing).]]></summary>
        <content type="html"><![CDATA[<p>Starting today, every 23blocks backend block — auth, CRM, files, forms, products, search, and the rest, 20+ of them — is open source.</p>
<p>Not a "community edition." Not a stripped-down version with the good parts held back. The same code that runs our shared platform, the same code a graduating customer forks and deploys on their own infrastructure. All of it, public, today.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="why">Why<a href="https://23blocks.com/developers/blog/open-sourcing-23blocks#why" class="hash-link" aria-label="Direct link to Why" title="Direct link to Why">​</a></h2>
<p>We built 23blocks because backend work is repetitive. Every product needs auth, needs file storage, needs some kind of CRM, needs forms. We got tired of building it from scratch, so we built it once, well, and reused it — first for ourselves, then for customers.</p>
<p>Somewhere in that process we had to decide what we were actually selling. For a while the honest answer was "the code," and that's a bad business to be in if you're small. Code copies for free. A well-funded competitor, or frankly a good engineering team with three weeks to spare, can replicate a backend module. What they can't replicate overnight is the part we've actually spent years on: keeping 20+ services patched, monitored, backed up, and running at 2am when something breaks that isn't your problem to fix.</p>
<p>So we stopped pretending the code was the moat. It isn't. Running it well is.</p>
<p>Once we admitted that, open-sourcing the blocks stopped being a risk and started being obvious. It's a better trust signal than any sales page: you can read the auth block's token-issuance logic before you decide whether to trust it with your users' sessions. You can see exactly what a webhook payload looks like before you build against it. You can fork it and never talk to us again if that's what you need. We'd rather earn the business that follows from that than protect a moat that was never as solid as it looked.</p>
<p>There's a practical reason too. We're a small team. We cannot out-market or out-hire the platforms with venture-scale marketing budgets. What we can do is be the most honest, most inspectable option in the category, and let the code speak for itself.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="whats-actually-released">What's actually released<a href="https://23blocks.com/developers/blog/open-sourcing-23blocks#whats-actually-released" class="hash-link" aria-label="Direct link to What's actually released" title="Direct link to What's actually released">​</a></h2>
<p>All 20+ blocks, under the <strong>Apache License 2.0</strong> — rolling into public repositories starting today.</p>
<p><strong>Why rolling, not all at once?</strong> Every repo passes a security gate before it flips public: full-history secret scanning (gitleaks, entropy detection on), credential rotation, and a clean-snapshot rebuild. The first blocks are live now; the rest follow, one by one, as each comes back clean. We'd rather open-source slowly than leak a tenant's key quickly. Track the rollout live:</p>
<ul>
<li><strong>Auth</strong> — sessions, tokens, SSO, permissions</li>
<li><strong>CRM</strong> — contacts, pipelines, activity tracking</li>
<li><strong>Files</strong> — storage, access control, delegated uploads</li>
<li><strong>Forms</strong> — schemas, surveys, appointments, public forms, subscriptions</li>
<li><strong>Content</strong> — posts, categories, comments, series</li>
<li><strong>Products</strong> — catalog, search, visual/object-detection search</li>
<li><strong>Search</strong>, <strong>Companies</strong>, <strong>Onboarding</strong>, <strong>Rewards</strong>, <strong>Sales</strong>, <strong>Wallets</strong>, <strong>Geolocation</strong>, <strong>University</strong>, <strong>Real-time/conversations</strong>, <strong>Jarvis (AI/agents)</strong>, and the rest of the catalog.</li>
</ul>
<p>Every block follows the same environment-variable contract we've always built to: no hardcoded hosts, no baked-in secrets, health-check endpoints, the works. That's not new — it's what already lets customers graduate off our shared platform onto their own infrastructure without a rewrite (more on that in our <a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure">companion post on graduating to your own infrastructure</a>). Open-sourcing the code is really just extending a portability guarantee we already honored in practice to something you can now <code>git clone</code> and verify yourself, before you've ever signed up for anything.</p>
<p>We're publishing real READMEs, not placeholder ones — how to run each block locally, what its environment variables mean, what its API surface looks like. We know from experience that an open-source repo nobody can actually run is worse than no repo at all.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="what-stays-paid--and-why-thats-the-honest-model">What stays paid — and why that's the honest model<a href="https://23blocks.com/developers/blog/open-sourcing-23blocks#what-stays-paid--and-why-thats-the-honest-model" class="hash-link" aria-label="Direct link to What stays paid — and why that's the honest model" title="Direct link to What stays paid — and why that's the honest model">​</a></h2>
<p>Open source doesn't mean we've decided to work for free, and it doesn't mean we think you should have to run this yourself if you don't want to. Three ways to use 23blocks, and only two of them cost money:</p>
<p><strong>1. Shared Platform (SaaS).</strong> Free tier to start, pay-as-you-grow after. We run the infrastructure, patch it, monitor it, back it up, and answer the pager. You get an API key and you're building in minutes. This is where most people should start.</p>
<p><strong>2. 23blocks in a Box.</strong> We deploy and maintain the same blocks on <em>your</em> cloud account — your AWS, your GCP, your Azure. You get dedicated infrastructure, your own compliance boundary, your own data residency, and we still carry the operational weight. This is what "graduating" looks like for a lot of customers: same platform, your infra, us still on call.</p>
<p><strong>3. Deployment recipes.</strong> If you want to run it entirely yourself — no relationship with us at all — the recipes and docs are there. Docker Compose, Kubernetes/Helm, Terraform, whatever your stack looks like. This is the true "just take the code" path, and now it's fully available, not gated behind a sales call.</p>
<p>The through-line: <strong>you never pay for the software. You pay for running it</strong> — either because we run it for you (options 1 and 2), or you don't pay us at all and run it yourself (option 3). That's the whole business model, said plainly, because we'd rather you understand it than have to trust a euphemism.</p>
<p>We call this open-core, and we know the term gets used to describe a lot of bait-and-switch. Ours works differently: there is no artificial feature gate in the open-source code. Nothing is crippled to force you onto a paid tier. What you pay for is genuinely operational — infrastructure, monitoring, on-call, upgrades — the stuff that's real work regardless of who's doing it.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="what-this-means-if-youre-already-a-customer">What this means if you're already a customer<a href="https://23blocks.com/developers/blog/open-sourcing-23blocks#what-this-means-if-youre-already-a-customer" class="hash-link" aria-label="Direct link to What this means if you're already a customer" title="Direct link to What this means if you're already a customer">​</a></h2>
<p>Nothing breaks. Nothing changes about your bill, your API keys, your uptime, or your support channel. If you're on the shared platform today, you're still on the shared platform today, still talking to the same team, still getting the same SLA.</p>
<p>What does change: you now have the option to look at exactly what's running under you, and — if you ever want to — to graduate to your own infrastructure with the code already public and forkable, rather than waiting on us to hand you an export. We've done this migration for real customers already; one reference case moved 11 blocks across 4 consumer surfaces in a single reversible maintenance window with zero code changes. We wrote up <a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure">what that actually involved</a>, sequences and JWT issuers and all, because we think the honest version of that story is more convincing than a marketing page would be.</p>
<p>If you're on 23blocks in a Box already, this doesn't change your contract either — you're already running dedicated infrastructure we maintain. The code you're running was always yours to fork; now the rest of the world can see it too.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="how-to-start">How to start<a href="https://23blocks.com/developers/blog/open-sourcing-23blocks#how-to-start" class="hash-link" aria-label="Direct link to How to start" title="Direct link to How to start">​</a></h2>
<ul>
<li><strong>Just want to build?</strong> Sign up for the <a href="https://23blocks.com/start" target="_blank" rel="noopener noreferrer">Shared Platform</a> — free tier, API key in minutes.</li>
<li><strong>Want dedicated infrastructure, still maintained by us?</strong> Ask about <a href="https://23blocks.com/platform/in-a-box" target="_blank" rel="noopener noreferrer">23blocks in a Box</a>.</li>
<li><strong>Want to run it yourself, no relationship required?</strong> The repos and <a href="https://23blocks.com/developers/docs/deployment/self-managed">deployment recipes</a> are public, starting today.</li>
<li><strong>Curious what's actually in the box?</strong> Browse the <a href="https://23blocks.com/developers/docs/">block documentation</a> — it's the same docs our own team uses.</li>
</ul>
<p>We think this is a better business than the one we'd have if we kept the code closed. We also think it's a more honest one. If you build something with these blocks, or find something worth fixing, we'd like to hear about it — <a href="https://23blocks.com/join-slack" target="_blank" rel="noopener noreferrer">join the Slack community</a> or open an issue on any repo.</p>
<p>— Juan Peláez, Founder &amp; CTO</p>]]></content>
        <author>
            <name>Juan Peláez</name>
            <uri>https://juanpelaez.com</uri>
        </author>
        <category label="Open Source" term="Open Source"/>
        <category label="Announcement" term="Announcement"/>
        <category label="Business Model" term="Business Model"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Graduating to Your Own Infrastructure: An Anonymized Case Study]]></title>
        <id>https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure</id>
        <link href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure"/>
        <updated>2026-07-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How one customer moved 11 backend blocks across 4 consumer surfaces off shared 23blocks and onto their own cloud, in a single reversible maintenance window — sequences, JWT issuers, and all.]]></summary>
        <content type="html"><![CDATA[<p>A customer of ours — a casting/talent platform, details anonymized — recently moved 11 backend blocks and 4 consumer surfaces off our shared platform and onto their own cloud account. Zero code rewrite. One reversible maintenance window. This is the technical writeup, because the lessons are more useful shared than kept as internal tribal knowledge.</p>
<p>Full reference: <a href="https://23blocks.com/developers/docs/platform/in-a-box">23blocks in a Box — the engineering guide</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="the-setup">The setup<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#the-setup" class="hash-link" aria-label="Direct link to The setup" title="Direct link to The setup">​</a></h2>
<p>The customer was running 11 blocks (auth, files, forms, CRM, products, search, and others) on our shared, multi-tenant platform, consumed by 4 separate surfaces — a public web app, an admin console, a mobile client, and an internal ops tool. They wanted dedicated infrastructure in their own AWS account: their own compliance boundary, their own scaling, their own on-call, no shared-tenant blast radius.</p>
<p>The property that made this tractable at all: <strong>every block is fully configured by environment variables.</strong> No hardcoded hostnames, no baked-in secrets, the same container image runs on shared or dedicated infrastructure unchanged. Graduating a block isn't a code change — it's a question of where the container runs and what URLs the consuming apps point at.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="six-phases-four-of-them-invisible-to-users">Six phases, four of them invisible to users<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#six-phases-four-of-them-invisible-to-users" class="hash-link" aria-label="Direct link to Six phases, four of them invisible to users" title="Direct link to Six phases, four of them invisible to users">​</a></h2>
<p><strong>1. Fork.</strong> Each block forked into the customer's own org. No CI secrets or shared-platform config travel with it — just the code, which they now own outright and can <code>git pull upstream</code> on their own schedule.</p>
<p><strong>2. Build.</strong> The fork's own pipeline builds images, pushes to the customer's registry. Their build, their artifacts.</p>
<p><strong>3. Provision.</strong> Dedicated single-tenant footprint stood up in their AWS account — same architecture as shared 23blocks, sized for one tenant: load balancer, container services, a Postgres instance with one database per block, Redis, S3-equivalent storage, TLS.</p>
<p><strong>4. Migrate data.</strong> Per-block tenant schemas copied whole; control rows filtered to the tenant; sequences advanced to <code>MAX(id)</code>; row parity verified table by table.</p>
<p>Phases 1–4 happened over roughly two weeks with zero user-facing impact. Phases 5 and 6 — cutting over consumers and verifying — happened inside a single maintenance window.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="the-cutover-window">The cutover window<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#the-cutover-window" class="hash-link" aria-label="Direct link to The cutover window" title="Direct link to The cutover window">​</a></h2>
<p>The flip itself is designed to be boring, because boring is reversible and exciting is not.</p>
<ol>
<li><strong>Freeze.</strong> All 4 surfaces stop writing — SPAs show a maintenance page, backends go process-down. One very-low-write internal tool took an accepted no-freeze.</li>
<li><strong>Final delta re-sync.</strong> Bring the dedicated database to an exact, current copy of the shared tenant. Reset sequences again. Verify parity again.</li>
<li><strong>URL-only flip.</strong> Every consumer's only change is a base URL: <code>*.api.us.23blocks.com</code> → <code>*.api.us.&lt;customer-domain&gt;</code>. Same API key, valid on both sides. No redeploy of application logic, no new secrets to distribute.</li>
<li><strong>New major version per app.</strong> Each of the 4 surfaces cut a new major version whose <em>only</em> diff is the URLs. New major = own infrastructure; previous major = shared. The version number alone now tells you where an app points, and rollback is "redeploy the previous major" — no rebuild required.</li>
<li><strong>Verify behind the maintenance page.</strong> Auth sign-in and token validation, the full read path, one real write — checked before anyone is let back in.</li>
<li><strong>Confirm zero shared traffic.</strong> Post-flip, the shared load balancer showed zero requests carrying that tenant's API key, across all 11 blocks. That's the actual definition of "done" — not "we flipped the switch," but "we can see nobody's using the old path anymore."</li>
</ol>
<p>Total user-facing disruption: one maintenance window. Rollback stayed armed the entire time because the shared-cloud data was never mutated during the process — flipping URLs back is always clean.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="five-lessons-that-are-now-baked-into-the-tooling">Five lessons that are now baked into the tooling<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#five-lessons-that-are-now-baked-into-the-tooling" class="hash-link" aria-label="Direct link to Five lessons that are now baked into the tooling" title="Direct link to Five lessons that are now baked into the tooling">​</a></h2>
<p>These weren't known in advance. They were found the hard way, on real graduations, and are now checks the migration tooling runs automatically.</p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="1-a-data-re-sync-silently-reverts-infra-config">1. A data re-sync silently reverts infra-config<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#1-a-data-re-sync-silently-reverts-infra-config" class="hash-link" aria-label="Direct link to 1. A data re-sync silently reverts infra-config" title="Direct link to 1. A data re-sync silently reverts infra-config">​</a></h3>
<p>The tenant's control row carries infrastructure settings alongside business data — the auth JWT issuer URL, the API base URL, webhook URLs — and on shared, all of them point at shared-cloud hosts. A naive re-sync overwrites the customer's own values with the shared ones.</p>
<p>This is exactly what happened: after a delta re-sync, the issuer URL silently reverted, the customer's auth service started minting tokens with the <em>shared</em> issuer, and every login started failing validation on the new infrastructure. Nothing was down; auth just rejected its own freshly-issued tokens.</p>
<p><strong>Fix:</strong> the migration now captures the target's infra-config columns before every re-sync and restores them immediately after. Data moves; infra config doesn't get overwritten by it.</p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="2-env-var-driven-frontends-dont-flip-when-you-deploy-code">2. Env-var-driven frontends don't flip when you deploy code<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#2-env-var-driven-frontends-dont-flip-when-you-deploy-code" class="hash-link" aria-label="Direct link to 2. Env-var-driven frontends don't flip when you deploy code" title="Direct link to 2. Env-var-driven frontends don't flip when you deploy code">​</a></h3>
<p>One of the four surfaces was a Next.js site with <code>NEXT_PUBLIC_*</code> API URLs baked in <strong>at build time</strong> from the hosting console's environment variables — not read from the repo at runtime. Shipping new application code did nothing to the URLs; the console env vars had to be updated <em>and the site rebuilt</em> before it would talk to the new infrastructure.</p>
<p>The team's other surfaces, Angular apps carrying config in <code>environment.prod.ts</code>, didn't have this trap — their config is compiled into the code artifact itself, so a new build picks it up automatically. The lesson isn't "one pattern is better," it's: <strong>know which config model each of your surfaces uses before the cutover window</strong>, because the remediation step is different for each, and you don't want to discover that live.</p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="3-postgres-sequences-dont-travel-with-pg_dump">3. Postgres sequences don't travel with <code>pg_dump</code><a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#3-postgres-sequences-dont-travel-with-pg_dump" class="hash-link" aria-label="Direct link to 3-postgres-sequences-dont-travel-with-pg_dump" title="Direct link to 3-postgres-sequences-dont-travel-with-pg_dump">​</a></h3>
<p><code>pg_dump</code> / <code>COPY</code> moves rows. It does not move sequence state. The first insert against a freshly copied table collides on a primary key that already "exists" as far as the sequence's internal counter is concerned, because that counter reset to whatever it was in the dump, not to <code>MAX(id)</code>.</p>
<p>This is easy to miss in a dry run with low write volume and then bite hard in production the moment real traffic resumes writes. <strong>Every serial sequence gets explicitly advanced to <code>MAX(id)</code> after every copy — dry run or real cutover, no exceptions.</strong></p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="4-jwt-issuer-identity-must-match-the-validating-host-exactly">4. JWT issuer identity must match the validating host, exactly<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#4-jwt-issuer-identity-must-match-the-validating-host-exactly" class="hash-link" aria-label="Direct link to 4. JWT issuer identity must match the validating host, exactly" title="Direct link to 4. JWT issuer identity must match the validating host, exactly">​</a></h3>
<p>If a token's issuer claim doesn't match the host validating it, the login bounces — not because credentials are wrong, but because the token was minted for a different identity than the one checking it. This surfaced in the same incident as lesson #1, but it's worth stating as its own rule because it applies any time issuer and validator can get out of lockstep — for instance, if backend services can't all flip in the same instant.</p>
<p><strong>Mitigation for staged rollouts:</strong> a dual-trust issuer window — accepting both the old and new issuer for a bounded period — smooths a cutover where not every service flips atomically.</p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="5-config-drift-across-blocks-is-real-and-it-will-bite-you-at-the-worst-time">5. Config drift across blocks is real and it will bite you at the worst time<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#5-config-drift-across-blocks-is-real-and-it-will-bite-you-at-the-worst-time" class="hash-link" aria-label="Direct link to 5. Config drift across blocks is real and it will bite you at the worst time" title="Direct link to 5. Config drift across blocks is real and it will bite you at the worst time">​</a></h3>
<p>Values that are supposed to be identical across every block's database — the tenant's API key, shared webhook URLs — tend to drift over the life of a tenant, usually from manual hotfixes applied to one block and never backported to the others. Verify these are consistent across every block before you plan a cutover, not during it. Discovering a mismatched API key mid-maintenance-window turns a 30-minute flip into a 3-hour one.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="why-were-writing-this-down-publicly">Why we're writing this down publicly<a href="https://23blocks.com/developers/blog/graduating-to-your-own-infrastructure#why-were-writing-this-down-publicly" class="hash-link" aria-label="Direct link to Why we're writing this down publicly" title="Direct link to Why we're writing this down publicly">​</a></h2>
<p>None of this is proprietary insight worth hoarding — it's the kind of thing every team doing a data-plane migration eventually rediscovers, usually at 2am. We'd rather you read it here first. It's also, not coincidentally, the same reason we're open-sourcing the blocks themselves: the code and the operational knowledge around it are both more valuable shared than protected, and we'd rather compete on doing this well than on being the only ones who know how.</p>
<p>If you're evaluating a similar move, the full technical reference — the complete environment-variable contract, health-check endpoints, and the six-phase process in more detail — is at <a href="https://23blocks.com/developers/docs/platform/in-a-box">23blocks in a Box</a>.</p>]]></content>
        <author>
            <name>Juan Peláez</name>
            <uri>https://juanpelaez.com</uri>
        </author>
        <category label="Engineering" term="Engineering"/>
        <category label="Infrastructure" term="Infrastructure"/>
        <category label="Open Source" term="Open Source"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[23blocks Platform Architecture: Edge Infrastructure & Environment Routing]]></title>
        <id>https://23blocks.com/developers/blog/23blocks-platform-architecture</id>
        <link href="https://23blocks.com/developers/blog/23blocks-platform-architecture"/>
        <updated>2026-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn about 23blocks' new edge infrastructure with CloudFront, Lambda@Edge, and intelligent API key-based environment routing.]]></summary>
        <content type="html"><![CDATA[<p>We're excited to share details about our platform architecture, designed to give you the best developer experience while maintaining enterprise-grade reliability.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="edge-architecture-overview">Edge Architecture Overview<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#edge-architecture-overview" class="hash-link" aria-label="Direct link to Edge Architecture Overview" title="Direct link to Edge Architecture Overview">​</a></h2>
<p>Every API request to 23blocks flows through our global edge network:</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">Your App → CloudFront Edge → Lambda@Edge → Service API</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="cloudfront-global-edge">CloudFront Global Edge<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#cloudfront-global-edge" class="hash-link" aria-label="Direct link to CloudFront Global Edge" title="Direct link to CloudFront Global Edge">​</a></h3>
<p>Requests hit one of 400+ CloudFront edge locations worldwide, ensuring sub-50ms latency regardless of where your users are located.</p>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="lambdaedge-routing">Lambda@Edge Routing<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#lambdaedge-routing" class="hash-link" aria-label="Direct link to Lambda@Edge Routing" title="Direct link to Lambda@Edge Routing">​</a></h3>
<p>Our Lambda@Edge function handles intelligent routing:</p>
<ol>
<li><strong>API Key Validation</strong> - Verifies your API key instantly</li>
<li><strong>Environment Detection</strong> - Routes to staging or production based on key prefix</li>
<li><strong>Service Routing</strong> - Directs traffic to the correct service backend</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="per-service-url-pattern">Per-Service URL Pattern<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#per-service-url-pattern" class="hash-link" aria-label="Direct link to Per-Service URL Pattern" title="Direct link to Per-Service URL Pattern">​</a></h2>
<p>Each 23blocks service has its own dedicated URL:</p>
<table><thead><tr><th>Service</th><th>URL</th></tr></thead><tbody><tr><td>Auth</td><td><code>https://auth.api.us.23blocks.com</code></td></tr><tr><td>Content</td><td><code>https://content.api.us.23blocks.com</code></td></tr><tr><td>Files</td><td><code>https://files.api.us.23blocks.com</code></td></tr><tr><td>Forms</td><td><code>https://forms.api.us.23blocks.com</code></td></tr><tr><td>CRM</td><td><code>https://crm.api.us.23blocks.com</code></td></tr><tr><td>Wallet</td><td><code>https://wallets.api.us.23blocks.com</code></td></tr><tr><td>Onboarding</td><td><code>https://onboarding.api.us.23blocks.com</code></td></tr><tr><td>Companies</td><td><code>https://companies.api.us.23blocks.com</code></td></tr><tr><td>Products</td><td><code>https://products.api.us.23blocks.com</code></td></tr><tr><td>Sales</td><td><code>https://sales.api.us.23blocks.com</code></td></tr><tr><td>Rewards</td><td><code>https://rewards.api.us.23blocks.com</code></td></tr><tr><td>Search</td><td><code>https://search.api.us.23blocks.com</code></td></tr><tr><td>University</td><td><code>https://university.api.us.23blocks.com</code></td></tr><tr><td>AI/Jarvis</td><td><code>https://jarvis.api.us.23blocks.com</code></td></tr><tr><td>Geolocation</td><td><code>https://geolocation.api.us.23blocks.com</code></td></tr><tr><td>Real Time</td><td><code>https://conversations.api.us.23blocks.com</code></td></tr><tr><td>Assets</td><td><code>https://assets.api.us.23blocks.com</code></td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="environment-routing-via-api-keys">Environment Routing via API Keys<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#environment-routing-via-api-keys" class="hash-link" aria-label="Direct link to Environment Routing via API Keys" title="Direct link to Environment Routing via API Keys">​</a></h2>
<p>One of the most powerful aspects of our architecture is API key-based environment routing. Use the <strong>same URL</strong> for all environments - your API key determines where traffic goes:</p>
<table><thead><tr><th>API Key Prefix</th><th>Environment</th></tr></thead><tbody><tr><td><code>pk_test_*</code></td><td>Staging (public key)</td></tr><tr><td><code>sk_test_*</code></td><td>Staging (secret key)</td></tr><tr><td><code>pk_live_*</code></td><td>Production (public key)</td></tr><tr><td><code>sk_live_*</code></td><td>Production (secret key)</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="benefits">Benefits<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#benefits" class="hash-link" aria-label="Direct link to Benefits" title="Direct link to Benefits">​</a></h3>
<ul>
<li><strong>Simpler Configuration</strong> - No environment-specific URLs to manage</li>
<li><strong>Safer Deployments</strong> - Just swap API keys, not URLs</li>
<li><strong>Consistent Testing</strong> - Same code paths in dev and production</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_fF9Z" id="example-usage">Example Usage<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#example-usage" class="hash-link" aria-label="Direct link to Example Usage" title="Direct link to Example Usage">​</a></h3>
<div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> create23BlocksClient </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@23blocks/sdk'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Staging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> stagingClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">create23BlocksClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  urls</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> authentication</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://auth.api.us.23blocks.com'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  apiKey</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pk_test_abc123'</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Routes to staging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Production</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> productionClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">create23BlocksClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  urls</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> authentication</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://auth.api.us.23blocks.com'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  apiKey</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pk_live_xyz789'</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Routes to production</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="monitoring-infrastructure">Monitoring Infrastructure<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#monitoring-infrastructure" class="hash-link" aria-label="Direct link to Monitoring Infrastructure" title="Direct link to Monitoring Infrastructure">​</a></h2>
<p>Every service is monitored 24/7 with:</p>
<ul>
<li><strong>Prometheus</strong> - Metrics collection and alerting</li>
<li><strong>Grafana</strong> - Real-time dashboards and visualization</li>
<li><strong>Loki</strong> - Centralized log aggregation</li>
<li><strong>Custom Health Checks</strong> - Per-service availability monitoring</li>
</ul>
<p>Our SRE team receives alerts within 30 seconds of any service degradation.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="health-check-endpoints">Health Check Endpoints<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#health-check-endpoints" class="hash-link" aria-label="Direct link to Health Check Endpoints" title="Direct link to Health Check Endpoints">​</a></h2>
<p>Each service exposes a health check endpoint:</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">GET https://{service}.api.us.23blocks.com/health</span><br></span></code></pre></div></div>
<p>Response:</p>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"healthy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"service"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"auth"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2.4.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"timestamp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-01-20T10:30:00Z"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="aws-infrastructure">AWS Infrastructure<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#aws-infrastructure" class="hash-link" aria-label="Direct link to AWS Infrastructure" title="Direct link to AWS Infrastructure">​</a></h2>
<p>Behind the scenes, each service runs on:</p>
<ul>
<li><strong>Application Load Balancers</strong> - SSL termination and routing</li>
<li><strong>ECS Fargate</strong> - Serverless container orchestration</li>
<li><strong>RDS Aurora</strong> - Multi-AZ PostgreSQL databases</li>
<li><strong>ElastiCache</strong> - Redis caching layer</li>
<li><strong>S3</strong> - Durable object storage</li>
</ul>
<p>All infrastructure is multi-AZ within the US East region, with automatic failover and daily backups.</p>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="what-this-means-for-you">What This Means for You<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#what-this-means-for-you" class="hash-link" aria-label="Direct link to What This Means for You" title="Direct link to What This Means for You">​</a></h2>
<ol>
<li><strong>Faster APIs</strong> - Edge routing reduces latency globally</li>
<li><strong>Simplified Code</strong> - One URL per service, environment via API key</li>
<li><strong>Enterprise Reliability</strong> - Multi-AZ, auto-scaling, 24/7 monitoring</li>
<li><strong>Zero DevOps</strong> - We handle all infrastructure management</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_fF9Z" id="getting-started">Getting Started<a href="https://23blocks.com/developers/blog/23blocks-platform-architecture#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>Update your SDK configuration to use the new per-service URLs:</p>
<div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> create23BlocksClient </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@23blocks/sdk'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">create23BlocksClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  urls</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> authentication</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://auth.api.us.23blocks.com'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  apiKey</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">BLOCKS_API_KEY</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// pk_test_* or pk_live_*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Check out the <a href="https://23blocks.com/developers/docs/platform/infrastructure">Infrastructure Documentation</a> for more technical details.</p>
<hr>
<p>Questions? Join our <a href="https://23blocks.com/join-slack" target="_blank" rel="noopener noreferrer">Slack community</a> or reach out to <a href="mailto:support@23blocks.com" target="_blank" rel="noopener noreferrer">support@23blocks.com</a>.</p>]]></content>
        <author>
            <name>23blocks Team</name>
            <uri>https://23blocks.com</uri>
        </author>
        <category label="Infrastructure" term="Infrastructure"/>
        <category label="architecture" term="architecture"/>
        <category label="devops" term="devops"/>
        <category label="aws" term="aws"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AWS Amplify, different build settings for different branches.]]></title>
        <id>https://23blocks.com/developers/blog/aws-amplify-different-build-settings-for-different-branches/</id>
        <link href="https://23blocks.com/developers/blog/aws-amplify-different-build-settings-for-different-branches/"/>
        <updated>2022-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Using AWS Amplify there are cases when you want to use different build settings per branch, however, as all the branches share the same build file, it could be somehow confusing.]]></summary>
        <content type="html"><![CDATA[<p>Using AWS Amplify there are cases when you want to use different build settings per branch, however, as all the branches share the same build file, it could be somehow confusing.</p>
<p>Case</p>
<p>To go around that unique build file for all branches, we are using variables and if instructions, we ended up having a config like this for one of our projects.</p>
<p>Solution</p>
<div class="language-yaml codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-yaml codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">phases</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">commands</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> if </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> "$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">AWS_BRANCH</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">" = "production" </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">; then ng build </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">configuration=production </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">optimizer; fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> if </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> "$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">AWS_BRANCH</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">" = "stage" </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">; then ng build </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">configuration=stage </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">optimizer; fi</span><br></span></code></pre></div></div>
<p>this way we can have multiple environments, with different build instructions and different URLs, from multiples branches, using only one Amplify configuration.</p>
<p>Now, that works great on a single account environment or during Proof of Concepts, once is a real project, we would need different accounts for each environment, but that’s for another day.</p>
<p>Do you have an idea and want to make a prototype to see if it is functional or sustainable over time? Then, 23blocks is the best solution that you will find to carry out this development with less effort and investment.</p>
<p>Each of our blocks is a combination of Software, Infrastructure, and Services, which are available as API Microservices. According to industry standards, these are hosted in a highly available cloud, ready for production and use.</p>
<p>Making the decision to start a software project can be complicated and intimidating. So, contact us at <a href="mailto:info@23blocks.com" target="_blank" rel="noopener noreferrer">info@23blocks.com</a> to receive free assistance from our software experts and get started on your idea.</p>
<p>There is a better way to build apps and platforms —the #23blocksway.</p>]]></content>
        <category label="it" term="it"/>
        <category label="software" term="software"/>
        <category label="project management" term="project management"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AWS ALB Health Check for multiples app or services on NGINX]]></title>
        <id>https://23blocks.com/developers/blog/aws-alb-health-check-for-multiples-app-or-services-on-nginx/</id>
        <link href="https://23blocks.com/developers/blog/aws-alb-health-check-for-multiples-app-or-services-on-nginx/"/>
        <updated>2022-02-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[There are many reasons to deploy multiple apps or services on a NGINX AWS EC2 instance, from cost savings to redundancy. In our case, we have an Application Load Balancer handling all requests to a Target Group (or Server Farm). However, in those cases is not just straightforward to set up the targets health check.]]></summary>
        <content type="html"><![CDATA[<p>There are many reasons to deploy multiple apps or services on a NGINX AWS EC2 instance, from cost savings to redundancy. In our case, we have an Application Load Balancer handling all requests to a Target Group (or Server Farm). However, in those cases is not just straightforward to set up the targets health check.</p>
<p>This post presents a solution to that scenario.</p>
<p>Case</p>
<p>Our EC2 Instance has a default website on port 80 and 2 or more apps on port 80 but with different host headers (ie: aka.mydomain.com, afa.mydomain.com, etc), so when it is time to set up the Target Group Health Check we need a solution to how to monitor each service (or app) instead of the default NGINX site.</p>
<p>Solution</p>
<p>We ended up changing our default NGIX website (etc/nginx/sites-available/default) by including the following segment:</p>
<div class="language-nginx codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-nginx codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">        location /aka {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                proxy_set_header Host aka.mydomain.com;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                proxy_pass http://127.0.0.1/health;                </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        location /afa {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                proxy_set_header Host afa.mydomain.com;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                proxy_pass http://127.0.0.1/health;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span></code></pre></div></div>
<p>Therefore, on each Target Group, we can use on the path of the Health Check “/aka” and in the other Target Group “/afa”. We are doing an NGINX redirect and adding the host header, the health route is a health check page on all our applications that returns 200 and some details of the status of our apps and services.</p>
<p>Now, Our EC2 instance running multiple NGINX apps or services can be a target on both Target Groups and the health check will do its job if one of the services is down sending requests to any other available targets.</p>
<p>Do you have an idea and want to make a prototype to see if it is functional or sustainable over time? Then, 23blocks is the best solution that you will find to carry out this development with less effort and investment.</p>
<p>Each of our blocks is a combination of Software, Infrastructure, and Services, which are available as API Microservices. According to industry standards, these are hosted in a highly available cloud, ready for production and use.</p>
<p>Making the decision to start a software project can be complicated and intimidating. So, contact us at <a href="mailto:info@23blocks.com" target="_blank" rel="noopener noreferrer">info@23blocks.com</a> to receive free assistance from our software experts and get started on your idea.</p>
<p>There is a better way to build apps and platforms —the #23blocksway.</p>]]></content>
        <category label="it" term="it"/>
        <category label="software" term="software"/>
        <category label="project management" term="project management"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The taboo of failure in IT projects]]></title>
        <id>https://23blocks.com/developers/blog/the-taboo-of-failure-in-it-projects/</id>
        <link href="https://23blocks.com/developers/blog/the-taboo-of-failure-in-it-projects/"/>
        <updated>2021-12-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In 2015, after only thirteen years, the Washington State Department of Corrections finally realized that it had inadvertently released around 3,200 inmates to early release since 2002. The error in question existed in the system used to calculate sentence reductions for good behavior, which resulted in miscalculations in the drops.]]></summary>
        <content type="html"><![CDATA[<p>In 2015, after only thirteen years, the Washington State Department of Corrections finally realized that it had inadvertently released around 3,200 inmates to early release since 2002. The error in question existed in the system used to calculate sentence reductions for good behavior, which resulted in miscalculations in the drops.</p>
<p>It is just one in a long and depressing history of software bugs. Most IT experts agree that failures happen much more often than they should. Furthermore, losses are universally free from prejudice: they occur in all countries, large and small companies, in commercial, non-profit, and government organizations, and regardless of your status or reputation. In terms of the taxpayer and shareholder money wasted, business and social costs of these failures and the investments that cannot be made run into billions of dollars a year.</p>
<p>The problem is only getting worse the more IT is used. According to a 2017 Project Management Institute (PMI) report, 14 percent of IT projects fail. However, that number only represents the total number of failures. Of the projects that did not die outright, 31 percent did not meet their targets, 43 percent exceeded their initial budgets, and 49 percent fell behind.</p>
<p>Figure 1 – Estimated percentage of failures in IT projects
The biggest tragedy is that software failures are predictable and avoidable for the most part. But, unfortunately, most organizations do not view failure prevention as an urgent matter, even though that vision risks damaging the organization and, in some cases, even destroying it. Understanding why this attitude persists is not just an academic exercise; it has enormous implications for business and society.</p>
<p>THE SOFTWARE IS EVERYWHERE. It’s what allows us to get cash from an ATM, make a phone call, and drive our cars. A typical cell phone now contains around 2 million lines of software code.</p>
<p>The amount and type of technology investments can vary between industries and sectors. For example, the average business spends nearly 4%t of revenue on information technology, and those heavily reliant on IT, such as finance companies, spend more than 7% on IT. In other words, IT is now one of the most significant corporate expenses outside of employee costs. Much of that money goes to hardware and software upgrades, software license fees, and others. But a large part goes to new software projects to create a better future for the organization and its customers.</p>
<p>Figure 2 – Causes of IT project failures
It is not uncommon to think that when a software project fails, it jeopardizes the prospects of an organization. However, if the flaw is big enough, it can steal the company’s entire future.</p>
<p>Around the world, it’s hard to say how many software projects fail or how much money is wasted as a result. However, if you define failure as the total abandonment of a project before or shortly after delivery, and if you accept a conservative 5% failure rate, billions of dollars are wasted each year on faulty software.</p>
<p>Of course, those billions do not reflect projects that exceed their budgets, which is the case with most projects. Nor does it reflect projects delivered late, which is the majority. It also doesn’t factor in the opportunity costs of starting over once a project is abandoned or the expenses of bug-ridden systems that must be repeatedly reworked.</p>
<p>There’s also the cost of litigation from customers suing vendors over poorly implemented systems. When you add up all these additional costs, the annual tab for failed and problem software runs conservatively between $ 60 billion and $ 70 billion in the United States alone.</p>
<p>But why do projects fail so often?
Among the most common factors:</p>
<p>Unrealistic or disjointed project goals
Inaccurate estimates of necessary resources
Badly defined system requirements
Poor project status report
Unmanaged risks
Inadequate communication between clients, developers, and users.
Use of immature technology
The inability to handle the complexity of the project.
Sloppy development practices
Bad project management
Stakeholder policy
Commercial pressures</p>
<p>Figure 3 – IT investment percentage based on revenue.
Most failures, however, can be attributed to a combination of technical, project management, and business decisions. Each dimension interacts with the others in complicated ways that exacerbate project risks and problems and increase the likelihood of failure.</p>
<p>The earlier the omission is detected and corrected, the better. It is like knitting a sweater. If you spot a missing stitch right after you, do it, you can untangle some thread and move on. But if you don’t catch the mistake until the end, you may need to unravel the entire sweater to redo that stitch.</p>
<p>Suppose software developers do not detect its omission until the final test of the system (or worse, until after the system has been implemented). Then, the costs incurred to correct the error are likely to be many times greater than if they had detected it while still working on the initial sales process.</p>
<p>And unlike a missing stitch on a sweater, this problem is much more challenging to identify; programmers will only see that errors appear, which can have various causes. Even after the original error is corrected, they must change other calculations and documentation and retest each step.</p>
<p>Studies have shown that software specialists spend 40 – 50% of their time on avoidable rework rather than value-added work, which works that gets done right the first time. Once a piece of software hits the field, the cost of correcting a bug can be 100 times higher than it would have been during the development stage.</p>
<p>If mistakes abound, rework can start to flood a project, like a boat in a storm. What’s worse, attempts to correct one mistake often introduce new ones. It’s like you’re rescuing that boat, but you’re also creating leaks. If too many errors occur, the cost and time required to complete the system become so great that moving on is pointless.</p>
<p>In the simplest terms, an IT project generally fails when rework exceeds the value-added work budget.
Is there are a solution?
Although it is impossible to ensure that the project is 100% perfect, there are working techniques with which any errors that may arise can be minimized to a minimum. For a project to be successful, it needs to have at least the following elements:</p>
<p>A good estimation of the times: It is crucial to plan how the project will be carried out. It is catastrophic when goals are set that are impossible to meet in the indicated times.
Reasonable quality control: Are you adding new features? Are you updating a site? Or are you directly doing it from 0? If so, you will need to thoroughly test every new piece of code you add so that you are entirely sure that it is foolproof code and will not break if someone does not understand it.
On-the-go testing: Keep in mind that there is no such thing as perfect software. You should find a starting point to go into production and start testing the new software ―the sooner, the better. As stated, finding problems at the beginning is easier to handle and less expensive than identifying them at the last minute. In addition, involving different people from the team in the testing process can allow you to have a greater scope of interaction and a more global vision.
An adequate design: In some cases (more than it should), non-conformities occur because the plan does not meet the requirements you need or, on the contrary, it becomes too complicated for a person to be able to use it without need for complex instructions
Try new technologies: It is indispensable to continuously be updated with all the technologies coming out every day to make our work much more manageable. But there are times when, by not finishing testing the different tools before using them in an actual project, we make mistakes because we do not quit using this new technology correctly.
Messy planning: Last and perhaps most important, have good planning. It is necessary to have an organized and systematic way of dividing all the phases of the work of a project so that you can be prepared for any eventuality, and it is possible to deliver the work on time.
We, as humans, cannot avoid that in all projects. There is one error in the code, but we can control how many and severe they are. Thus, we must keep in mind that avoiding mistakes is equal to or even more important than the amount of work that gets done or, in other words, quality is better than quantity.</p>
<p>Do you have an idea and want to make a prototype to see if it is functional or sustainable over time? Then, 23blocks is the best solution that you will find to carry out this development with less effort and investment.</p>
<p>Each of our blocks is a combination of Software, Infrastructure, and Services, which are available as API Microservices. According to industry standards, these are hosted in a highly available cloud, ready for production and use.</p>
<p>Making the decision to start a software project can be complicated and intimidating. So, contact us at <a href="mailto:info@23blocks.com" target="_blank" rel="noopener noreferrer">info@23blocks.com</a> to receive free assistance from our software experts and get started on your idea.</p>
<p>There is a better way to build apps and platforms —the #23blocksway.</p>]]></content>
        <category label="it" term="it"/>
        <category label="software" term="software"/>
        <category label="project management" term="project management"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why is Low Code development platform so trendy?]]></title>
        <id>https://23blocks.com/developers/blog/why-is-low-code-development-platform-so-trendy/</id>
        <link href="https://23blocks.com/developers/blog/why-is-low-code-development-platform-so-trendy/"/>
        <updated>2021-11-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We can define the low code as the practice where we start with a graphical interface, something like a skeleton of the most general and common elements between platforms when starting a new project. In this way, with all these elements already coded, we only need to make the project specifications (the colors of the platform, the functionalities, or specific pages) so that, in the end, we would end up making only approximately 20% of the code.]]></summary>
        <content type="html"><![CDATA[<p>We can define the low code as the practice where we start with a graphical interface, something like a skeleton of the most general and common elements between platforms when starting a new project. In this way, with all these elements already coded, we only need to make the project specifications (the colors of the platform, the functionalities, or specific pages) so that, in the end, we would end up making only approximately 20% of the code.</p>
<p>These products differ from no-code development platforms because they allow for a greater level of functionality with custom code rather than a drag-and-drop interface. Low-code platforms may allow users to develop applications without ever touching source code. Still, the ability to modify said code if the need arises sets these products apart from their no-code siblings. They also provide less functionality than a whole integrated development environment because they do not provide tools to create complete applications from scratch.</p>
<p>One of the best advantages of low code is that it does not require much coding knowledge (in the end, we always need to do that 20% of the code, so we need to at least have an idea of ​​how to program). Thus, the amateur or senior programmer can use the low code, which would work just as well.</p>
<p>Project low code development growth
According to a recent Forrester report, the low-code market is set to reach an annual growth rate of 40%, with spending forecasted to hit $21.2 billion by 2022. Thus, with the rise of low-code development, there will also be increasing demand for customizable integration, implementation, and consulting services.</p>
<p>Interestingly, Forrester notes that no code/low code has the potential to make software building as much as 10 times faster than traditional methods. Furthermore, they note that these platforms help advance digital business in three major ways: a) greatly decrease time needed to meet business requirements b)harness shadow IT, and c) play a key role in automating operational processes.”</p>
<p>Figure 1 – Forrester forecast
On the other hand, Gartner forecasts that no-code and low-code application platforms (NCAP/LCAP) will account for 80% of all application development by 2024. Moreover, it implies that most apps created in 2024 will be developed using tools that provide business-friendly ways to program.</p>
<p>Figure 2- Critical reasons for adopting low code solutions.
So why should low code be used?
We must go through its most essential characteristics so that we can have a clear idea of ​​what we will have in case we choose this type of development for our project:</p>
<p>Speed: As might be expected, given that the most cumbersome and lengthy parts of the project are already done (or it requires minimal changes), the platforms can be ready in much less time
Decrease in errors: The low code in its base can be trusted to be correct and without errors. That is, you start with a large amount of the project of which you should not worry about mistakes, which ensures that the final project has a higher quality
Lower Costs: Because all times are much lower (development, implementation, testing), it is understood that costs also decrease considerably
Ease to use: Because low code platforms are characterized by being relatively easy to handle, you can expect to quickly learn how to use it and get to exploit its full potential.
Reuse: There are cases in which you must do a project with templates, layouts, plugins, widgets, or modules. So, you can reuse these tools any number of times, making adding features much more effortless.
Flexibility: Finally, low code development is not limited to a single platform type. It can be used for desktop and mobile platforms.
The whole point of the low code is to beat the competition in speed without sacrificing the quality of the projects. So you can decide to stay behind with archaic practices that take time and effort beyond what is necessary or upgrade and start having projects much faster, cleaner, and more effective.</p>
<p>Do you have an idea and want to make a prototype to see if it is functional or sustainable over time? Then, 23blocks is the best solution that you will find to carry out this development with less effort and investment.</p>
<p>Each of our blocks is a combination of Software, Infrastructure, and Services, which are available as API Microservices. According to industry standards, these are hosted in a highly available cloud, ready for production and use.</p>
<p>Making the decision to start a software project can be complicated and intimidating. So, contact us at <a href="mailto:info@23blocks.com" target="_blank" rel="noopener noreferrer">info@23blocks.com</a> to receive free assistance from our software experts and get started on your idea.</p>
<p>There is a better way to build apps and platforms —the #23blocksway.</p>]]></content>
        <category label="Concepts" term="Concepts"/>
        <category label="Low Code" term="Low Code"/>
        <category label="Development" term="Development"/>
        <category label="Software" term="Software"/>
        <category label="23blocks" term="23blocks"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to create something new by reusing components?]]></title>
        <id>https://23blocks.com/developers/blog/how-to-create-something-new-by-reusing-components/</id>
        <link href="https://23blocks.com/developers/blog/how-to-create-something-new-by-reusing-components/"/>
        <updated>2021-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[At first glance, it does not seem the most logical thing. Still, throughout history, different characters have resorted to reusing already created and functional components to give life to new innovative creations.]]></summary>
        <content type="html"><![CDATA[<p>At first glance, it does not seem the most logical thing. Still, throughout history, different characters have resorted to reusing already created and functional components to give life to new innovative creations.</p>
<p>Wright Brothers and the first plane flight</p>
<p>In 1903, <a href="https://www.nps.gov/wrbr/index.htm" target="_blank" rel="noopener noreferrer">Orville and Wilbur Wright</a> made the first successful flight in the history of a heavier-than-air self-propelled airplane. Orville piloted the gasoline-powered propeller-powered biplane, which floated for 12 seconds and covered 120 feet on its maiden flight.</p>
<p>The key to success can be summed up in great creativity, the ability to think visually and turn abstract ideas into functional hardware. Both brothers possessed extraordinary technical knowledge and a sophisticated approach to solving mechanical design problems. In 1892 they opened a bicycle repair and sale workshop. Soon, they were building their own bikes. This experience, combined with the profits from their various businesses, allowed them to actively pursue their dream of making the world’s first airplane.</p>
<div class="centerImage"><p><img decoding="async" loading="lazy" alt="Docusaurus Plushie" src="https://23blocks.com/developers/assets/images/wright_company-64e13c83c4e059a386725cd76242a61b.png" width="444" height="210" class="img__Ss2"></p></div>
<p class="docs-figure-caption"></p><p>Figure 1 – Stationary letterhead for 1034 West Third Street Wright Cycle Company, letter from Wilbur to Father Milton, courtesy of the Library of Congress Archives.</p><p></p>
<p>And it is that a feat that materialized in 1903 began many years before with multiple designs, recalculations, investigations, and MVPs (minimum viable products). For all this, several prototypes and tiny models were made. These sought to test theories; therefore, they had to be built quickly and agilely to save resources and take advantage of the moment’s emotion.</p>
<p>To build and test the different gliders created before the remarkable success, they reused from bicycles, kites, and even fans. Finally, on December 17th, the first 12-second human flight was made, and that would undoubtedly mark the course of history.</p>
<div class="centerImage"><p><img decoding="async" loading="lazy" alt="Docusaurus Plushie" src="https://23blocks.com/developers/assets/images/wright_patent-a56de8a24450157f8f537f9d35d49acc.png" width="823" height="618" class="img__Ss2"></p></div>
<p class="docs-figure-caption"></p><p>Figure 2 – Wright Flyer – Airplane Blueprint. Drawing Plans for Wright Flyer, built by Orville and Wilbur Wright, is a drawing by StockPhotosArtCom, uploaded on October 20th, 2018.</p><p></p>
<p>What can we learn from the Wright brothers? First, they did not try to make an airplane from scratch. Instead, they envisioned the reuse of other objects that together formed a new and innovative functional machine. Today, planes are not made with bicycles. However, in the 1900s, a bike was an essential key to success, allowing innovators to focus on the important problem and solve it.</p>
<blockquote class="custom-quote"><p>“If you are looking for perfect safety, you will do well to sit on a fence and watch the birds; but if you really wish to learn, you must mount a machine and become acquainted with its tricks by actual trial.”</p><p>Wilbur Wright</p></blockquote>
<p>Do you have an idea and want to make a prototype to see if it is functional or sustainable over time? Then, 23blocks is the best solution that you will find to carry out this development with less effort and investment.</p>
<p>Each of our blocks is a combination of Software, Infrastructure, and Services, which are available as API Microservices. According to industry standards, these are hosted in a highly available cloud, ready for production and use.</p>
<p>Making the decision to start a software project can be complicated and intimidating. So, contact us at <a href="mailto:info@23blocks.com" target="_blank" rel="noopener noreferrer">info@23blocks.com</a> to receive free assistance from our software experts and get started on your idea.</p>
<p><strong>There is a better way to build apps and platforms —the #23blocksway</strong></p>
<small>Source: <a href="https://airandspace.si.edu/exhibitions/wright-brothers/online/who/1895/biketoflight.cfm" target="_blank" rel="noopener noreferrer">https://airandspace.si.edu/exhibitions/wright-brothers/online/who/1895/biketoflight.cfm</a></small>]]></content>
        <category label="Manifest" term="Manifest"/>
    </entry>
</feed>