<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aldorax</title>
    <description>The latest articles on DEV Community by Aldorax (@aldorax).</description>
    <link>https://dev.to/aldorax</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1358154%2F4e9b492d-62e5-4319-a190-0b8e96e59ecd.jpeg</url>
      <title>DEV Community: Aldorax</title>
      <link>https://dev.to/aldorax</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aldorax"/>
    <language>en</language>
    <item>
      <title>The Trader's Paradox: Why Being Good at Crypto Means You Can't Prove It</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Tue, 10 Mar 2026 17:25:24 +0000</pubDate>
      <link>https://dev.to/aldorax/the-traders-paradox-why-being-good-at-crypto-means-you-cant-prove-it-4ip3</link>
      <guid>https://dev.to/aldorax/the-traders-paradox-why-being-good-at-crypto-means-you-cant-prove-it-4ip3</guid>
      <description>&lt;p&gt;There's an ugly secret hiding beneath every profitable trader's dashboard.&lt;/p&gt;

&lt;p&gt;The moment you prove you're good at this... you lose the very thing that makes you good.&lt;/p&gt;

&lt;p&gt;Let me walk through the logic, because it's brutal.&lt;/p&gt;

&lt;p&gt;To prove you're consistently profitable, you have to show everything. Your entries. Your exits. How you sized each position. When you got in. When you got out. The exact strategy that's been printing money.&lt;/p&gt;

&lt;p&gt;And those details? That's &lt;em&gt;exactly&lt;/em&gt; what creates your edge in the first place.&lt;/p&gt;

&lt;p&gt;So here's the trap most traders find themselves in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reveal your strategy and lose your advantage. Or keep it private and stay unverified.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, the people trying to follow traders face their own nightmare.&lt;/p&gt;

&lt;p&gt;They see screenshots of massive wins. Leaderboards showing insane returns. Dashboard after dashboard claiming 10x performance.&lt;/p&gt;

&lt;p&gt;But none of it answers the one question that actually matters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I trust any of this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually? No.&lt;/p&gt;

&lt;p&gt;Performance data gets cherry-picked. Losers conveniently disappear from screenshots. Returns get fabricated. In an industry built on "transparency," the signals people actually use to find good traders are shockingly opaque.&lt;/p&gt;

&lt;p&gt;This is where Obscura comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  What If You Could Prove You're Good Without Revealing Anything?
&lt;/h2&gt;

&lt;p&gt;That's the question the team behind Obscura asked themselves. And instead of trying to force traders to choose between privacy and credibility, they built something that lets you have both.&lt;/p&gt;

&lt;p&gt;Here's how it works in plain English:&lt;/p&gt;

&lt;p&gt;A trader can cryptographically prove their performance metrics — total profit, win rate, how many trades they've taken — without revealing a single trade.&lt;/p&gt;

&lt;p&gt;Followers can independently verify those claims.&lt;/p&gt;

&lt;p&gt;The shift is subtle but massive.&lt;/p&gt;

&lt;p&gt;We move from &lt;strong&gt;"trust me, bro"&lt;/strong&gt; to &lt;strong&gt;"here's the proof, verify it yourself."&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Piece DeFi Never Built
&lt;/h2&gt;

&lt;p&gt;Over the last few years, crypto has rebuilt almost everything from traditional finance.&lt;/p&gt;

&lt;p&gt;We've got decentralized exchanges. Lending platforms. Derivatives. Automated market makers that run 24/7 without banks.&lt;/p&gt;

&lt;p&gt;But one critical thing never got built:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reputation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right now, every participant in DeFi is treated as equally risky. The guy who's been trading profitably for three years gets the same treatment as someone opening their first wallet today.&lt;/p&gt;

&lt;p&gt;Protocols have no way to evaluate trading history. So they protect themselves with blunt instruments — massive over-collateralization, conservative risk models, one-size-fits-all treatment.&lt;/p&gt;

&lt;p&gt;The consequences hit everyone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skilled traders&lt;/strong&gt; can't prove their track record without exposing their strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers&lt;/strong&gt; can't tell genuine performance from cherry-picked screenshots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocols&lt;/strong&gt; can't price risk accurately or allocate capital intelligently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obscura exists to fix this by building something that should have existed years ago: &lt;strong&gt;a privacy-preserving reputation layer for trading.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How "Trade With Proof" Actually Works
&lt;/h2&gt;

&lt;p&gt;That phrase — &lt;em&gt;Trade With Proof, Not Trust&lt;/em&gt; — sounds like marketing. But it's weirdly literal.&lt;/p&gt;

&lt;p&gt;Instead of asking you to believe a trader's claims, Obscura generates &lt;strong&gt;cryptographic proofs&lt;/strong&gt; that those claims are mathematically correct.&lt;/p&gt;

&lt;p&gt;A trader can prove things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total profit and loss over any period&lt;/li&gt;
&lt;li&gt;Win rate percentage&lt;/li&gt;
&lt;li&gt;How many trades they've taken&lt;/li&gt;
&lt;li&gt;Performance on specific assets&lt;/li&gt;
&lt;li&gt;Results within any time window (30 days, 90 days, since they started)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These stats get computed from actual trading activity and encoded into something called a &lt;strong&gt;zero-knowledge proof&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The proof confirms: "Yes, these metrics were calculated correctly from real trades."&lt;/p&gt;

&lt;p&gt;But the trades themselves? Completely hidden.&lt;/p&gt;

&lt;p&gt;Once generated, that proof gets submitted to smart contracts where anyone can verify it independently.&lt;/p&gt;

&lt;p&gt;The result? &lt;strong&gt;Verified outcomes with private strategies.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Let Me Paint You a Picture of How This Plays Out
&lt;/h2&gt;

&lt;p&gt;Imagine you're a trader who's been consistently profitable for two years. You've found a strategy that works. You've refined it. It's your edge.&lt;/p&gt;

&lt;p&gt;Under the old model, if you wanted to attract followers or get better terms from protocols, you'd have to show your work. Every trade. Every entry. Every exit.&lt;/p&gt;

&lt;p&gt;Your edge evaporates overnight.&lt;/p&gt;

&lt;p&gt;Under Obscura's model, you generate a proof that says: "Over two years, I've taken 847 trades. My total return is 143%. My win rate is 68%."&lt;/p&gt;

&lt;p&gt;Followers can verify that proof instantly. They know you're legit.&lt;/p&gt;

&lt;p&gt;But they have no idea &lt;em&gt;which&lt;/em&gt; trades you took. Which assets. At what times. With what size.&lt;/p&gt;

&lt;p&gt;Your edge stays yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack That Makes This Possible
&lt;/h2&gt;

&lt;p&gt;I'm going to get slightly technical here, but I promise to keep it human.&lt;/p&gt;

&lt;p&gt;Obscura combines three technologies to pull this off:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Zero-knowledge proofs&lt;/strong&gt; — These allow someone to prove a statement is true without revealing the information behind it. Think of it like proving you're over 21 without showing your driver's license with your exact birthdate and address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Decentralized oracle networks&lt;/strong&gt; — These bring trade data in from exchanges in a way that can't be manipulated. Multiple independent nodes verify each trade. They have to agree before anything gets accepted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Confidential computing&lt;/strong&gt; — This handles the sensitive stuff like API credentials and private trade data securely.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hardware Problem That Needed Solving
&lt;/h2&gt;

&lt;p&gt;Here's something interesting that happened during development.&lt;/p&gt;

&lt;p&gt;Earlier versions of Obscura used something called Trusted Execution Environments (TEEs). These are hardware-enforced secure areas inside computer processors. Think of them as vaults inside the chip itself.&lt;/p&gt;

&lt;p&gt;They work. They're used everywhere.&lt;/p&gt;

&lt;p&gt;But they come with trade-offs.&lt;/p&gt;

&lt;p&gt;You have to trust the hardware manufacturer. You have to trust the cloud provider hosting that hardware. And specialized infrastructure gets expensive fast.&lt;/p&gt;

&lt;p&gt;For a protocol trying to build &lt;strong&gt;verifiable reputation across decentralized markets&lt;/strong&gt;, relying on centralized hardware felt wrong.&lt;/p&gt;

&lt;p&gt;So the team shifted direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Nillion: Private Computation Without Hardware Vaults
&lt;/h2&gt;

&lt;p&gt;The newer architecture integrates infrastructure from something called Nillion, which handles private data differently.&lt;/p&gt;

&lt;p&gt;Two pieces matter here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: Secret-shared storage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of storing sensitive data in one encrypted location, it gets split into multiple fragments called "shares."&lt;/p&gt;

&lt;p&gt;Each share individually reveals nothing. It's like giving ten people one piece of a jigsaw puzzle each — no single piece shows the full picture.&lt;/p&gt;

&lt;p&gt;Only when enough shares come together (a "threshold") can the original information be reconstructed.&lt;/p&gt;

&lt;p&gt;For Obscura, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API credentials get split into fragments&lt;/li&gt;
&lt;li&gt;Each fragment lives on a different node&lt;/li&gt;
&lt;li&gt;No single node ever holds the complete secret&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone compromised one node? They'd have a meaningless fragment. Not enough to reconstruct anything useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second: Multi-party computation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Protecting data while it's stored is one thing. But the system also needs to &lt;em&gt;use&lt;/em&gt; that data — signing instructions, verifying credentials, performing calculations.&lt;/p&gt;

&lt;p&gt;Multi-party computation lets multiple nodes jointly compute something while each holds only a fragment of the input.&lt;/p&gt;

&lt;p&gt;The inputs stay private throughout. The secrets never get reconstructed in one place. But the computation still happens correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Zero-Knowledge Proofs Still Run the Show
&lt;/h2&gt;

&lt;p&gt;Here's the way to think about how these pieces fit together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nillion's infrastructure protects private inputs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-knowledge proofs verify correct public outputs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confidential computing keeps secrets secret. Zero-knowledge proofs prove that the claims coming out of that system are mathematically correct.&lt;/p&gt;

&lt;p&gt;The performance metrics get calculated using circuits written in a language called Noir. These circuits process normalized trade data and produce cryptographic proofs of correctness.&lt;/p&gt;

&lt;p&gt;Multiple proofs can be combined using something called recursive proof composition — imagine compressing a library's worth of verification into a single page.&lt;/p&gt;

&lt;p&gt;That compressed proof gets submitted to an on-chain verifier where anyone can check it with minimal computational cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Actually Means for Traders
&lt;/h2&gt;

&lt;p&gt;Let me translate all the technical stuff into practical reality.&lt;/p&gt;

&lt;p&gt;If you're a trader building a public track record, here's what changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your strategy stays private.&lt;/strong&gt; Nobody sees your timing, execution details, or positions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your credibility becomes verifiable.&lt;/strong&gt; Performance claims come with cryptographic receipts, not just dashboard screenshots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your reputation travels with you.&lt;/strong&gt; Activity across multiple exchanges can feed into one reputation profile. You're not starting from zero every time you try a new platform.&lt;/p&gt;

&lt;p&gt;For the first time, you can prove long-term consistency without revealing the mechanisms that generate your edge.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Followers
&lt;/h2&gt;

&lt;p&gt;If you're someone trying to find traders worth following, the shift is equally significant.&lt;/p&gt;

&lt;p&gt;Instead of squinting at screenshots wondering if they're real, you can verify that reported statistics actually came from authentic trading activity.&lt;/p&gt;

&lt;p&gt;You can see risk signals alongside returns — drawdown, trade frequency, consistency metrics.&lt;/p&gt;

&lt;p&gt;The goal isn't just highlighting high performers. It's providing &lt;strong&gt;verifiable signals that help you make better decisions.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  This Goes Way Beyond Trading
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting.&lt;/p&gt;

&lt;p&gt;Obscura starts with trading reputation. But a portable, verifiable reputation layer could eventually change how DeFi works at a fundamental level.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lending protocols&lt;/strong&gt; evaluating borrower credibility based on verifiable history rather than just collateral&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insurance markets&lt;/strong&gt; pricing risk based on actual behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance systems&lt;/strong&gt; weighting participation by expertise rather than token holdings alone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reputation becomes something you build over time and carry with you. Not a platform-specific score. Actual infrastructure that travels wherever you go.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Long Game
&lt;/h2&gt;

&lt;p&gt;The objective is straightforward, even if the technology is complex:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a reputation layer that's private by default and verifiable by anyone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's still work to do. Making proof generation faster. Normalizing data consistently across different exchanges. Figuring out exactly how reputation should be modeled.&lt;/p&gt;

&lt;p&gt;But the principle is solid.&lt;/p&gt;

&lt;p&gt;In decentralized markets, trust shouldn't depend on screenshots, platform dashboards, or hoping some intermediary is honest.&lt;/p&gt;

&lt;p&gt;It should depend on &lt;strong&gt;verifiable computation.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Trade With Proof, Not Trust
&lt;/h2&gt;

&lt;p&gt;If systems like Obscura succeed, something fundamental shifts in crypto trading.&lt;/p&gt;

&lt;p&gt;Traders no longer have to reveal everything to prove anything.&lt;/p&gt;

&lt;p&gt;They prove what matters — and keep the rest private.&lt;/p&gt;

&lt;p&gt;In that world, reputation becomes something that's &lt;strong&gt;earned, verified, and portable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And trust moves from &lt;strong&gt;belief&lt;/strong&gt; to &lt;strong&gt;mathematics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No screenshots required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow Obscura's development here:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://portal.obscura.finance" rel="noopener noreferrer"&gt;https://portal.obscura.finance&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Twitter/X:&lt;/strong&gt; &lt;a href="https://x.com/UseObscura" rel="noopener noreferrer"&gt;https://x.com/UseObscura&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zk</category>
      <category>privacy</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building QuantaCode: Our Bolt Hackathon Saga (and the AI Brainrot is Real!)</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Tue, 01 Jul 2025 13:48:25 +0000</pubDate>
      <link>https://dev.to/aldorax/building-quantacode-our-bolt-hackathon-saga-and-the-ai-brainrot-is-real-5dh0</link>
      <guid>https://dev.to/aldorax/building-quantacode-our-bolt-hackathon-saga-and-the-ai-brainrot-is-real-5dh0</guid>
      <description>&lt;p&gt;Alright, fellow code warriors and digital adventurers! Buckle up, because I'm about to take you on a wild ride – our journey building &lt;strong&gt;QuantaCode&lt;/strong&gt; for the Bolt Hackathon. Was it smooth sailing? Absolutely not. Was it epic? You bet your &lt;code&gt;git commit -m "final final final"&lt;/code&gt; it was. And yes, there might be some &lt;em&gt;slight&lt;/em&gt; exaggerations, but I promise, the core truth is always just a semicolon away.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 The Spark of Genius (or, How We Avoided Total Brain Drain)
&lt;/h3&gt;

&lt;p&gt;The idea for QuantaCode hit us like a perfectly formatted, lint-free commit: developers spend half their lives wrestling with messy code, debugging nightmares, and trying to figure out if their codebase is more "pristine garden" or "dumpster fire after a coding convention argument." We thought, "What if we could get &lt;strong&gt;quantum-level precision&lt;/strong&gt; in code analysis?" (Okay, maybe the "quantum-level" part was a &lt;em&gt;slight&lt;/em&gt; exaggeration, but we definitely aimed for deep insights!) We dreamed of an AI that didn't just tell you &lt;em&gt;what&lt;/em&gt; was wrong, but &lt;em&gt;why&lt;/em&gt;, and even talked to you about it. Voice-powered code analysis? Madness! But the good kind of madness. This vision pushed us to explore the bleeding edge of AI integration in developer tooling, aiming for something truly transformative.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  🎯 What We Cooked Up (Spoiler: It's Pretty Cool)
&lt;/h3&gt;

&lt;p&gt;So, what exactly is this mythical beast, QuantaCode? It's an &lt;strong&gt;AI-powered codebase health management platform&lt;/strong&gt;. Think of it as your code's personal, highly intelligent, and slightly judgmental doctor, always ready to give you a check-up and prescribe improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Features (The Good Stuff):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quantum AI Analysis&lt;/strong&gt;: We fed OpenAI GPT-4 all the code it could eat, and it spat out insights on quality, security, and maintainability. It's like having a super-senior architect review your entire repo in seconds. (Okay, maybe not &lt;em&gt;seconds&lt;/em&gt;, but definitely faster than a human, and without the passive-aggressive comments!) Our AI delves into code patterns, potential anti-patterns, and even documentation gaps to provide a holistic view.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice-Powered Insights&lt;/strong&gt;: This is where the magic (and a bit of ElevenLabs wizardry) happens. You can literally &lt;em&gt;talk&lt;/em&gt; to your codebase and get audio summaries. Imagine asking, "Hey QuantaCode, what's the biggest issue in my &lt;code&gt;auth&lt;/code&gt; module?" and getting a coherent, spoken answer. Free users get a charmingly robotic voice; premium users get a voice so natural, you'll wonder if your code is flirting with you. This feature was designed to make complex analysis accessible and interactive.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time Monitoring&lt;/strong&gt;: Because nobody likes surprises, especially when it's a critical bug lurking in production. QuantaCode keeps a vigilant eye on your repository, alerting you to changes in health metrics as they happen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Premium Subscriptions&lt;/strong&gt;: We gotta eat, right? Stripe handles the billing, even with fancy promo codes. This allows us to offer advanced features and sustain development.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Admin Analytics&lt;/strong&gt;: For us to stalk... I mean, &lt;em&gt;understand&lt;/em&gt; user behavior and platform performance. This dashboard gives us insights into feature adoption, common issues, and overall system health, enabling continuous improvement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responsive Design&lt;/strong&gt;: Because even your phone deserves to see beautiful code analysis. We meticulously crafted the UI to ensure a seamless experience across desktops, tablets, and mobile devices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Our Tech Stack (The Guts &amp;amp; Glory):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 13, React, TypeScript, Tailwind CSS (the usual suspects, dressed to impress, and chosen for their robust ecosystem and developer experience).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;: Next.js API Routes, Prisma ORM (our database savior, after some initial wrestling).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL (production-ready!), SQLite (for quick dev cycles, though with some Bolt-specific quirks).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI&lt;/strong&gt;: OpenAI GPT-4 (the brains behind the operation), ElevenLabs (the voice of reason, and sometimes, humor).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Payments&lt;/strong&gt;: Stripe (our financial guardian, diligently handling subscriptions).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: Netlify (because who has time for complex deploys when you're in a hackathon?).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: NextAuth.js (keeping things secure and user sessions managed).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ The Grand Build-Out (or, How Bolt Saved My Sanity... Mostly)
&lt;/h3&gt;

&lt;p&gt;Building QuantaCode was a multi-phase saga, and honestly, Bolt, the AI generator, was my co-pilot for a significant chunk of it. It's like having an incredibly fast, sometimes opinionated, but ultimately indispensable team member.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Laying the Foundation&lt;/strong&gt;&lt;br&gt;
We started with Next.js 13, structuring everything like a perfectly organized closet. Clean, modular, scalable. (Truth: It was probably a messy pile of clothes at first, but we cleaned it up, honest, usually with a quick &lt;code&gt;prettier --write&lt;/code&gt; and a prayer!) This foundational work was crucial for ensuring the project could grow without collapsing under its own weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Database &amp;amp; Authentication - The Great Pivot (and Bolt's Preferences)&lt;/strong&gt;&lt;br&gt;
Oh, Drizzle ORM. You promised so much, but delivered... headaches. Our complex schema for subscriptions and analytics just wasn't playing nice. The real kicker here wasn't Drizzle itself, but that &lt;strong&gt;Bolt seemed to have a strong preference for Prisma, making it challenging to get Drizzle to work seamlessly within the Bolt environment.&lt;/strong&gt; This forced our hand. So, we did what any sane developer does in a hackathon: &lt;strong&gt;we pivoted to Prisma!&lt;/strong&gt; It meant rewriting our entire data layer (cue dramatic music), but Prisma's TypeScript integration and robust relationship handling were a godsend. Seriously, Bolt, if you're listening, some native engine support for Prisma, especially allowing for the &lt;strong&gt;latest versions&lt;/strong&gt;, would be a game-changer. We also hit a snag with testing: &lt;strong&gt;Bolt didn't readily allow us to spin up a local SQLite database for quick testing; we needed an actual PostgreSQL link even for development.&lt;/strong&gt; This added an unexpected layer of setup complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: AI Integration - Bolt's Brainpower&lt;/strong&gt;&lt;br&gt;
This is where Bolt truly shined. Crafting those "quantum-level" prompts for OpenAI GPT-4? That's where Bolt was instrumental. It helped us generate the sophisticated queries that made the AI understand documentation, dependencies, code quality, and security. It was like having a super-fast, tireless prompt engineer on demand, allowing us to iterate on AI analysis capabilities at an incredible pace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4: Voice Features - Making Code Talk&lt;/strong&gt;&lt;br&gt;
Integrating ElevenLabs was pure fun. To get started, you basically sign up, navigate to your profile settings, and grab your API key – it’s usually under an "API" or "Developers" tab. Then, you just plug that key into your backend environment variables, and &lt;em&gt;voila!&lt;/em&gt; Your code starts chatting. We built out the tiered system: free users get a charmingly monotone robot, while premium users get voices so smooth, they could read a phone book and make it sound interesting. This feature added a unique layer of accessibility and engagement to our analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 5: Payment Integration - The Stripe Tango&lt;/strong&gt;&lt;br&gt;
Stripe for subscriptions, naturally. This was less "tango" and more "salsa with a blindfold." Setting up webhooks is a delicate dance. You register an endpoint on Stripe, get your webhook secret, and then in your Next.js API route, you verify the signature to ensure the request is legit. (Truth: We spent an embarrassing amount of time debugging why payments weren't updating user statuses. Turns out, a single missing &lt;code&gt;await&lt;/code&gt; can ruin your whole day, leading to silent failures and frustrated users. We had to meticulously trace the webhook payload and update our user models.)&lt;/p&gt;

&lt;h3&gt;
  
  
  🎢 Challenges We Faced (The Uncensored Director's Cut)
&lt;/h3&gt;

&lt;p&gt;Every hackathon has its demons, and QuantaCode was no exception. These were the moments that tested our resolve, fueled by caffeine, and occasionally, mild panic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Migration Complexity &amp;amp; Bolt's Preferences&lt;/strong&gt;: Drizzle was like that friend who promises to help you move, then shows up with a single box and an "Oops, my car broke down." We ended up doing most of the heavy lifting ourselves by migrating to Prisma. The core issue wasn't Drizzle's capabilities, but Bolt's compatibility. We also faced hurdles with &lt;strong&gt;SWC (Speedy Web Compiler)&lt;/strong&gt;, which, while fast, sometimes threw unexpected errors with certain Next.js 13 features or dependency configurations, forcing us to spend time on workarounds. (Truth: It was a necessary pain that paid off, but better ORM and compiler support from Bolt would have saved precious hours.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stripe Webhook Reliability&lt;/strong&gt;: Payments were like ghosts – sometimes they'd appear, sometimes they'd wouldn't. Users would pay, and then... crickets. (Truth: Webhooks are tricky beasts. We learned the hard way about needing robust error handling, comprehensive logging, and multiple user lookup strategies. We even wrote specific debugging scripts like &lt;code&gt;fix-stripe-subscriptions.js&lt;/code&gt; to bring order to the chaos, ensuring that even if a webhook failed, we had mechanisms to reconcile user subscription statuses.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub API Rate Limiting&lt;/strong&gt;: Trying to analyze a massive repo felt like asking GitHub for too many favors. It would just shut us down. (Truth: We were hitting rate limits like a drum solo. Our fix involved intelligent request batching, prioritizing key files like &lt;code&gt;package.json&lt;/code&gt; for initial analysis, setting a strict 15-minute analysis timeout to prevent endless loops, and running analysis in the background so users wouldn't get stuck staring at a spinner. We also implemented exponential backoff for retries.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time Analysis Updates&lt;/strong&gt;: Imagine watching paint dry, but the paint might also disappear if you blink. That was our real-time analysis. (Truth: We needed background processing to keep analysis alive even if users navigated away, coupled with aggressive 5-second polling and slick visual progress indicators. This involved setting up a robust state management system to reflect the analysis progress accurately.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice Feature Complexity&lt;/strong&gt;: Getting the AI to "understand" the codebase context for voice chat was like teaching a parrot quantum physics. (Truth: It required a sophisticated context system, feeding the AI project metadata, file structure, code snippets, and conversation history to make it sound smart and relevant. This involved careful prompt engineering and managing token limits.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production Performance&lt;/strong&gt;: Our analysis times were initially so slow, you could bake a cake while waiting. (Truth: We optimized by limiting file analysis to the 30 most important files, batching GitHub API calls, and adding more robust error handling. This significantly reduced the load and improved response times.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The GSAP Gauntlet&lt;/strong&gt;: Oh, GSAP. You beautiful, powerful, infuriating beast. Bolt, you're amazing at so many things, but when it came to animations, it felt like we were speaking different languages. (Truth: My experience with GSAP was &lt;em&gt;very&lt;/em&gt; poor. It wasn't Bolt's fault directly, as it's a complex library, but prompting for intricate animations proved incredibly frustrating. We faced issues with conflicting timelines, unexpected element behavior in React's lifecycle, and debugging GSAP animations felt like trying to find a needle in a haystack made of JavaScript. We eventually got some cool animations, but it was a battle of wills, often requiring manual tweaking after Bolt's initial output.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The AI Brainrot Chronicles&lt;/strong&gt;: Let's be honest. When you have an AI generator like Bolt, there's a constant, insidious temptation: "Why read this error message? Just ask Bolt to fix it!" (Truth: I definitely faced a bit of "AI brainrot." The urge to just hand off debugging was strong. But I quickly learned that while Bolt is incredible for generating code and concepts, the human element – logical thinking, understanding the &lt;em&gt;why&lt;/em&gt; behind an issue, and meticulously reading documentation – is absolutely non-negotiable. It's a powerful collaboration, but the human still needs to be the conductor, guiding the AI and verifying its output.)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🏆 Accomplishments That Made Us Fist-Pump the Air
&lt;/h3&gt;

&lt;p&gt;Despite the rollercoaster, we emerged victorious (and slightly sleep-deprived) with some truly awesome accomplishments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;First Voice-Powered Codebase Interaction&lt;/strong&gt;: We actually made code talk! This innovative feature sets QuantaCode apart and makes code analysis more engaging than ever before.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantum-Level AI Insights&lt;/strong&gt;: Thanks to Bolt's prompting prowess and our logical thinking, the AI delivers deep, actionable analysis. We're proud of the sophistication of the insights, moving beyond simple linting to provide genuine value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time Background Processing&lt;/strong&gt;: Analysis runs in the background, so you can keep coding without interruptions. This was a critical UX improvement that ensures a smooth workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comprehensive Admin Analytics&lt;/strong&gt;: Because data is power, even for hackathon projects. Our admin dashboard provides a clear overview of platform usage and performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sophisticated Subscription Management&lt;/strong&gt;: Payments actually work! (Mostly!) Implementing a robust Stripe integration with webhooks was a significant technical achievement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production-Ready Architecture&lt;/strong&gt;: It's not just a prototype; it's built to scale. We focused on a clean, modular codebase that can handle future growth and features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mobile Excellence&lt;/strong&gt;: Looks good on tiny screens too. Our commitment to responsive design ensures a consistent and pleasant user experience across all devices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 What We Learned (The Wisdom Gained)
&lt;/h3&gt;

&lt;p&gt;This hackathon was a masterclass in rapid development and problem-solving, teaching us invaluable lessons that will shape our future projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Choice Matters&lt;/strong&gt;: Seriously, pick your ORM wisely. Prisma saved us after Drizzle proved challenging within the Bolt environment. We also learned that &lt;strong&gt;Bolt's engine support for Prisma could be improved, specifically regarding the inability to upgrade Prisma to its latest versions, which limited our access to newer features and optimizations.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webhook Reliability is Critical&lt;/strong&gt;: Treat webhooks like precious, fragile babies. They require meticulous handling, comprehensive logging, and robust retry mechanisms to ensure data consistency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API Rate Limiting Strategy&lt;/strong&gt;: Be nice to external APIs, or they'll shut you down. Intelligent request batching and strategic prioritization are key to working within API constraints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Background Processing&lt;/strong&gt;: Essential for long-running tasks and happy users. It's a fundamental pattern for maintaining a responsive UI during intensive operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error Handling is Everything&lt;/strong&gt;: Assume everything will break, then build for it. Comprehensive error logging, user feedback, and recovery mechanisms are vital for production-ready applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Animation Library Nuances&lt;/strong&gt;: GSAP is powerful but has a steep learning curve. Don't underestimate it. We found that &lt;strong&gt;our experience with GSAP was quite poor, struggling with prompting for complex animations and debugging the resulting code.&lt;/strong&gt; This highlights a potential area for improvement in AI-generated animation code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Human Collaboration&lt;/strong&gt;: Bolt is a phenomenal co-pilot, but human logical thinking, detailed documentation, and the willingness to get your hands dirty are still paramount. The AI accelerates development, but human oversight ensures quality and correctness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI Component Library Selection&lt;/strong&gt;: While Shadcn UI is great, we learned that sometimes a "softer" UI aesthetic might be a better fit for certain projects. It's all about matching the vibe and user preferences, and exploring alternatives beyond the default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI Model Training Data&lt;/strong&gt;: For future AI projects, training on structured sample code (like &lt;a href="https://www.google.com/search?q=dycomps.oimmi.com" rel="noopener noreferrer"&gt;https://www.google.com/search?q=dycomps.oimmi.com&lt;/a&gt;) and real-world market projects would be invaluable for better AI understanding and output. &lt;strong&gt;This would provide more realistic and diverse examples, leading to more robust and accurate code generation and analysis.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔮 What's Next for QuantaCode (The Future is Bright... and Quantum)
&lt;/h3&gt;

&lt;p&gt;QuantaCode isn't just a hackathon project; it's a glimpse into the future of AI-powered development. We showed that quantum-level precision can meet intuitive user experience, even with the challenges of a rapid development cycle.&lt;/p&gt;

&lt;p&gt;The journey taught us that true innovation comes from embracing challenges, learning from every bug, and constantly iterating. Every line of code, every optimization, every polished feature brought us closer to our vision of quantum-level code intelligence.&lt;/p&gt;

&lt;p&gt;We're excited to continue enhancing our AI models, expanding our analysis capabilities, and exploring new intuitive ways for developers to interact with their code health insights. We envision a future where QuantaCode becomes an indispensable tool in every developer's arsenal, making code healthier, more secure, and easier to understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QuantaCode isn't just a hackathon project - it's a glimpse into the future of AI-powered development tools, where quantum-level precision meets exceptional user experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ (and a lot of coffee, and Bolt's help!) for the Bolt Hackathon 2024&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>hackathon</category>
      <category>ai</category>
      <category>brainrot</category>
    </item>
    <item>
      <title>My Trial by Fire: A Complete Chronicle of Setting Up OSO as a PLDG Cohort-3 Newcomer</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sun, 29 Jun 2025 12:31:25 +0000</pubDate>
      <link>https://dev.to/aldorax/my-trial-by-fire-a-complete-chronicle-of-setting-up-oso-as-a-pldg-cohort-3-newcomer-37ha</link>
      <guid>https://dev.to/aldorax/my-trial-by-fire-a-complete-chronicle-of-setting-up-oso-as-a-pldg-cohort-3-newcomer-37ha</guid>
      <description>&lt;h2&gt;
  
  
  Prologue: Joining the PLDG Family
&lt;/h2&gt;

&lt;p&gt;As I received my acceptance into Protocol Labs Developer Guild's Cohort-3, a mix of excitement and nervous energy coursed through me. Having chosen Open Source Observer (OSO) as one of my focus projects, I was eager to dive in. Little did I know that simply setting up the development environment would become an epic odyssey filled with technical challenges, small victories, and valuable lessons.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 1: The Installation Wars
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The UV Dilemma
&lt;/h3&gt;

&lt;p&gt;The documentation casually mentioned:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Install UV: The modern Python package manager OSO uses"  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;First Attempt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;uv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Result:&lt;/em&gt; The command ran without errors, but something felt off. When I tried using UV, I encountered strange permission errors and version conflicts.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Investigation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
After two hours (just kidding—I actually just clicked the link in the OSO documentation for UV), I discovered the &lt;a href="https://docs.astral.sh/uv/getting-started/installation/" rel="noopener noreferrer"&gt;official UV installation guide&lt;/a&gt;, which revealed the proper method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LsSf&lt;/span&gt; https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;The Moment of Truth:&lt;/em&gt; The installation script scrolled through my terminal, each line loading with anticipation. Would it work this time? The final "Installation complete" message brought immense relief.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
UV is a relatively new tool (launched in 2024) that's rapidly becoming the standard for Python projects. Its speed and reliability improvements over traditional pip make it worth the initial setup hassle.  &lt;/p&gt;
&lt;h3&gt;
  
  
  The DuckDB Installation Saga
&lt;/h3&gt;

&lt;p&gt;The next prerequisite was DuckDB, described as "SQLite for analytics." The installation seemed straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;duckdb  &lt;span class="c"&gt;# For macOS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But on my Linux machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;duckdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Lesson Learned:&lt;/em&gt; Always check the &lt;a href="https://duckdb.org/docs/installation/" rel="noopener noreferrer"&gt;official DuckDB installation docs&lt;/a&gt; for your specific OS—especially when dealing with tools you've never used before.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 2: The Missing Setup Revelation
&lt;/h2&gt;

&lt;p&gt;Now I had to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync
source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked! —At least, that's what I thought until I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run oso &lt;span class="nb"&gt;local &lt;/span&gt;sqlmesh-test &lt;span class="nt"&gt;--duckdb&lt;/span&gt; plan dev &lt;span class="nt"&gt;--start&lt;/span&gt; &lt;span class="s1"&gt;'1 week'&lt;/span&gt; &lt;span class="nt"&gt;--end&lt;/span&gt; now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Crash:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ModuleNotFoundError: No module named 'metrics_service'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Panic:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I spent hours (okay, less than one hour):  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checking Python versions
&lt;/li&gt;
&lt;li&gt;Verifying virtual environments
&lt;/li&gt;
&lt;li&gt;Re-reading the setup guide
&lt;/li&gt;
&lt;li&gt;Scouring GitHub issues for similar problems
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Breakthrough:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
While examining the project structure, I noticed the &lt;code&gt;pyproject.toml&lt;/code&gt; file. Aha! The project needed to be installed in development mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;The Magic:&lt;/em&gt; The &lt;code&gt;-e&lt;/code&gt; flag stands for "editable" mode, meaning:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changes to source files are immediately available
&lt;/li&gt;
&lt;li&gt;All dependencies are properly linked
&lt;/li&gt;
&lt;li&gt;The package is recognized system-wide
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why This Wasn't Obvious:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This step is second nature to experienced Python developers but rarely explained in project setup guides. For newcomers, it's a critical missing piece.  &lt;/p&gt;
&lt;h2&gt;
  
  
  Chapter 3: The GCP Initiation—Credit Cards and Courage
&lt;/h2&gt;

&lt;p&gt;When I first signed up for Google Cloud Platform (because OSO needed it), I approached it with the reckless abandon of a college student signing up for their first credit card. The process went something like this:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Innocent Beginning:&lt;/strong&gt; "Oh look, I can just use my Google account! How convenient!"
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Moment of Truth:&lt;/strong&gt; &lt;em&gt;"Add a payment method to continue"&lt;/em&gt; stared back at me like a bouncer at an exclusive club.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Rationalization:&lt;/strong&gt; "Well, they're offering $300 in free credit... that's basically free money, right?"
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, I had two options:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option A:&lt;/strong&gt; Carefully research GCP pricing, set up budget alerts, and monitor usage like a hawk
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option B:&lt;/strong&gt; YOLO it and see what happens
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guess which path I chose?  &lt;/p&gt;
&lt;h3&gt;
  
  
  My Actual Thought Process:
&lt;/h3&gt;

&lt;p&gt;"Ha! Let's see how far I can stretch this $300! If I accidentally burn through it all in one glorious inferno of cloud computing, that'll make a great story! (Note to readers: Please don't actually do this—we'll get to the responsible part later.)"  &lt;/p&gt;

&lt;p&gt;I clicked through the signup with the enthusiasm of someone who's never received an unexpected cloud bill, added my card (while mentally calculating how many months of ramen $300 could buy me as a backup plan), and was immediately rewarded with my shiny new GCP playground.  &lt;/p&gt;
&lt;h2&gt;
  
  
  The CLI Tool Tango
&lt;/h2&gt;

&lt;p&gt;With my new GCP account ready, I turned to the documentation like a pirate consulting a treasure map. The official &lt;a href="https://cloud.google.com/sdk/docs/install" rel="noopener noreferrer"&gt;gcloud CLI docs&lt;/a&gt; became my bible as I ran commands with the confidence of someone who absolutely knew what they were doing (I didn't).  &lt;/p&gt;
&lt;h3&gt;
  
  
  Installing gcloud CLI
&lt;/h3&gt;

&lt;p&gt;The first command failed spectacularly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud init
zsh: &lt;span class="nb"&gt;command &lt;/span&gt;not found: gcloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Installation Process:&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloaded the SDK:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-O&lt;/span&gt; https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Extracted and installed:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; google-cloud-cli-linux-x86_64.tar.gz
./google-cloud-sdk/install.sh &lt;span class="nt"&gt;--quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Updated my shell configuration:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'# Google Cloud SDK'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source /path/to/google-cloud-sdk/path.zsh.inc'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source /path/to/google-cloud-sdk/completion.zsh.inc'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Authentication Maze
&lt;/h3&gt;

&lt;p&gt;Running &lt;code&gt;gcloud init&lt;/code&gt; launched an interactive wizard:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Account Selection:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opened a browser window for signing in
&lt;/li&gt;
&lt;li&gt;Asked if I trusted gcloud—I said yes, and boom! Done, back to the terminal!
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project Configuration:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The same command prompted me with:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Pick cloud project to use:  
 &lt;span class="o"&gt;[&lt;/span&gt;1] &lt;span class="k"&gt;*****&lt;/span&gt;  
 &lt;span class="o"&gt;[&lt;/span&gt;2] &lt;span class="k"&gt;****&lt;/span&gt;  
 &lt;span class="o"&gt;[&lt;/span&gt;3] Enter a project ID  
 &lt;span class="o"&gt;[&lt;/span&gt;4] Create a new project  
Please enter numeric choice or text value &lt;span class="o"&gt;(&lt;/span&gt;must exactly match list item&lt;span class="o"&gt;)&lt;/span&gt;:  4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I entered &lt;code&gt;aldo-pldg-oso&lt;/code&gt;, and then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Your current project has been &lt;span class="nb"&gt;set &lt;/span&gt;to: &lt;span class="o"&gt;[&lt;/span&gt;aldo-pldg-oso].  

Not setting default zone/region &lt;span class="o"&gt;(&lt;/span&gt;this feature makes it easier to use  
&lt;span class="o"&gt;[&lt;/span&gt;gcloud compute] by setting an appropriate default value &lt;span class="k"&gt;for &lt;/span&gt;the  
&lt;span class="nt"&gt;--zone&lt;/span&gt; and &lt;span class="nt"&gt;--region&lt;/span&gt; flag&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;  
See https://cloud.google.com/compute/docs/gcloud-compute section on how to &lt;span class="nb"&gt;set  
&lt;/span&gt;default compute region and zone manually. If you would like &lt;span class="o"&gt;[&lt;/span&gt;gcloud init] to be  
able to &lt;span class="k"&gt;do &lt;/span&gt;this &lt;span class="k"&gt;for &lt;/span&gt;you the next &lt;span class="nb"&gt;time &lt;/span&gt;you run it, make sure the  
Compute Engine API is enabled &lt;span class="k"&gt;for &lt;/span&gt;your project on the  
https://console.developers.google.com/apis page.  

Created a default .boto configuration file at &lt;span class="o"&gt;[&lt;/span&gt;/home/aldy/.boto]. See this file and  
&lt;span class="o"&gt;[&lt;/span&gt;https://cloud.google.com/storage/docs/gsutil/commands/config] &lt;span class="k"&gt;for &lt;/span&gt;more  
information about configuring Google Cloud Storage.  
The Google Cloud CLI is configured and ready to use!  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Region Selection:&lt;/strong&gt;
Now I had to make sure the project was set:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud config get-value project  &lt;span class="c"&gt;# Should return "aldo-pldg-oso"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aldo-pldg-oso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, I needed to set the project ID in my shell for easy access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"aldo-pldg-oso"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical Step:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud auth application-default login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This created credentials at &lt;code&gt;~/.config/gcloud/application_default_credentials.json&lt;/code&gt;—the golden ticket for local development.  &lt;/p&gt;

&lt;p&gt;I also exported it for good measure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/gcloud/application_default_credentials.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Chapter 4: Service Account Security Theater
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating the Service Account
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud iam service-accounts create oso-local-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--display-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"OSO Local Development Account"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Permission Assignment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud projects add-iam-policy-binding aldo-pldg-oso &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"serviceAccount:oso-local-dev@aldo-pldg-oso.iam.gserviceaccount.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"roles/editor"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generating the Key File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud iam service-accounts keys create ~/oso-service-account-key.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--iam-account&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oso-local-dev@aldo-pldg-oso.iam.gserviceaccount.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Handling the Key:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Set the environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/oso-service-account-key.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Chapter 5: The BigQuery Showdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enabling the API
&lt;/h3&gt;

&lt;p&gt;After all this, I tried running OSO again but got this frustrating error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;403 BigQuery API has not been used in project ***** before or it is disabled.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;bigquery.googleapis.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud services list &lt;span class="nt"&gt;--enabled&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;bigquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bigquery.googleapis.com             BigQuery API  
bigqueryconnection.googleapis.com   BigQuery Connection API  
bigquerydatapolicy.googleapis.com   BigQuery Data Policy API  
bigquerymigration.googleapis.com    BigQuery Migration API  
bigqueryreservation.googleapis.com  BigQuery Reservation API  
bigquerystorage.googleapis.com      BigQuery Storage API  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing the Connection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bq &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;First Attempt:&lt;/em&gt; Success!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The empty result was beautiful—it meant everything was working.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 6: Final Victory
&lt;/h2&gt;

&lt;p&gt;With all pieces in place, the moment of truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oso &lt;span class="nb"&gt;local &lt;/span&gt;initialize
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output scrolled by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2025-06-29T12:23:51 - INFO - Loading opensource-observer.farcaster.profiles...  
2025-06-29T12:23:53 - INFO - Initialization complete!  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Celebration:&lt;/strong&gt; I may have done a little victory dance at this point.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue: Lessons for Future Cohort Members
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Documentation is a Starting Point:&lt;/strong&gt; Expect to supplement official guides with your own research.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Setup is Complex:&lt;/strong&gt; Budget significant time for authentication and service configuration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Messages are Gold:&lt;/strong&gt; Learn to read them carefully—they often contain the solution.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask Early:&lt;/strong&gt; The PLDG community is incredibly supportive—don't struggle alone.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Your Journey:&lt;/strong&gt; Your struggles will help the next cohort member.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources That Saved Me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;UV Documentation&lt;/a&gt; - Essential for understanding this new package manager.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://duckdb.org/docs/installation/" rel="noopener noreferrer"&gt;DuckDB Installation Guide&lt;/a&gt; - OS-specific instructions.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/docs/get-started" rel="noopener noreferrer"&gt;Google Cloud Quickstart&lt;/a&gt; - Great for understanding core concepts.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://packaging.python.org/" rel="noopener noreferrer"&gt;Python Packaging Guide&lt;/a&gt; - Explains editable installs and more.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This setup journey, while challenging, taught me more about modern development practices than any tutorial could have. The combination of new tools (UV), specialized databases (DuckDB), and cloud services (GCP) represents exactly the kind of real-world complexity we need to master as open-source contributors.  &lt;/p&gt;

&lt;p&gt;To my fellow cohort members: embrace the struggle. Each error resolved is a lesson learned, and every working setup is a victory worth celebrating. See you in the commits!  &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>linux</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why We Built FlowSpec: A Better Way to Orchestrate AI Workflows</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sat, 28 Jun 2025 21:47:34 +0000</pubDate>
      <link>https://dev.to/aldorax/why-we-built-flowspec-revolutionizing-our-workflow-engine-ml4</link>
      <guid>https://dev.to/aldorax/why-we-built-flowspec-revolutionizing-our-workflow-engine-ml4</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Emmanuel Appah, CTO of Auvra AI&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;At Auvra AI, we build sophisticated automation systems for trading bots, content generation, and AI reasoning. Like many developers, we initially used platforms like &lt;strong&gt;n8n&lt;/strong&gt;—but we quickly hit limitations that forced us to rethink workflow orchestration from the ground up.  &lt;/p&gt;

&lt;p&gt;That’s why &lt;strong&gt;my teammate &lt;a href="https://dev.to/mannyuncharted"&gt;Emmanuel Akanji&lt;/a&gt; and I created FlowSpec&lt;/strong&gt;, a next-generation workflow language designed specifically for AI and high-performance automation.  &lt;/p&gt;

&lt;p&gt;Here’s why it’s fundamentally better than JSON-based systems like n8n’s.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem with JSON-Based Workflows&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Platforms like n8n rely on JSON to define workflows. While this works for simple tasks, we encountered three critical limitations when building advanced AI pipelines:  &lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Spaghetti Connections&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;JSON forces you to define every connection manually. For example, branching a workflow to 3 destinations requires repetitive edge definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Node A"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node C"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes &lt;strong&gt;unmanageable&lt;/strong&gt; at scale.  &lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;No Native Support for AI Patterns&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic ports&lt;/strong&gt; (e.g., generating inputs/outputs based on data) require hacky workarounds.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loops and retries&lt;/strong&gt; must be manually implemented.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No type safety&lt;/strong&gt;—runtime errors from mismatched data are common.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Poor Performance at Scale&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Parsing large JSON workflows is slow, and execution is linear by default—no built-in parallelism.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;FlowSpec: A Language Built for AI Workflows&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;FlowSpec solves these problems with a &lt;strong&gt;YAML-based DSL&lt;/strong&gt; optimized for AI/media automation.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Clean, Declarative Syntax&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Compare n8n’s JSON to FlowSpec for the same branching logic:  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;n8n (JSON)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;lines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nested&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;arrays&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;FlowSpec (YAML)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;branch_example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_a.output&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;node_b.input&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;node_c.input&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;node_d.input&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;70% less code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Native AI/Media Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Dynamic Ports&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;audio_mixer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;multi_speaker&lt;/span&gt;
  &lt;span class="na"&gt;dynamic_inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;speakers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;script.speaker_count&lt;/span&gt;  &lt;span class="c1"&gt;# Auto-create ports&lt;/span&gt;
      &lt;span class="na"&gt;port_template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;speaker_{index}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Built-in Loops &amp;amp; Retries&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;process_retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;transcriber.output&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validator.input&lt;/span&gt;
    &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;max_attempts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Type Safety&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;nodes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gpt_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt; 
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;markdown&lt;/span&gt;
        &lt;span class="na"&gt;min_length&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;  &lt;span class="c1"&gt;# Validation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Performance Optimizations&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parallel execution&lt;/strong&gt; by default
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority controls&lt;/strong&gt; for critical paths
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5x faster parsing&lt;/strong&gt; than JSON
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Real-World Impact at Auvra AI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since adopting FlowSpec:&lt;br&gt;&lt;br&gt;
🚀 &lt;strong&gt;40% faster development&lt;/strong&gt; of new workflows&lt;br&gt;&lt;br&gt;
🔧 &lt;strong&gt;90% fewer runtime errors&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
📈 &lt;strong&gt;3x more scalable&lt;/strong&gt; (100+ node workflows)  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Our trading bot’s workflow shrank from &lt;strong&gt;45 lines of n8n JSON&lt;/strong&gt; to &lt;strong&gt;20 lines of FlowSpec&lt;/strong&gt; with better error handling.  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;n8n (JSON)&lt;/th&gt;
&lt;th&gt;FlowSpec (YAML)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lines of Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45+&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Branching Logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual edges&lt;/td&gt;
&lt;td&gt;Native syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~500ms/node&lt;/td&gt;
&lt;td&gt;~100ms/node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Try FlowSpec Today&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We’re open-sourcing FlowSpec soon. Follow &lt;strong&gt;&lt;a href="https://dev.to/mannyuncharted"&gt;Emmanuel Akanji&lt;/a&gt;&lt;/strong&gt; for updates or try it at &lt;strong&gt;&lt;a href="https://auvraai.net" rel="noopener noreferrer"&gt;auvraai.net&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;For developers battling workflow complexity&lt;/strong&gt;: Sometimes the solution isn’t another platform—it’s a better language.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;— Emmanuel Appah, CTO of Auvra AI&lt;/em&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Key Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;✔ JSON-based tools like n8n &lt;strong&gt;fail at scale&lt;/strong&gt; for AI workflows.&lt;br&gt;
✔ FlowSpec combines &lt;strong&gt;YAML’s readability&lt;/strong&gt; with &lt;strong&gt;AI-specific features&lt;/strong&gt;.&lt;br&gt;
✔ Results: &lt;strong&gt;Faster dev, fewer errors, and enterprise scalability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What workflow challenges are you facing? Let’s discuss below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>auvraai</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Fixed GitHub's Large File Warning with Git LFS for Auvra AI</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sat, 28 Jun 2025 21:33:37 +0000</pubDate>
      <link>https://dev.to/aldorax/how-i-fixed-githubs-large-file-warning-with-git-lfs-for-auvra-ai-3mo8</link>
      <guid>https://dev.to/aldorax/how-i-fixed-githubs-large-file-warning-with-git-lfs-for-auvra-ai-3mo8</guid>
      <description>&lt;h2&gt;
  
  
  The Warning That Started It All
&lt;/h2&gt;

&lt;p&gt;When pushing updates to my Auvra AI project, I encountered this alarming message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;remote: warning: File public/hero.mp4 is 50.96 MB; this is larger than GitHub's recommended maximum file size of 50.00 MB
remote: warning: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite the warning, GitHub actually accepted my 50.96MB file (slightly over the limit), but I knew this wasn't a sustainable solution as I'd soon need to add even larger files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The False Start: Git LFS Not Installed
&lt;/h2&gt;

&lt;p&gt;My first attempt to use Git LFS failed spectacularly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git lfs install
git: 'lfs' is not a git command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This taught me an important lesson: &lt;strong&gt;Git LFS is a separate tool that needs to be installed&lt;/strong&gt;, not something that comes bundled with Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Git LFS on Ubuntu
&lt;/h2&gt;

&lt;p&gt;After some research, I found the most reliable installation method for my Ubuntu system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git-lfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installation process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Added the Git LFS repository to my package sources&lt;/li&gt;
&lt;li&gt;Updated my package lists&lt;/li&gt;
&lt;li&gt;Installed the &lt;code&gt;git-lfs&lt;/code&gt; package (which was about 3.9MB)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting Up Git LFS for Video Files
&lt;/h2&gt;

&lt;p&gt;With Git LFS installed, I configured it to handle my large MP4 files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git lfs track &lt;span class="s2"&gt;"*.mp4"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a &lt;code&gt;.gitattributes&lt;/code&gt; file (if it didn't exist)&lt;/li&gt;
&lt;li&gt;Added a rule to handle all MP4 files with LFS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I then committed this configuration change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .gitattributes
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Configure Git LFS for MP4 files"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Magic of LFS in Action
&lt;/h2&gt;

&lt;p&gt;When I added and committed my hero.mp4 video:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add public/hero.mp4
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add hero video"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The push was now handled differently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uploading LFS objects: 100% (1/1), 53 MB | 218 KB/s, done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The file was uploaded separately via LFS&lt;/li&gt;
&lt;li&gt;The main Git push only transferred 527 bytes (just the pointer file)&lt;/li&gt;
&lt;li&gt;No more size warnings from GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Solution Works
&lt;/h2&gt;

&lt;p&gt;Git LFS replaces large files with text pointers in your Git history. For my hero.mp4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version https://git-lfs.github.com/spec/v1
oid sha256:4d7a...f4c5
size 53456789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual file content is stored in LFS storage and downloaded only when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Git has limits&lt;/strong&gt;: While it pushed my 50.96MB file, this was cutting it close&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LFS needs explicit installation&lt;/strong&gt;: It's not part of standard Git&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration is simple&lt;/strong&gt;: Just track file patterns and commit normally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better for repository health&lt;/strong&gt;: Keeps the main Git history lightweight&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Personal Reflection: Git LFS Saved My Project, But It's Not Ideal
&lt;/h3&gt;

&lt;p&gt;Let me be honest - while Git LFS solved my immediate problem with pushing large files to GitHub, the whole experience left me with mixed feelings. Here's my real take:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Relief Was Temporary
&lt;/h2&gt;

&lt;p&gt;That moment when I saw "Uploading LFS objects: 100% (1/1), 53 MB" felt like a victory. But later, I realized I'd just kicked the can down the road. Now I have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor my LFS storage quota (GitHub gives you just 1GB free)&lt;/li&gt;
&lt;li&gt;Ensure every team member has LFS installed&lt;/li&gt;
&lt;li&gt;Deal with slower clones because of additional LFS fetching&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hidden Costs Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;What they don't tell you about Git LFS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It's not truly version controlled&lt;/strong&gt; - LFS stores single versions of files, not full history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration headaches&lt;/strong&gt; - New contributors often forget to install LFS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup complications&lt;/strong&gt; - Your important assets now live in a separate storage system&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  "There Has to Be a Better Way" Moments
&lt;/h2&gt;

&lt;p&gt;While wrestling with LFS, I kept thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maybe I shouldn't version control binary assets at all&lt;/li&gt;
&lt;li&gt;Perhaps cloud storage (S3, GCS) with versioning would be better&lt;/li&gt;
&lt;li&gt;Maybe my 50MB hero video should be compressed or hosted elsewhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;For Auvra AI, Git LFS was the pragmatic choice today, but I'm not convinced it's the right architectural decision long-term. The fact that I had to use it feels like a symptom of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor asset pipeline planning on my part&lt;/li&gt;
&lt;li&gt;Trying to force Git to do something it wasn't designed for&lt;/li&gt;
&lt;li&gt;Not properly separating code from media assets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Moving Forward
&lt;/h2&gt;

&lt;p&gt;My personal takeaway? Git LFS is a band-aid, not a cure. For my next project, I'll:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Design my asset pipeline first&lt;/li&gt;
&lt;li&gt;Consider dedicated asset hosting for large files&lt;/li&gt;
&lt;li&gt;Only use Git for what it's best at - versioning code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have you faced similar dilemmas? I'd love to hear how others balance convenience with proper architecture when dealing with large files.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>git</category>
      <category>githunt</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>✨ Supercharging Your FastAPI Documentation with Scalar</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sat, 26 Apr 2025 02:11:40 +0000</pubDate>
      <link>https://dev.to/aldorax/supercharging-your-fastapi-documentation-with-scalar-3g5o</link>
      <guid>https://dev.to/aldorax/supercharging-your-fastapi-documentation-with-scalar-3g5o</guid>
      <description>&lt;p&gt;FastAPI is famous for its &lt;strong&gt;blazing speed&lt;/strong&gt; and &lt;strong&gt;auto-generated documentation&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Out of the box, it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swagger UI at &lt;code&gt;/docs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ReDoc UI at &lt;code&gt;/redoc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here’s the thing:&lt;br&gt;&lt;br&gt;
If you want your API to &lt;strong&gt;feel polished&lt;/strong&gt;, &lt;strong&gt;developer-friendly&lt;/strong&gt;, and &lt;strong&gt;production-ready&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
you need &lt;strong&gt;better documentation&lt;/strong&gt; than just the basics.&lt;/p&gt;

&lt;p&gt;Today, I’ll show you how to use &lt;code&gt;scalar-fastapi&lt;/code&gt; to create &lt;strong&gt;beautiful, customizable API docs&lt;/strong&gt; — and why great documentation is as important as great code.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 The Problem with Default Swagger Docs
&lt;/h2&gt;

&lt;p&gt;Swagger is great for getting started, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;strong&gt;plain&lt;/strong&gt; and &lt;strong&gt;developer playground-like&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It doesn't &lt;strong&gt;scale&lt;/strong&gt; visually when you have 50+ endpoints&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;lacks branding&lt;/strong&gt; — it doesn't feel like &lt;em&gt;your&lt;/em&gt; product&lt;/li&gt;
&lt;li&gt;First impressions matter — &lt;strong&gt;messy docs = perceived messy product&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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


&lt;h2&gt;
  
  
  🚀 Meet &lt;code&gt;scalar-fastapi&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/scalar/scalar/blob/main/integrations/fastapi/README.md" rel="noopener noreferrer"&gt;&lt;code&gt;scalar-fastapi&lt;/code&gt;&lt;/a&gt; is a sweet package that upgrades your FastAPI documentation experience instantly.&lt;/p&gt;

&lt;p&gt;It turns your OpenAPI schema into a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beautifully designed API reference&lt;/li&gt;
&lt;li&gt;Modern, responsive UI&lt;/li&gt;
&lt;li&gt;Developer-first experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the best part?&lt;br&gt;&lt;br&gt;
It takes just a few lines of code to integrate.&lt;/p&gt;


&lt;h2&gt;
  
  
  📦 How To Set It Up
&lt;/h2&gt;

&lt;p&gt;First, install Scalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;scalar-fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now update your &lt;code&gt;main.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.core.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.api.v1&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;v1_router&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scalar_fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_scalar_api_reference&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1_router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_V1_STR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to the FastAPI backend!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/scalar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_in_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scalar_html&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get_scalar_api_reference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;openapi_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openapi_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ That’s it — now visiting &lt;code&gt;/scalar&lt;/code&gt; will show you the &lt;strong&gt;upgraded docs&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 Before and After — Visual Impact
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Swagger UI (default)&lt;/th&gt;
&lt;th&gt;Scalar API UI (better)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Messy when large&lt;/td&gt;
&lt;td&gt;Clean and scalable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limited customization&lt;/td&gt;
&lt;td&gt;Full branding support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feels like a demo project&lt;/td&gt;
&lt;td&gt;Feels like a real product&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A small upgrade that &lt;strong&gt;changes the entire experience&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 Full Configuration Options (Explained)
&lt;/h2&gt;

&lt;p&gt;Scalar gives you &lt;strong&gt;serious control&lt;/strong&gt; over how your docs look and behave:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What It Controls&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Layout.MODERN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Layout style (&lt;code&gt;MODERN&lt;/code&gt;, &lt;code&gt;CLASSIC&lt;/code&gt;, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show_sidebar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether the left sidebar is visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hide_download_button&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hides the "Download OpenAPI Spec" button&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hide_models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hides the models/schemas section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dark_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dark mode by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_hot_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SearchHotKey.K&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Keyboard shortcut for search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hidden_clients&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hide specific SDK clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;servers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define multiple server environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default_open_all_tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expand all tags by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;authentication&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pre-configure API authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔥 Example: Fully Customized Scalar UI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scalar_fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_scalar_api_reference&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SearchHotKey&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/scalar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_in_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scalar_html&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get_scalar_api_reference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;openapi_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openapi_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My Awesome API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CLASSIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;show_sidebar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;hide_download_button&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;hide_models&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dark_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;search_hot_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchHotKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.production.example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.staging.example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;default_open_all_tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bearerAuth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-static-token-if-needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Boom&lt;/strong&gt; — your docs now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Match your brand&lt;/li&gt;
&lt;li&gt;Show your production &amp;amp; staging servers&lt;/li&gt;
&lt;li&gt;Look polished out of the box&lt;/li&gt;
&lt;/ul&gt;

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




&lt;h2&gt;
  
  
  🌍 Bonus: Deploying Your Public Docs
&lt;/h2&gt;

&lt;p&gt;After setting up Scalar, you might want to expose your API docs nicely.&lt;/p&gt;

&lt;p&gt;Here are two easy ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Deploy&lt;/strong&gt;: Serve your FastAPI app inside a Docker container behind nginx.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Deploy&lt;/strong&gt;: Push it to AWS, Koyeb or DigitalOcean for HTTPS and autoscaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI + Scalar scales to &lt;strong&gt;real production traffic&lt;/strong&gt; easily.&lt;/p&gt;




&lt;h2&gt;
  
  
  📣 Why Beautiful API Docs Matter
&lt;/h2&gt;

&lt;p&gt;Good docs aren't just about looking nice:&lt;/p&gt;

&lt;p&gt;✅ They &lt;strong&gt;save onboarding time&lt;/strong&gt; for new devs&lt;br&gt;&lt;br&gt;
✅ They &lt;strong&gt;reduce mistakes&lt;/strong&gt; using the API&lt;br&gt;&lt;br&gt;
✅ They &lt;strong&gt;build trust&lt;/strong&gt; in your platform&lt;br&gt;&lt;br&gt;
✅ They &lt;strong&gt;differentiate&lt;/strong&gt; you from lazy competitors&lt;/p&gt;

&lt;p&gt;In real startups and production teams, &lt;strong&gt;beautiful docs = better adoption&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
That's why companies like Stripe, Twilio, and Shopify invest heavily into theirs.&lt;/p&gt;




&lt;h1&gt;
  
  
  🏁 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;✅ If you're serious about building professional APIs&lt;br&gt;&lt;br&gt;
✅ If you care about other developers using your platform&lt;br&gt;&lt;br&gt;
✅ If you want to stand out&lt;/p&gt;

&lt;p&gt;Then upgrading your FastAPI docs with Scalar is one of the &lt;strong&gt;easiest, most impactful things&lt;/strong&gt; you can do today.&lt;/p&gt;

&lt;p&gt;It takes &lt;strong&gt;5 minutes&lt;/strong&gt;, but leaves a &lt;strong&gt;permanent pro impression&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 What's Next?
&lt;/h1&gt;

&lt;p&gt;In the next part of this series, I’ll show how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tag your endpoints&lt;/strong&gt; for even cleaner documentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add authentication flows (JWT, OAuth) to your docs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customize OpenAPI metadata&lt;/strong&gt; (terms, license, support contacts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned — we’re building &lt;strong&gt;real production-ready APIs&lt;/strong&gt;! 🎯&lt;/p&gt;




&lt;h1&gt;
  
  
  ✍️ Final CTA
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you enjoyed this guide, connect with me on &lt;a href="https://www.linkedin.com/in/emmanuel-appah-53a5a8207" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more full-stack engineering, and developer experience tips!" 🚀&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>🚀 How to Build a Scalable FastAPI Backend with Docker and Versioned APIs — The Right Way (Opinionated)</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sat, 26 Apr 2025 02:00:05 +0000</pubDate>
      <link>https://dev.to/aldorax/how-to-build-a-scalable-fastapi-backend-with-docker-and-versioned-apis-the-right-way-37b1</link>
      <guid>https://dev.to/aldorax/how-to-build-a-scalable-fastapi-backend-with-docker-and-versioned-apis-the-right-way-37b1</guid>
      <description>&lt;p&gt;FastAPI makes it &lt;em&gt;easy&lt;/em&gt; to get started with APIs.&lt;br&gt;&lt;br&gt;
But when you're thinking about &lt;strong&gt;building real projects&lt;/strong&gt; — projects that might one day be used by thousands of users — &lt;strong&gt;structure&lt;/strong&gt; and &lt;strong&gt;scalability&lt;/strong&gt; matter from day one.&lt;/p&gt;

&lt;p&gt;In this post, I'll show you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to structure your FastAPI project cleanly&lt;/li&gt;
&lt;li&gt;How to organize &lt;strong&gt;versioned routes&lt;/strong&gt; (so you can evolve your API over time)&lt;/li&gt;
&lt;li&gt;Why using &lt;strong&gt;Docker&lt;/strong&gt; even for small apps saves you headaches later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear explanations&lt;/strong&gt; for every design decision (not just code)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📦 Why Structure Matters
&lt;/h2&gt;

&lt;p&gt;When you first start, it’s tempting to put everything in a &lt;code&gt;main.py&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
And that’s fine — &lt;em&gt;at first&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
But as soon as your app grows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It becomes &lt;strong&gt;hard to maintain&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You can’t version your API easily&lt;/li&gt;
&lt;li&gt;Adding new features becomes &lt;strong&gt;a mess&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why we’ll set up a &lt;strong&gt;modular&lt;/strong&gt;, &lt;strong&gt;versioned&lt;/strong&gt;, &lt;strong&gt;dockerized&lt;/strong&gt; FastAPI app — from the start.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗 Project Structure (Professional Layout)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi-app/
├── app/
│   ├── api/
│   │   ├── v1/
│   │   │   ├── endpoints/
│   │   │   │   ├── users.py
│   │   │   │   └── items.py
│   │   │   └── __init__.py
│   │   └── __init__.py
│   ├── core/
│   │   ├── config.py
│   │   └── __init__.py
│   ├── main.py
│   └── __init__.py
├── Dockerfile
├── requirements.txt
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why this structure?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;app/api/v1/&lt;/strong&gt;: all your routes go here, grouped by version (easy to maintain APIs even if your app lives 5+ years)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;endpoints/&lt;/strong&gt;: split your functionality logically — &lt;code&gt;users.py&lt;/code&gt; for user routes, &lt;code&gt;items.py&lt;/code&gt; for item routes, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;core/&lt;/strong&gt;: keep your app-wide configuration (env vars, settings) separate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;main.py&lt;/strong&gt;: the real entry point — it brings everything together cleanly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good structure = easier scaling, faster onboarding of new developers, and fewer bugs over time.&lt;/p&gt;


&lt;h2&gt;
  
  
  🐍 Building the FastAPI App
&lt;/h2&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We keep dependencies lightweight to start. Later, you’ll add things like SQLAlchemy, Alembic, etc.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;app/core/config.py&lt;/code&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FastAPI App&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;API_V1_STR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Why?&lt;br&gt;&lt;br&gt;
Instead of hardcoding paths like &lt;code&gt;/api/v1/&lt;/code&gt; everywhere, we &lt;strong&gt;centralize&lt;/strong&gt; configuration in one place.&lt;br&gt;&lt;br&gt;
Later, you can add database URLs, secrets, CORS configs here too.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;app/api/v1/endpoints/users.py&lt;/code&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Why use an APIRouter?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routers keep related endpoints grouped together&lt;/li&gt;
&lt;li&gt;Easier to &lt;strong&gt;version&lt;/strong&gt;, &lt;strong&gt;test&lt;/strong&gt;, and &lt;strong&gt;maintain&lt;/strong&gt; in the long run&lt;/li&gt;
&lt;li&gt;You can apply middlewares, auth, and permissions &lt;em&gt;per-router&lt;/em&gt; later&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;app/api/v1/endpoints/items.py&lt;/code&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;book&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;laptop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;app/api/v1/__init__.py&lt;/code&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.api.v1.endpoints&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Why a central router?&lt;br&gt;&lt;br&gt;
Instead of cluttering &lt;code&gt;main.py&lt;/code&gt;, we import and group all v1 routes here neatly.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;app/main.py&lt;/code&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.core.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.api.v1&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;v1_router&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1_router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_V1_STR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to the FastAPI backend!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;root path&lt;/strong&gt; gives a basic welcome message.&lt;/li&gt;
&lt;li&gt;We attach all versioned routes under &lt;code&gt;/api/v1&lt;/code&gt;, easily expandable to &lt;code&gt;/api/v2&lt;/code&gt; someday without chaos.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🐳 Why Docker?
&lt;/h2&gt;

&lt;p&gt;Even if you're just starting, &lt;strong&gt;Docker&lt;/strong&gt; brings 3 huge benefits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same environment everywhere (local, staging, production)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No \"works on my machine\" problems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment Ready&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You're always 1 &lt;code&gt;docker build&lt;/code&gt; away from deploying&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  📄 Dockerfile
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="c"&gt;# Set working directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Copy app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; app ./app&lt;/span&gt;

&lt;span class="c"&gt;# Run app&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why this Dockerfile?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.11 slim&lt;/strong&gt; image = fast and minimal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workdir &lt;code&gt;/app&lt;/code&gt;&lt;/strong&gt; = standard for small backend services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-cache pip install&lt;/strong&gt; = smaller image sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uvicorn reload mode&lt;/strong&gt; = fast development cycles&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🏃‍♂️ Running the App
&lt;/h2&gt;

&lt;p&gt;Local dev:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; fastapi-app &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 fastapi-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access your app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://localhost:8000/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;http://localhost:8000/docs&lt;/code&gt; (beautiful auto Swagger UI)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Versioning Early?
&lt;/h2&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/api/v1/&lt;/code&gt; is live with 10,000 users&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;change your API behavior&lt;/strong&gt; — without breaking old clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With versioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You simply create &lt;code&gt;/api/v2/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Clients who want the new features switch to v2&lt;/li&gt;
&lt;li&gt;Older apps can keep using v1 safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is how &lt;strong&gt;real companies&lt;/strong&gt; (Stripe, Twilio, etc.) handle their APIs.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;✅ Structured project = easier scaling&lt;br&gt;&lt;br&gt;
✅ Versioned APIs = future-proofing your backend&lt;br&gt;&lt;br&gt;
✅ Docker = production readiness from day one&lt;/p&gt;

&lt;p&gt;FastAPI gives you the speed of development — &lt;strong&gt;but your structure is what keeps your project alive long-term&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this setup, in the next post I'll show you how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;strong&gt;JWT Authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Connect to a real &lt;strong&gt;PostgreSQL Database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Write &lt;strong&gt;tests&lt;/strong&gt; to make your app production-grade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned! 🎯&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Scaling Client-Side Search: 100,000 Users, Skills, and Real-Time Filtering in React</title>
      <dc:creator>Aldorax</dc:creator>
      <pubDate>Sat, 26 Apr 2025 01:30:18 +0000</pubDate>
      <link>https://dev.to/aldorax/scaling-client-side-search-100000-users-skills-and-real-time-filtering-in-react-58i</link>
      <guid>https://dev.to/aldorax/scaling-client-side-search-100000-users-skills-and-real-time-filtering-in-react-58i</guid>
      <description>&lt;p&gt;Today, I came across a post on dev.to from &lt;a href="https://dev.to/fpaghar"&gt;Fatemeh Paghar&lt;/a&gt; on using useTransition and react-window. I decided to push a typical React search/filter UI to the extreme by scaling it up to handle &lt;strong&gt;100,000 users&lt;/strong&gt; — not a typo — &lt;strong&gt;one hundred thousand records&lt;/strong&gt; client-side.&lt;/p&gt;

&lt;p&gt;Instead of simple emails, each user now has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;name&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;skillset&lt;/strong&gt; (e.g., React, Python, AWS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make it even more interesting, I added a second search field — but with a twist:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You must &lt;strong&gt;first&lt;/strong&gt; search by &lt;strong&gt;name&lt;/strong&gt; before the &lt;strong&gt;skill search&lt;/strong&gt; field becomes active.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠 How It Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First input&lt;/strong&gt;: Search by &lt;strong&gt;name&lt;/strong&gt; (e.g., “Alice”, “Bob”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Second input&lt;/strong&gt;: Search by &lt;strong&gt;skill&lt;/strong&gt; (e.g., “React”, “Rust”), but it remains &lt;strong&gt;disabled&lt;/strong&gt; until a name is entered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once a name is typed, the skill search input unlocks and users can further refine their search.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ First: The Basic Naive Version (No Optimization)
&lt;/h2&gt;

&lt;p&gt;Let's look at a simple implementation first — &lt;strong&gt;without&lt;/strong&gt; &lt;code&gt;react-window&lt;/code&gt; and &lt;strong&gt;without&lt;/strong&gt; &lt;code&gt;useMemo&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useTransition&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generateUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Charlie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;David&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eve&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Frank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Grace&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Helen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Python&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Node.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Django&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rust&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Go&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Flutter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AWS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BasicMassiveSearch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNameQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSkillQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTransition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleNameSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setNameQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSkillSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSkillQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usersData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matchesName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;matchesName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-6"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold mb-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Simple Skill Search&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleNameSearch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search by name..."&lt;/span&gt;
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"border p-2 mb-4 block w-full"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSkillSearch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search by skill..."&lt;/span&gt;
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"border p-2 mb-4 block w-full"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"italic text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Filtering...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"italic text-gray-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;No users found.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-2 border-b"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-bold"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-gray-600"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skill&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  😵 Problems With This Naive Version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Virtualization&lt;/strong&gt;:
Every single result (up to 100,000 DOM elements) renders at once.
➔ Browser lags, page freezes, and scrolling becomes painful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Memoization&lt;/strong&gt;:
Every re-render recomputes &lt;code&gt;.filter()&lt;/code&gt; unnecessarily.
➔ Causes &lt;strong&gt;typing delays&lt;/strong&gt; as the dataset grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance collapse&lt;/strong&gt;:
Mobile users and low-end laptops will suffer first.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Now: The Optimized Version (Virtualized + Memoized)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useTransition&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FixedSizeList&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-window&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generateUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Charlie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;David&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eve&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Frank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Grace&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Helen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Python&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Node.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Django&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rust&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Go&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Flutter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AWS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MassiveSkillSearch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNameQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSkillQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTransition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;searchDuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSearchDuration&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lowerName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lowerSkill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usersData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matchesName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;matchesName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerSkill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerSkill&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setSearchDuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleNameSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setNameQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSkillSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSkillQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CSSProperties&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-3 border-b border-green-100 hover:bg-green-50"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-medium text-gray-800"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-gray-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skill&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-6"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold mb-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;🧠 Skillset Search (Virtualized)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleNameSearch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search by name..."&lt;/span&gt;
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"border p-2 mb-4 block w-full"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;skillQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSkillSearch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;nameQuery&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search by skill..."&lt;/span&gt;
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"border p-2 mb-4 block w-full"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"italic text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Filtering...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"italic text-gray-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;No users found.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;itemCount&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;itemSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Row&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 text-sm text-gray-600 text-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Total users: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;usersData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Filtered users: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Last search took: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;searchDuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; ms&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Searching...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Idle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 What Changed — Why It Matters
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Basic Version&lt;/th&gt;
&lt;th&gt;Optimized Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rendering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100,000 real DOM nodes&lt;/td&gt;
&lt;td&gt;Only ~20 visible DOM nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Filtering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recalculates &lt;code&gt;.filter()&lt;/code&gt; every render&lt;/td&gt;
&lt;td&gt;Memorized with &lt;code&gt;useMemo&lt;/code&gt;, recalculates only when query changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scrolling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Laggy and crash-prone&lt;/td&gt;
&lt;td&gt;Smooth and buttery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Freezes momentarily on big datasets&lt;/td&gt;
&lt;td&gt;Remains fluid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very high&lt;/td&gt;
&lt;td&gt;Low and efficient&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏁 Final Verdict
&lt;/h2&gt;

&lt;p&gt;✅ If you are &lt;strong&gt;just prototyping&lt;/strong&gt; or handling &lt;strong&gt;small datasets (few hundred items)&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
you &lt;strong&gt;can survive&lt;/strong&gt; without virtualization and memoization.&lt;/p&gt;

&lt;p&gt;❗ But the moment you deal with &lt;strong&gt;tens of thousands&lt;/strong&gt; of records (or more),&lt;br&gt;&lt;br&gt;
you &lt;strong&gt;must&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtualize large lists&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useMemo&lt;/code&gt; smartly&lt;/li&gt;
&lt;li&gt;Possibly move search server-side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise, your app will become unusable — fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Closing Note
&lt;/h2&gt;

&lt;p&gt;React gives you amazing flexibility, but &lt;strong&gt;scale tests your architecture&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Always think about &lt;strong&gt;memory, CPU, and user experience&lt;/strong&gt; as you grow datasets!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
