<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Scalable Solutions]]></title><description><![CDATA[Scalable Solutions]]></description><link>https://blog.jainamshah.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 30 May 2026 04:27:10 GMT</lastBuildDate><atom:link href="https://blog.jainamshah.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Serverless Frontend Showdown: Why We Picked AWS Amplify (and When to Consider Cloudflare)]]></title><description><![CDATA[I was unexpectedly called into a meeting with my manager, tech lead, and the cloud team to decide on a frontend deployment strategy for a new project. As a recent graduate, I needed to quickly research and recommend a solution. We evaluated offerings...]]></description><link>https://blog.jainamshah.dev/serverless-frontend-showdown-why-we-picked-aws-amplify-and-when-to-consider-cloudflare</link><guid isPermaLink="true">https://blog.jainamshah.dev/serverless-frontend-showdown-why-we-picked-aws-amplify-and-when-to-consider-cloudflare</guid><category><![CDATA[Case Study]]></category><category><![CDATA[serverless]]></category><category><![CDATA[AWS]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[server]]></category><dc:creator><![CDATA[Jainam Shah]]></dc:creator><pubDate>Wed, 09 Jul 2025 14:46:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Am6pBe2FpJw/upload/3bbe6878de2d3f7b9eb716ac8f1ca987.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was unexpectedly called into a meeting with my manager, tech lead, and the cloud team to decide on a frontend deployment strategy for a new project. As a recent graduate, I needed to quickly research and recommend a solution. We evaluated offerings from AWS, Google Cloud, and other providers. In consultation with the cloud team, we decided to test AWS Amplify, a fully-managed frontend hosting service.</p>
<h2 id="heading-aws-amplify-global-frontend-hosting-with-cicd">AWS Amplify: Global Frontend Hosting with CI/CD</h2>
<p>AWS Amplify is designed to <strong>deploy web frameworks globally</strong> with minimal setup. It supports major JavaScript frameworks (React, Angular, Vue, Next.js, Nuxt, etc.) and popular static-site generators (Gatsby, Hugo, Jekyll, etc.). Amplify uses the <strong>Amazon CloudFront CDN</strong> under the hood, giving global distribution and low latency for user requests.</p>
<p>Most importantly, Amplify ties directly into Git: once you connect a repository, Amplify <strong>automatically builds and deploys each commit</strong>, handling build scripts, CDN invalidations, and SSL certificates without extra configuration. Features like zero-configuration Next.js or Nuxt deployments mean we can push new features to high-traffic web applications in just a few clicks.</p>
<p>In practice, setting up Amplify was straightforward. I simply linked our GitHub repo to an Amplify app, defined the build command, and Amplify did the rest. This “full-stack deployment environment” really is <strong>serverless</strong> - no servers to choose or configure. Under the hood Amplify runs on AWS services (CodePipeline/CodeDeploy for CI/CD, S3 for storage, and CloudFront for CDN) but presents them as a single platform.</p>
<p>One nice bonus is cost: Amplify’s pricing is <strong>pay-as-you-go</strong> with no long-term contracts. The generous free tier (12 months of 1,000 build minutes, 5 GB storage, 15 GB serving, etc. per month) often means small projects cost effectively $0/month. For example, you can host an Amplify app for absolutely $0 if traffic is low.</p>
<p>In short, Amplify gave us a <strong>managed, low-overhead frontend CI/CD pipeline</strong>, global CDN distribution, and pricing that scales with usage.</p>
<h2 id="heading-server-based-vs-serverless-deployment">Server-Based vs. Serverless Deployment</h2>
<p>Before Amplify, we might have hosted the app on an EC2 or similar server. With a traditional server-based setup, we would pay a fixed price for each server instance (even when idle) and manually configure scaling and caching (e.g. setting up autoscaling groups and CloudFront distributions ourselves).</p>
<p>In contrast, Amplify is <strong>serverless</strong>: there are no persistent servers to manage, and AWS automatically handles scalability and caching. Amplify (like S3+CloudFront) is a serverless service; it requires less maintenance and management than self-hosted servers. We essentially relinquished control of infrastructure in exchange for ease-of-use.</p>
<p><strong>Key differences include:</strong></p>
<ul>
<li><p><strong>Cost model</strong>: EC2 servers cost a fixed hourly rate, whereas Amplify charges only for actual build time, storage, and data transferred.</p>
</li>
<li><p><strong>Scaling</strong>: With EC2, you set up autoscaling manually, while Amplify (via CloudFront) scales automatically across AWS’s global network.</p>
</li>
<li><p><strong>Maintenance</strong>: EC2 requires OS and runtime updates. Amplify is fully managed - AWS provisions SSL and server infrastructure, so our team can focus on code.</p>
</li>
</ul>
<p>Using Amplify eliminated many ops tasks. We found that for a frontend (mostly static assets and pre-built code), the <strong>serverless approach was ideal -</strong> it avoided paying for idle capacity and handled CDN and TLS out of the box.</p>
<h2 id="heading-frontend-vs-backend-serverless-trade-offs">Frontend vs. Backend: Serverless Trade-offs</h2>
<p>In general, serverless architectures (like Amplify, AWS Lambda, Cloudflare Workers, etc.) bring <strong>automatic scaling</strong> and <strong>cost-per-use</strong>. The main drawback is usually <strong>cold-start latency</strong> - backend functions may pause when idle and take time to spin up. For high-traffic or real-time backend APIs, that can be a concern.</p>
<p>However, <strong>frontend hosting is different</strong> - we are mostly serving static files (HTML/CSS/JS) which do not incur cold starts. Serverless frontends eliminate the overhead of provisioning servers and scaling.</p>
<h3 id="heading-benefits-include">Benefits include:</h3>
<ul>
<li><p><strong>Lower Costs</strong>: Pay only for build and bandwidth you use.</p>
</li>
<li><p><strong>Automatic Scaling</strong>: The CDN and edge network handle traffic spikes with no config.</p>
</li>
<li><p><strong>Ease of Deployment</strong>: Pushing to Git triggers deployments immediately.</p>
</li>
<li><p><strong>Reduced Latency</strong>: Serving from the nearest edge location cuts round-trip time.</p>
</li>
</ul>
<p>The trade-offs (vendor lock-in, limited infra control) are <strong>less impactful</strong> for frontends. Notably, Cloudflare Workers eliminates cold starts by running code in V8 isolates everywhere. In short, “throwing the webpage code to the browser” from a global CDN sidesteps almost all the classic serverless cons - making <strong>serverless a no-brainer for frontends</strong>.</p>
<h2 id="heading-exploring-frontend-deployment-platforms">Exploring Frontend Deployment Platforms</h2>
<p>Today, many platforms offer easy serverless frontend hosting. Some of the major ones include:</p>
<h3 id="heading-firebase-hosting-google-cloud">Firebase Hosting (Google Cloud)</h3>
<p>Production-grade hosting with a global CDN. A single CLI command deploys your web app to edge servers. Optimized for static and SPA apps, with built-in SSL and caching. Can pair with Cloud Functions or Cloud Run.</p>
<h3 id="heading-vercel">Vercel</h3>
<p>Built by the creators of Next.js, Vercel is a popular choice for frontend developers, especially with React/Next.js. It offers seamless Git integration, instant deploy previews, and built-in support for serverless edge functions.</p>
<h3 id="heading-netlify">Netlify</h3>
<p>A JAMstack platform that automates builds and global deployment. Connects to Git repos, runs your build settings, and deploys to a CDN. Includes built-in functions (serverless backend), form handling, and identity services.</p>
<h3 id="heading-aws-amplify">AWS Amplify</h3>
<p>As discussed, Amplify offers managed frontend hosting with Git-based CI/CD, CloudFront CDN, and framework support. Ideal if your stack already uses AWS.</p>
<h3 id="heading-cloudflare-pages-amp-workers">Cloudflare Pages &amp; Workers</h3>
<p>An edge-first deployment platform. Cloudflare Pages offers Git-driven JAMstack hosting. Cloudflare Workers adds dynamic logic at the edge. The free tier is generous - unlimited sites, 500 builds/month, and 100k Worker requests/day.</p>
<p>Each option has its strengths. For instance:</p>
<ul>
<li><p>Firebase’s Google Cloud integration</p>
</li>
<li><p>Vercel’s deep Next.js support</p>
</li>
<li><p>Netlify’s JAMstack features</p>
</li>
<li><p>Cloudflare’s speed and pricing</p>
</li>
</ul>
<p>We chose Amplify for its AWS alignment, but for personal projects, I found <strong>Cloudflare’s simplicity very appealing</strong>.</p>
<h2 id="heading-why-cloudflare-became-my-go-to-choice">Why Cloudflare Became My Go-To Choice</h2>
<p>While I have no major complaints about any one provider, <strong>Cloudflare stood out</strong> for my own use. Its edge network and pricing won me over. My personal site and small projects now run on Cloudflare Pages/Workers.</p>
<h3 id="heading-heres-why">Here's why:</h3>
<ul>
<li><p><strong>Global Edge Performance</strong>: Cloudflare Workers consistently respond quicker than AWS Lambda@Edge, thanks to 200+ Points of Presence and direct V8 engine execution. Cold starts are virtually eliminated.</p>
</li>
<li><p><strong>Generous Free Tier</strong>: Pages allows unlimited free bandwidth and sites. Workers includes 100k requests/day and 10ms CPU time per request.</p>
</li>
<li><p><strong>Built-In Security &amp; DNS</strong>: Free SSL certificates, DDoS protection, and the fastest DNS resolver (1.1.1.1) are all included.</p>
</li>
<li><p><strong>Easy Workflow</strong>: GitHub/GitLab integration means a quick push deploys to the edge. It also offers pull-request previews and built-in analytics.</p>
</li>
<li><p><strong>Cost Savings</strong>: Friends at a startup reported major savings after migrating their services to Cloudflare Workers and Pages - no idle server fees, no egress charges.</p>
</li>
</ul>
<p>In short, <strong>Cloudflare gave me everything I needed</strong>: performance, reliability, and low cost. I no longer worry about downtime or scaling - the edge network handles it.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this case study, I evaluated several modern frontend hosting options and ultimately used a <strong>two-pronged approach</strong>:</p>
<ul>
<li><p><strong>AWS Amplify</strong> for our <strong>company project</strong></p>
</li>
<li><p><strong>Cloudflare</strong> for <strong>personal projects</strong></p>
</li>
</ul>
<p>Amplify’s Git-based CI/CD and AWS ecosystem made it a great choice for team use. Cloudflare’s edge performance, free tier, and developer-friendly workflow won out for my own needs.</p>
<p>Both choices show how far <strong>serverless frontend hosting</strong> has come: we now get global delivery, instant deployment, and cost-per-use billing - without managing a single server.</p>
<h2 id="heading-further-reading">Further Reading</h2>
<ul>
<li><p><a target="_blank" href="https://aws.amazon.com/amplify/">AWS Amplify</a></p>
</li>
<li><p><a target="_blank" href="https://talent500.com/blog/frontend-deployments-in-aws-s3-cloudfront-vs-aws-amplify-vs-ec2/">Frontend Deployment Comparison - Talent500 Blog</a></p>
</li>
<li><p><a target="_blank" href="https://www.scrumlaunch.com/blog/pros-and-cons-of-serverless-backend-development">ScrumLaunch: Serverless Pros &amp; Cons</a></p>
</li>
<li><p><a target="_blank" href="https://firebase.google.com/docs/hosting">Firebase Hosting</a></p>
</li>
<li><p><a target="_blank" href="https://www.saasworthy.com/compare/netlify-vs-vercel-vs-aws-amplify-vs-firebase?pIds=6502,7966,8389,9399">Netlify vs Vercel vs Amplify - SaaSworthy</a></p>
</li>
<li><p><a target="_blank" href="https://pages.cloudflare.com/">Cloudflare Pages</a></p>
</li>
<li><p><a target="_blank" href="https://developers.cloudflare.com/workers/platform/pricing/">Cloudflare Workers Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://www.cloudflare.com/learning/dns/what-is-1.1.1.1/">Cloudflare DNS (1.1.1.1)</a></p>
</li>
</ul>
<h3 id="heading-lets-connect">Let's Connect!</h3>
<p>I'm always eager to connect with fellow developers and tech enthusiasts. Feel free to reach out to me at <a target="_blank" href="mailto:contact@jainamshah.dev">hey@jainamshah.dev</a> or <a target="_blank" href="https://www.linkedin.com/in/jainam-shah-086a93247/">my Linkdin profile</a>. Let's share ideas, collaborate on projects, or simply chat about the latest in tech!</p>
]]></content:encoded></item><item><title><![CDATA[Atomic and Low-Level Design in Flutter: Crafting Scalable UI Components]]></title><description><![CDATA[Introduction
Flutter enables us to create very expressive UI easily. But for building a quality app contains many different components like Design systems, file structure, naming conventions, and many low level system design concepts. This article wi...]]></description><link>https://blog.jainamshah.dev/atomic-and-low-level-design-in-flutter-crafting-scalable-ui-components</link><guid isPermaLink="true">https://blog.jainamshah.dev/atomic-and-low-level-design-in-flutter-crafting-scalable-ui-components</guid><category><![CDATA[Flutter]]></category><category><![CDATA[design system]]></category><category><![CDATA[Mobile Development]]></category><dc:creator><![CDATA[Jainam Shah]]></dc:creator><pubDate>Thu, 29 May 2025 17:15:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748543491077/372582d7-1187-45d7-b6e4-8e76b50dd0e5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction"><strong>Introduction</strong></h1>
<p>Flutter enables us to create very expressive UI easily. But for building a quality app contains many different components like Design systems, file structure, naming conventions, and many low level system design concepts. This article will particularly be about how we created both simple yet efficient component library using atomic design methodology and low level system design principles.</p>
<h2 id="heading-understanding-atomic-design-methodology"><strong>Understanding Atomic Design Methodology</strong></h2>
<p>Atomic Design, introduced by Brad Frost, structures UI components into five levels:</p>
<ol>
<li><p><strong>Atoms —</strong> Atoms are the fundamental UI elements (e.g., Buttons, Labels, Icons, Input Fields)</p>
</li>
<li><p><strong>Molecules —</strong> Groups of atoms forming a molecule (e.g., Search Bar, Labelled input fields)</p>
</li>
<li><p><strong>Organisms —</strong> Combinations of molecule forming distinct UI sections (e.g., Navbars)</p>
</li>
<li><p><strong>Templates —</strong> Layouts defining content structure (e.g., Row, 2 Column Layout, Grid)</p>
</li>
<li><p><strong>Pages —</strong> Fully assembled UI screen</p>
</li>
</ol>
<h2 id="heading-understanding-low-level-system-design"><strong>Understanding Low Level System Design</strong></h2>
<ol>
<li><p><strong>Encapsulation —</strong> Manages Its own state and behaviour</p>
</li>
<li><p><strong>Reusability —</strong> Reusable across entire application</p>
</li>
<li><p><strong>Scalability</strong> — Should support multiple variations and allow future extensions seamlessly</p>
</li>
</ol>
<h1 id="heading-implementing-a-scalable-button-component"><strong>Implementing a Scalable Button Component</strong></h1>
<p>For this article, we will focus on creating the atomic button. Buttons are simple to experiment with, easy to explain, and serve as a fundamental component that effectively demonstrates the implementation.</p>
<h2 id="heading-lets-start-with-creating-design-tokens"><strong>Let’s start with creating design tokens</strong></h2>
<p>Assuming all theme properties are applied using Flutter’s theme engine, we create tokens for button sizes. Many design systems, such as Material and Human Interface Design, define standard button heights. In our project, we follow <strong>SMRL</strong> (Small, Medium, Regular, Large) conventions:</p>
<p>Create a mappings for this sizes:</p>
<pre><code class="lang-dart"><span class="hljs-keyword">static</span> <span class="hljs-keyword">const</span> <span class="hljs-built_in">Map</span>&lt;ButtonSize, <span class="hljs-built_in">double</span>&gt; _buttonHeights = {
    ButtonSize.small: <span class="hljs-number">36.0</span>,
    ButtonSize.medium: <span class="hljs-number">44.0</span>,
    ButtonSize.regular: <span class="hljs-number">52.0</span>,
    ButtonSize.large: <span class="hljs-number">60.0</span>,
  };
</code></pre>
<p>This static map ensures that if we ever need to add more height parameters we can just add parameters to Enum and static map. This makes the component scalable to new variations easy.</p>
<h2 id="heading-defining-the-button-style"><strong>Defining the button style</strong></h2>
<p>Majorly the button style remains fix UI wide, and this is just our primary button. We are using 4 types of button in our design system, Primary, Secondary, Tertiary and Textual Button more about them later. Just using the flutter theme engine to simplify lots of complexity here:</p>
<pre><code class="lang-dart">ButtonStyle getButtonStyle(BuildContext context) {
    <span class="hljs-keyword">return</span> FilledButton.styleFrom(
      minimumSize: Size.fromHeight(buttonHeight),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(<span class="hljs-number">8.0</span>)),
      textStyle: Theme.of(context).textTheme.labelLarge,
    );
  }
</code></pre>
<h2 id="heading-now-the-main-part-button-widget"><strong>Now the main part Button Widget</strong></h2>
<p>This consists of 4 parameters which user can define:</p>
<pre><code class="lang-dart"><span class="hljs-keyword">final</span> VoidCallback? onPressed;
<span class="hljs-keyword">final</span> <span class="hljs-built_in">String</span> label;
<span class="hljs-keyword">final</span> Widget? icon;
<span class="hljs-keyword">final</span> ButtonSize size;
</code></pre>
<p>In out design system we are utilising 4 material buttons (Filled, Elevated, Textual, Outlined). In primary button we are using the filled button. So as per the variables defined lets look at the build method of the widget.</p>
<pre><code class="lang-dart">Widget build(BuildContext context) {
    <span class="hljs-keyword">return</span> icon == <span class="hljs-keyword">null</span>
        ? FilledButton(
            onPressed: onPressed,
            style: getButtonStyle(context),
            child: Text(label),
          )
        : FilledButton.icon(
            onPressed: onPressed,
            style: getButtonStyle(context),
            label: Text(label),
            icon: icon!,
          );
  }
</code></pre>
<p>Here as we can see that if icon is null than the normal FilledButton will be rendered else the FilledButton.icon widget will be rendered.</p>
<p>Also the style is being fetched from the styles we created earlier. As you can observe this makes the code of widget itself seemingly very light and seperate from any other clutter.</p>
<h1 id="heading-final-component"><strong>Final Component</strong></h1>
<p>Now lets look at the full code of the widget, As I mentioned earlier we are using 4 material button components, This is our Primary Button Widget.</p>
<pre><code class="lang-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter/material.dart'</span>;

<span class="hljs-comment">/// <span class="markdown">Defines button sizes</span></span>
<span class="hljs-keyword">enum</span> ButtonSize { small, regular, medium, large }

<span class="hljs-comment">/// <span class="markdown">Defines a primary button with configurable size and icon</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PrimaryButton</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatelessWidget</span> </span>{
  <span class="hljs-keyword">final</span> VoidCallback? onPressed;
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">String</span> label;
  <span class="hljs-keyword">final</span> Widget? icon;
  <span class="hljs-keyword">final</span> ButtonSize size;

  <span class="hljs-keyword">const</span> PrimaryButton({
    Key? key,
    <span class="hljs-keyword">required</span> <span class="hljs-keyword">this</span>.onPressed,
    <span class="hljs-keyword">required</span> <span class="hljs-keyword">this</span>.label,
    <span class="hljs-keyword">this</span>.icon,
    <span class="hljs-keyword">this</span>.size = ButtonSize.regular,
  }) : <span class="hljs-keyword">super</span>(key: key);

  <span class="hljs-comment">/// <span class="markdown">Predefined button heights</span></span>
  <span class="hljs-keyword">static</span> <span class="hljs-keyword">const</span> <span class="hljs-built_in">Map</span>&lt;ButtonSize, <span class="hljs-built_in">double</span>&gt; _buttonHeights = {
    ButtonSize.small: <span class="hljs-number">36.0</span>,
    ButtonSize.medium: <span class="hljs-number">44.0</span>,
    ButtonSize.regular: <span class="hljs-number">52.0</span>,
    ButtonSize.large: <span class="hljs-number">60.0</span>,
  };

  <span class="hljs-comment">/// <span class="markdown">Retrieves button height</span></span>
  <span class="hljs-built_in">double</span> <span class="hljs-keyword">get</span> buttonHeight =&gt; _buttonHeights[size] ?? <span class="hljs-number">44.0</span>;

  <span class="hljs-comment">/// <span class="markdown">Retrieves button style</span></span>
  ButtonStyle getButtonStyle(BuildContext context) {
    <span class="hljs-keyword">return</span> FilledButton.styleFrom(
      minimumSize: Size.fromHeight(buttonHeight),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(<span class="hljs-number">8.0</span>)),
      textStyle: Theme.of(context).textTheme.labelLarge,
    );
  }

  <span class="hljs-meta">@override</span>
  Widget build(BuildContext context) {
    <span class="hljs-keyword">return</span> icon == <span class="hljs-keyword">null</span>
        ? FilledButton(
          onPressed: onPressed,
          style: getButtonStyle(context),
          child: Text(label),
        )
        : FilledButton.icon(
          onPressed: onPressed,
          style: getButtonStyle(context),
          label: Text(label),
          icon: icon!,
        );
  }
}
</code></pre>
<p>This button is being used application wide. It follow the low level design and Solid principle concepts:</p>
<p><strong>Encapsulation —</strong> both the height and style guide is abstracted and developer don't need to bother about it.</p>
<p><strong>Reusable —</strong> It is used all over screens in the application. the height can be customised as per need.</p>
<p><strong>Scalability —</strong> It is scalable as it has multiple height support, styles can be pretty much same UI wide, and the labels and onpressed activity is handled outside of the component that give developer flexibility to customise the click action as per his need.</p>
<p>It follows the atomic guideline quite well:</p>
<p><strong>Atom</strong>: <code>PrimaryButton</code> is a fundamental UI component.</p>
<p><strong>Reusable</strong>: Works across multiple UI sections and screens.</p>
<h1 id="heading-final-note"><strong>Final Note</strong></h1>
<p>Using this methods, we were able to create a pretty good component library of our design system which follows practices around the Low Level Design and Atomic Design methodology. This makes any new developer onboarding easier, Faster development as don't need to focus on minor details like sizes and properties, and quality of components greatly enhanced as it is already created and quality tested. This improves overall Quality of life of the developer.</p>
<p>Here, attaching some references which inspired and helped us to create this library:</p>
<h2 id="heading-hawkins-diving-into-the-reasoning-behind-our-design-systemhttpsnetflixtechblogcomhawkins-diving-into-the-reasoning-behind-our-design-system-964a7357547sourcepostpage-1865f9156f9b"><a target="_blank" href="https://netflixtechblog.com/hawkins-diving-into-the-reasoning-behind-our-design-system-964a7357547?source=post_page-----1865f9156f9b---------------------------------------"><strong>Hawkins: Diving into the Reasoning Behind our Design System</strong></a></h2>
<h3 id="heading-by-hawkins-team-member-joshua-godi-with-cover-art-from-martin-bekerman-and-additional-imagery-from-wiki-chaveshttpsnetflixtechblogcomhawkins-diving-into-the-reasoning-behind-our-design-system-964a7357547sourcepostpage-1865f9156f9b"><a target="_blank" href="https://netflixtechblog.com/hawkins-diving-into-the-reasoning-behind-our-design-system-964a7357547?source=post_page-----1865f9156f9b---------------------------------------">by Hawkins team member Joshua Godi; with cover art from Martin Bekerman and additional imagery from Wiki Chaves</a></h3>
<p><a target="_blank" href="https://netflixtechblog.com/hawkins-diving-into-the-reasoning-behind-our-design-system-964a7357547?source=post_page-----1865f9156f9b---------------------------------------">netflixtechblog.com</a></p>
<h2 id="heading-wise-designhttpswisedesignsourcepostpage-1865f9156f9b"><a target="_blank" href="https://wise.design/?source=post_page-----1865f9156f9b---------------------------------------"><strong>Wise Design</strong></a></h2>
<h3 id="heading-wise-design-is-the-wise-design-system-it-helps-our-team-create-a-distinct-accessible-and-consistent-wise-experiencehttpswisedesignsourcepostpage-1865f9156f9b"><a target="_blank" href="https://wise.design/?source=post_page-----1865f9156f9b---------------------------------------">Wise Design is the Wise design system. It helps our team create a distinct, accessible and consistent Wise experience…</a></h3>
<p><a target="_blank" href="https://wise.design/?source=post_page-----1865f9156f9b---------------------------------------">wise.design</a></p>
<h2 id="heading-lightning-design-system-2httpswwwlightningdesignsystemcomsourcepostpage-1865f9156f9b"><a target="_blank" href="https://www.lightningdesignsystem.com/?source=post_page-----1865f9156f9b---------------------------------------"><strong>Lightning Design System 2</strong></a></h2>
<h3 id="heading-lightning-design-system-2-design-system-documentation-made-with-zeroheighthttpswwwlightningdesignsystemcomsourcepostpage-1865f9156f9b"><a target="_blank" href="https://www.lightningdesignsystem.com/?source=post_page-----1865f9156f9b---------------------------------------">Lightning Design System 2 · Design system documentation, made with zeroheight</a></h3>
<p><a target="_blank" href="https://www.lightningdesignsystem.com/?source=post_page-----1865f9156f9b---------------------------------------">www.lightningdesignsystem.com</a></p>
<p><a target="_blank" href="https://www.lightningdesignsystem.com/?source=post_page-----1865f9156f9b---------------------------------------">  
</a></p>
]]></content:encoded></item></channel></rss>