<?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>DUMB DEV Community</title>
    <description>The most recent home feed on DUMB DEV Community.</description>
    <link>https://dumb.dev.to</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dumb.dev.to/feed"/>
    <language>en</language>
    <item>
      <title>Google Antigravity 1.0 to 2.0/IDE Quick Migration Guide</title>
      <dc:creator>Regnard Raquedan</dc:creator>
      <pubDate>Fri, 22 May 2026 18:24:09 +0000</pubDate>
      <link>https://dumb.dev.to/gde/google-antigravity-10-to-20ide-quick-migration-guide-35p5</link>
      <guid>https://dumb.dev.to/gde/google-antigravity-10-to-20ide-quick-migration-guide-35p5</guid>
      <description>&lt;p&gt;Like many &lt;a href="https://antigravity.google" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt; users, I was very excited about the &lt;a href="https://antigravity.google/blog/google-io-2026" rel="noopener noreferrer"&gt;Antigravity 2.0&lt;/a&gt; announcement at Google I/O 2026.&lt;/p&gt;

&lt;p&gt;Who would't be enthusiastic about the new cost efficient Gemini 3.5 Flash? Plus, a standalone desktop app form factor that seems to rival Claude Code and OpenAI Codex at that! &lt;/p&gt;

&lt;p&gt;There are a lot of great things to be eager to try it out but I want to provide some pointers in the upgrade and migration to save you some headaches and hassles later.&lt;/p&gt;

&lt;p&gt;The upgrade path from Antigravity 1.0 to 2.0 is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;At the Antigravity 1.0 user interface, there should be a button that asks you to restart the app to update.&lt;/li&gt;
&lt;li&gt;Follow the steps to install Antigravity 2.0, including logging into your Google account linked to the app.&lt;/li&gt;
&lt;li&gt;There's a call-out to install Antigravity IDE in addition to 2.0.&lt;/li&gt;
&lt;li&gt;When you're done with the upgrade, you will be asked about customizations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now here's the key point: Antigravity 2.0 is a huge departure from 1.0 in the sense that it is functionally no longer based on Microsoft's &lt;a href="https://github.com/microsoft/vscode" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;. That means a huge majority of all the personalizations from 1.0 will not carry over to 2.0.&lt;/p&gt;

&lt;p&gt;Yes, there was a quick patch that would let you import your customizations, including a migration flow that allows users to import settings, extensions, and keybindings from Antigravity 1.0. (Imagine a very eager person like me making the upgrade before this patch was applied). However any history and past work you've done in extensions like Claude, Cline, and Codex will not be carried over. Even your work history with the Gemini agents in 1.0 will not be ported.&lt;/p&gt;

&lt;p&gt;If you want to retain as much information from your 1.0 setup, here's the playbook I wish I'd had on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Back up before you click update.&lt;/strong&gt; Specifically, copy &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; somewhere safe. The migration has a known quirk where past conversations, scratch space, and agent brain entries get stranded in &lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt; rather than carried into the new app. If you've already updated and your chat history looks gone, it isn't — that's where it went. You can rsync the backup directory back into &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; (skip &lt;code&gt;mcp_config.json&lt;/code&gt;, you want the new one) and restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Say yes to installing the Antigravity IDE alongside 2.0.&lt;/strong&gt; The IDE isn't being sunset — it's positioned as a sibling product, still maintained, still the VS Code fork you remember. That's where your keybindings, extensions, and editor muscle memory live. The cleanest mental model: 2.0 is for agent orchestration, the IDE is for everything VS Code-shaped you already do. Just don't run both against the same working tree simultaneously — you'll fight yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If 2.0 isn't your speed yet, you can stay on the IDE.&lt;/strong&gt; Uninstall 2.0, install Antigravity IDE 1.23.2 from the releases page, set updates to manual. There's no forced migration deadline on the IDE side — the &lt;a href="https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/" rel="noopener noreferrer"&gt;deprecation pressure&lt;/a&gt; is on Gemini CLI users (June 18, 2026), not Antigravity IDE users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mental note that helped me most:&lt;/strong&gt; this isn't a version bump. It's Google shipping a second product that shares a name with the first. Your 1.0 work doesn't need to migrate — it needs to coexist. Once I stopped expecting parity and started treating 2.0 as a new tool in the kit, I felt better about this (but still licking my wounds from the re-work and missing stuff).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Don't Make the Agent Re-Run the Test Suite to Find the Failure</title>
      <dc:creator>Ian Johnson</dc:creator>
      <pubDate>Fri, 22 May 2026 18:22:38 +0000</pubDate>
      <link>https://dumb.dev.to/tacoda/dont-make-the-agent-re-run-the-test-suite-to-find-the-failure-427</link>
      <guid>https://dumb.dev.to/tacoda/dont-make-the-agent-re-run-the-test-suite-to-find-the-failure-427</guid>
      <description>&lt;p&gt;Here is a small failure mode that cost me time for longer than it should have.&lt;/p&gt;

&lt;p&gt;The agent would run the test suite. Tests would fail. The agent would announce that tests failed. Then, when it needed to know &lt;em&gt;which&lt;/em&gt; tests failed, would either guess, ask, or run the suite a second time to scrape the output. Sometimes it would run it a third time. The failing tests were right there in the output of the first run; the agent didn't read them carefully enough to remember.&lt;/p&gt;

&lt;p&gt;This is not the model being lazy. It is the model being honest about its attention. Test output is voluminous, the failure summary is buried at the bottom, and by the time the agent is reasoning about the &lt;em&gt;next&lt;/em&gt; step ("which test failed, what assertion, what file"), the relevant lines have scrolled past whatever the agent actually retained. The cheapest way to get the information back is to run the command again.&lt;/p&gt;

&lt;p&gt;Running the command again is the wrong answer. A full suite takes minutes. Doing it twice to learn something the first run already told you is a tax on every red-test loop, and the loops compound.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: &lt;code&gt;tee&lt;/code&gt; everything to a gitignored directory
&lt;/h2&gt;

&lt;p&gt;The rule I added is short:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every test command pipes through &lt;code&gt;tee&lt;/code&gt; into &lt;code&gt;.test-output/&amp;lt;scope&amp;gt;.log&lt;/code&gt;. The directory is gitignored. When you need to inspect failures, &lt;code&gt;grep&lt;/code&gt; the log; do not re-run the suite.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent's commands now look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test &lt;/span&gt;2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee&lt;/span&gt; .test-output/full.log
make test-parallel 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee&lt;/span&gt; .test-output/parallel.log
make vitest 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee&lt;/span&gt; .test-output/vitest.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. The fix is one Unix utility, deployed deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;tee&lt;/code&gt; is the right tool
&lt;/h2&gt;

&lt;p&gt;The trick is that &lt;code&gt;tee&lt;/code&gt; does not replace the stream; it forks it. STDOUT still flows to the terminal in real time. The agent still sees the test run as it happens, still gets the streaming feedback that lets it react to a hang or an obvious early failure. Nothing about the foreground experience changes.&lt;/p&gt;

&lt;p&gt;What changes is that the run is also persisted. After the command exits, the output exists as a file. The agent can &lt;code&gt;grep -n FAIL .test-output/full.log&lt;/code&gt;, jump to the failing test, read three lines of context, and decide what to do without burning another full suite run to recover information.&lt;/p&gt;

&lt;p&gt;You could imagine alternatives. Redirect everything to a file and tail it (loses interactive feedback). Tell the agent to "remember the test output" (the failure mode this is supposed to fix). Increase the agent's context window (treats the symptom, not the cause). The &lt;code&gt;tee&lt;/code&gt; approach is boring, which is its strength. It uses a tool that has been in every Unix shell since 1973, costs nothing, and survives every framework choice the project might make later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gitignored directory matters
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.test-output/&lt;/code&gt; is committed nowhere. It is ephemeral: overwritten on every run, never inspected by humans, never reviewed in a PR. Making it a real directory rather than &lt;code&gt;/tmp&lt;/code&gt; keeps it scoped to the project, which means a &lt;code&gt;grep&lt;/code&gt; from the repo root finds it without thinking.&lt;/p&gt;

&lt;p&gt;I also keep the filenames stable. &lt;code&gt;full.log&lt;/code&gt;, &lt;code&gt;parallel.log&lt;/code&gt;, &lt;code&gt;vitest.log&lt;/code&gt;; not timestamped. The agent never has to ask "which file is the latest"? The latest is the only one. If you want history, the agent can copy it before re-running. By default, nobody needs history; they need the most recent failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The general lesson
&lt;/h2&gt;

&lt;p&gt;The interesting thing here is not &lt;code&gt;tee&lt;/code&gt;. It is the shape of the fix.&lt;/p&gt;

&lt;p&gt;An agent reading a 4,000-line test run and an agent grepping a file for &lt;code&gt;FAIL&lt;/code&gt; are doing the same work in principle, but the second one is the work the tool is good at. Long, streaming output is something an agent &lt;em&gt;should&lt;/em&gt; read past (most of it is success noise) and only return to when a question demands it. Persisting the output to disk turns the question "what failed?" from "scroll back through my context and hope" into "run a deterministic command and read the answer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wherever&lt;/strong&gt; an agent re-runs a command to recover information that was already produced, there is a &lt;code&gt;tee&lt;/code&gt; waiting to be added. Build output. Type-check output. Linter output. Long-running scripts that print progress. Any time the command is expensive and the output is the artifact, persist the artifact. The rule shape (&lt;em&gt;fork the stream, persist the artifact, grep the file&lt;/em&gt;) generalizes &lt;em&gt;far&lt;/em&gt; past test runs.&lt;/p&gt;

&lt;p&gt;The agent does not need a better memory. It needs the harness to stop throwing away information that was already on the screen.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>shell</category>
    </item>
    <item>
      <title>Assembly Code to Machine Code (ARM)</title>
      <dc:creator>Trinity</dc:creator>
      <pubDate>Fri, 22 May 2026 18:22:17 +0000</pubDate>
      <link>https://dumb.dev.to/hwangs12/assembly-code-to-machine-code-arm-57ga</link>
      <guid>https://dumb.dev.to/hwangs12/assembly-code-to-machine-code-arm-57ga</guid>
      <description>&lt;p&gt;Summary of the video &lt;a href="https://www.youtube.com/watch?v=ttJZjP0p_uE" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ttJZjP0p_uE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have heard assembly code is the closest of how humans can write in a fashion that machines can understand. I have never understood how. Here's the bit of how the translation occurs from assembly instruction to machine code. &lt;/p&gt;

&lt;p&gt;In ARM Assembly, the following is the translation from assembly code to binary. After looking at each section in detail, we will try to translate ARM operations into binary operations that machine (ARM chip in this case) understands. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;Src2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cond
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opcode [31:28]&lt;/th&gt;
&lt;th&gt;Mnemonic extension&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;th&gt;Status flag state for execution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;EQ&lt;/td&gt;
&lt;td&gt;Equal / equals zero&lt;/td&gt;
&lt;td&gt;Z set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;td&gt;NE&lt;/td&gt;
&lt;td&gt;Not equal&lt;/td&gt;
&lt;td&gt;Z clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0010&lt;/td&gt;
&lt;td&gt;CS/HS&lt;/td&gt;
&lt;td&gt;Carry set / unsigned higher or same&lt;/td&gt;
&lt;td&gt;C set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0011&lt;/td&gt;
&lt;td&gt;CC/LO&lt;/td&gt;
&lt;td&gt;Carry clear / unsigned lower&lt;/td&gt;
&lt;td&gt;C clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;MI&lt;/td&gt;
&lt;td&gt;Minus / negative&lt;/td&gt;
&lt;td&gt;N set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;PL&lt;/td&gt;
&lt;td&gt;Plus / positive or zero&lt;/td&gt;
&lt;td&gt;N clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;VS&lt;/td&gt;
&lt;td&gt;Overflow&lt;/td&gt;
&lt;td&gt;V set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0111&lt;/td&gt;
&lt;td&gt;VC&lt;/td&gt;
&lt;td&gt;No overflow&lt;/td&gt;
&lt;td&gt;V clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;HI&lt;/td&gt;
&lt;td&gt;Unsigned higher&lt;/td&gt;
&lt;td&gt;C set and Z clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;LS&lt;/td&gt;
&lt;td&gt;Unsigned lower or same&lt;/td&gt;
&lt;td&gt;C clear or Z set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1010&lt;/td&gt;
&lt;td&gt;GE&lt;/td&gt;
&lt;td&gt;Signed greater than or equal&lt;/td&gt;
&lt;td&gt;N equals V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1011&lt;/td&gt;
&lt;td&gt;LT&lt;/td&gt;
&lt;td&gt;Signed less than&lt;/td&gt;
&lt;td&gt;N is not equal to V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;td&gt;GT&lt;/td&gt;
&lt;td&gt;Signed greater than or equal&lt;/td&gt;
&lt;td&gt;Z clear and N equals V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;LE&lt;/td&gt;
&lt;td&gt;Signed less than or equal&lt;/td&gt;
&lt;td&gt;Z set or N is not equal to V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;AL&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;NV&lt;/td&gt;
&lt;td&gt;Never (do not use!)&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SOME NOTES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ADD&lt;/code&gt; operation takes Opcode 1110 &lt;code&gt;AL&lt;/code&gt; for &lt;em&gt;always&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;Flag bit is usually the previous operation that results in some bit set. In &lt;code&gt;ADDEQ&lt;/code&gt; it will execute if the previous instruction set Z flag to true (1). &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  op
&lt;/h2&gt;

&lt;h2&gt;
  
  
  I
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It stands for &lt;em&gt;immediate&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Example, &lt;code&gt;ADD, R1, R2, #0x28&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If a constant / label is used, then the I field is set to 1&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  cmd
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is the operation that we are well aware of &lt;/li&gt;
&lt;li&gt;It is ARM data processing instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opcode [24:21]&lt;/th&gt;
&lt;th&gt;Mnemonic&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;AND&lt;/td&gt;
&lt;td&gt;Logical bit-wise AND&lt;/td&gt;
&lt;td&gt;Rd := Rn AND Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;td&gt;EOR&lt;/td&gt;
&lt;td&gt;Logical bit-wise exclusive OR&lt;/td&gt;
&lt;td&gt;Rd := Rn EOR Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0010&lt;/td&gt;
&lt;td&gt;SUB&lt;/td&gt;
&lt;td&gt;Subtract&lt;/td&gt;
&lt;td&gt;Rd := Rn - Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0011&lt;/td&gt;
&lt;td&gt;RSB&lt;/td&gt;
&lt;td&gt;Reverse subtract&lt;/td&gt;
&lt;td&gt;Rd := Op2 - Rn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;Rd := Rn + Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;ADC&lt;/td&gt;
&lt;td&gt;Add with carry&lt;/td&gt;
&lt;td&gt;Rd := Rn + Op2 + C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;SBC&lt;/td&gt;
&lt;td&gt;Subtract with carry&lt;/td&gt;
&lt;td&gt;Rd := Rn - Op2 + C - 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0111&lt;/td&gt;
&lt;td&gt;RSC&lt;/td&gt;
&lt;td&gt;Reverse subtract with carry&lt;/td&gt;
&lt;td&gt;Rd := Op2 - Rn + C - 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;TST&lt;/td&gt;
&lt;td&gt;Test&lt;/td&gt;
&lt;td&gt;Scc on Rn AND Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;TEQ&lt;/td&gt;
&lt;td&gt;Test equivalence&lt;/td&gt;
&lt;td&gt;Scc on Rn EOR Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1010&lt;/td&gt;
&lt;td&gt;CMP&lt;/td&gt;
&lt;td&gt;Compare&lt;/td&gt;
&lt;td&gt;Scc on Rn - Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1011&lt;/td&gt;
&lt;td&gt;CMN&lt;/td&gt;
&lt;td&gt;Compare negated&lt;/td&gt;
&lt;td&gt;Scc on Rn + Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;td&gt;ORR&lt;/td&gt;
&lt;td&gt;Logical bit-wise OR&lt;/td&gt;
&lt;td&gt;Rd := Rn OR Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;MOV&lt;/td&gt;
&lt;td&gt;Move&lt;/td&gt;
&lt;td&gt;Rd := Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;BIC&lt;/td&gt;
&lt;td&gt;Bit clear&lt;/td&gt;
&lt;td&gt;Rd := Rn AND NOT Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;MVN&lt;/td&gt;
&lt;td&gt;Move negated&lt;/td&gt;
&lt;td&gt;Rd := NOT Op2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  S
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Setting S here means, we want the status of operation&lt;/li&gt;
&lt;li&gt;For example, &lt;code&gt;ADDS R1, R2, R3&lt;/code&gt; means, put on the status like whether the operation will be Zero, Negative, Carry (this will be shown in CPSR register - which we will cover but not in this article)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ADDS&lt;/code&gt; operation will set S status to 1 and let us start tracking the status. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rn (19:16)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is called first source register&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;ADD R1, R2, R3&lt;/code&gt; Rn is &lt;strong&gt;R2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Hence get's binary value of 0010 in 19:16&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rd (15:12)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is also called destination register&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;ADD R1, R2, R3&lt;/code&gt; Rd is &lt;strong&gt;R1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Hence it gets binary value of 0001 in 15:12&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Src2 (11:0)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Second Source&lt;/em&gt;: Can be a variety of things
a) Immediate
b) Register
c) Register-shifted Register &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Immediate
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rot&lt;/td&gt;
&lt;td&gt;imm8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rot&lt;/strong&gt; is for &lt;em&gt;rotation&lt;/em&gt;. Mnemonic for it is &lt;code&gt;ROR&lt;/code&gt; for &lt;em&gt;rotate right&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;NOTE: It is subject to rotate right by twice the value in the rotate field&lt;/li&gt;
&lt;li&gt;11:8 bits represent the amount of rotation to right of their immediate counterpart (7:0)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Register
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;11:7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shamt5&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;shamt5 represents amount of shift whether left or right&lt;/li&gt;
&lt;li&gt;sh is the shift operators - ops table at the bottom&lt;/li&gt;
&lt;li&gt;Rm is the register of target whose values being shifted &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Register-shifted Register
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rs&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Rs is the register that holds the amount of shift&lt;/li&gt;
&lt;li&gt;Rm is the target register whose value is being shifted&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  sh table
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;sh&lt;/th&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LSL&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;Logical shift left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSR&lt;/td&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;Logical shift right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASR&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Arithmetic shift right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROR&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Rotate right&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  STARTING WITH THE EASY ONE &lt;code&gt;ADD R5, R6, R7&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's unpack one section at a time&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;cond is ALWAYS hence 1110, since there's no condition to prevent ADD being done.&lt;/li&gt;
&lt;li&gt;op is 00&lt;/li&gt;
&lt;li&gt;I is 0 (there's no immediate values here)&lt;/li&gt;
&lt;li&gt;cmd is ADD which translates to 0100&lt;/li&gt;
&lt;li&gt;No Status indicator ADD(S) S is omitted, hence S is 0&lt;/li&gt;
&lt;li&gt;Rn is source, hence R6, 0110&lt;/li&gt;
&lt;li&gt;Rd is destination, hence R5, 0101&lt;/li&gt;
&lt;li&gt;shamt5 is 00000, since there's no shift &lt;/li&gt;
&lt;li&gt;Sh is 00  as there's no shift&lt;/li&gt;
&lt;li&gt;Rm is src2 hence, 7. 0111.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Combining them leads to &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;00000&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;shamt5&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nicely formatted binary here: &lt;br&gt;
&lt;strong&gt;1110 0000 1000 0110 0101 0000 0000 0111&lt;/strong&gt;&lt;br&gt;
Care to convert to hex? &lt;br&gt;
&lt;strong&gt;0xE0865007&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SLIGHTLY HARDER: &lt;code&gt;ADD R5, R6, R7, LSR #4&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;we pick immediate variety for shift operations since because &lt;code&gt;#4&lt;/code&gt; is a literal value&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Most are the same except fields 11:0&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LSR&lt;/code&gt; has sh code as 01&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LSR&lt;/code&gt; amount is 4 so shamt5 is 00100&lt;/li&gt;
&lt;li&gt;Rm is 7, hence 0111&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;00100&lt;/td&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;shamt5&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  LET'S DO MORE: &lt;code&gt;ADD R0, R1, #42&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The third one is immediate, hence&lt;/li&gt;
&lt;li&gt;I is set to 1&lt;/li&gt;
&lt;li&gt;Src2 becomes immediate format (rot for 11:8 and immediate value 7:0)&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;00101010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;Rot&lt;/td&gt;
&lt;td&gt;imm8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  BRING SOME MORE! &lt;code&gt;SUB R2, R3, #0xFF0&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Rd is 2, Rn is 3, imm - 0xff0&lt;/li&gt;
&lt;li&gt;SUB has 0010 code. &lt;/li&gt;
&lt;li&gt;OH NO, BUT #0xFF0 does not fit in 8 bit. &lt;/li&gt;
&lt;li&gt;That's ok. That's what rot is for. &lt;/li&gt;
&lt;li&gt;0xFF0 is 0000 0000 0000 0000 0000 1111 1111 0000&lt;/li&gt;
&lt;li&gt;0xFF is 0000 0000 0000 0000 0000 0000 1111 1111&lt;/li&gt;
&lt;li&gt;How many shift to right will make 0xFF the 0xFF0?&lt;/li&gt;
&lt;li&gt;1 shift right is 1000 0000 0000 0000 0000 0000 0111 1111&lt;/li&gt;
&lt;li&gt;Following? Let's shift right a little more.&lt;/li&gt;
&lt;li&gt;4 shift right is 1111 0000 0000 0000 0000 0000 0000 1111&lt;/li&gt;
&lt;li&gt;8 shift right is 1111 1111 0000 0000 0000 0000 0000 0000&lt;/li&gt;
&lt;li&gt;guess what? it takes 24 shift right to get 0xFF0!&lt;/li&gt;
&lt;li&gt;So, rot should be 12 since by our &lt;em&gt;rule&lt;/em&gt; the actual rotation is twice the value at &lt;strong&gt;rot&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;Hence, the 11:8 bit values will be &lt;code&gt;1100&lt;/code&gt; and 7:0 &lt;code&gt;1111 1111&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;which is just a representation of 0xff0 into 8 bit number combined with rotation. &lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0010&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0011&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;td&gt;11111111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;Rot&lt;/td&gt;
&lt;td&gt;imm8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  WHAT ABOUT THIS? &lt;code&gt;LSL R0, R9, #7&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;WAIT WAIT... LSL is not in the command table. How am I supposed to put in the bit field 24:21?&lt;/li&gt;
&lt;li&gt;Thanks Rakesh, the creator of the video: Basically LSL is equivalent to this: &lt;code&gt;MOV R0, R9, LSL #7&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wait again... Rakesh says R9 is not Rn... Hm.. I thought it would be the same as how SUB was done above. &lt;/li&gt;
&lt;li&gt;In the MOV operation, that's not the case, as per user guide armasm user guide page 333 &lt;code&gt;MOV R0, R9, LSL #7&lt;/code&gt; applies to the following syntax: &lt;code&gt;MOV{S}{cond} Rd, Operand2&lt;/code&gt; where operand2 is (according to page 244 the same guide) can be &lt;em&gt;Register with optional shift.&lt;/em&gt;. Hence, on page 246 of the guide it says, register with optional shift, is &lt;code&gt;Rm{, shift}&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Still following?&lt;/li&gt;
&lt;li&gt;Hence, R9 here is Rm, where Rm is the register holding the data for the second operand. &lt;/li&gt;
&lt;li&gt;Hence, Rn here is 0 and Rm is 9&lt;/li&gt;
&lt;li&gt;(BY THE WAY THE REFERENCE I'M TALKING ABOUT IS &lt;em&gt;armasm User Guide&lt;/em&gt; Version 6.6) - the latest is &lt;a href="https://developer.arm.com/documentation/100069/latest/" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;00111&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;shamt5&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  OK TAKE A BREAK AND COME BACK! &lt;code&gt;ROR R3, R5, #21&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;GUESS WHAT.. SHIFT AGAIN! Which means Rm is 5&lt;/li&gt;
&lt;li&gt;This is equivalent to &lt;code&gt;MOV R3, R5, ROR, #21&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Same translation step for &lt;code&gt;LSL&lt;/code&gt; above..&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0011&lt;/td&gt;
&lt;td&gt;10101&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;shamt5&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;KEY TAKEAWAY:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There's no one rule for all in the translations. Sometimes, you have to look up command table sometimes you will face operation that are not in one table hence, need to break down the command. &lt;/li&gt;
&lt;li&gt;But, all should be translated to binary otherwise, machine won't understand! So, let's stick to the basics and see if we can translate!!!!!&lt;/li&gt;
&lt;li&gt;Good news and bad news: You and I have learned how to translate,, not entirely but seen a bit of it... But these translation steps will be also different in A64 architecture but... we learned how to apply our knowledge in some way... Some methods must be similar... must be..&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OK AFTER YOUR DINNER... &lt;code&gt;LSR R4, R8, R6&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This time the shift amount is in R6. &lt;/li&gt;
&lt;li&gt;Does that make R8, the source register the Rn? &lt;/li&gt;
&lt;li&gt;NOPE!! &lt;/li&gt;
&lt;li&gt;This is equivalent to &lt;code&gt;MOV R4, R8, LSR, R6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;R6 is Rs haha! Found it!&lt;/li&gt;
&lt;li&gt;Rm is 8 hohoho&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;Rs&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  PHEW LET'S SLEEP AFTER THIS... &lt;code&gt;ASR R5, R1, R12&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Rd, Rn, Rm, Rs?? Is some of them 0? Which one?&lt;/li&gt;
&lt;li&gt;Answer below:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;31:28&lt;/th&gt;
&lt;th&gt;27:26&lt;/th&gt;
&lt;th&gt;25&lt;/th&gt;
&lt;th&gt;24:21&lt;/th&gt;
&lt;th&gt;20&lt;/th&gt;
&lt;th&gt;19:16&lt;/th&gt;
&lt;th&gt;15:12&lt;/th&gt;
&lt;th&gt;11:8&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;6:5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3:0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cond&lt;/td&gt;
&lt;td&gt;op&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Rn&lt;/td&gt;
&lt;td&gt;Rd&lt;/td&gt;
&lt;td&gt;Rs&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Rm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>arm</category>
    </item>
    <item>
      <title>Spring boot Interview Questions</title>
      <dc:creator>Poojitha</dc:creator>
      <pubDate>Fri, 22 May 2026 18:18:21 +0000</pubDate>
      <link>https://dumb.dev.to/poojithalakkaraju/spring-boot-interview-questions-1eol</link>
      <guid>https://dumb.dev.to/poojithalakkaraju/spring-boot-interview-questions-1eol</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. What is CORS and why is it required?&lt;/strong&gt;&lt;br&gt;
CORS (Cross-Origin Resource Sharing) is a browser security mechanism that allows/restricts APIs from being accessed by another domain.&lt;br&gt;
Example:&lt;br&gt;
Frontend: &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;
Backend API: &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;br&gt;
These are different origins because ports are different.&lt;br&gt;
Without CORS configuration, browser blocks the request.&lt;br&gt;
Why required?&lt;br&gt;
To securely allow frontend applications to call backend APIs hosted on different domains/ports.&lt;br&gt;
Interview Answer:&lt;br&gt;
CORS is a browser security feature that controls cross-origin HTTP requests. It is required when frontend and backend run on different domains, ports, or protocols. In Spring Boot, we configure CORS to allow trusted origins to access APIs securely.&lt;br&gt;
&lt;strong&gt;2. How do you configure CORS in Spring Boot?&lt;/strong&gt;&lt;br&gt;
Using @CrossOrigin&lt;br&gt;
Java&lt;br&gt;
@RestController&lt;br&gt;
@CrossOrigin(origins = "&lt;a href="http://localhost:3000%22" rel="noopener noreferrer"&gt;http://localhost:3000"&lt;/a&gt;)&lt;br&gt;
public class UserController {&lt;br&gt;
}&lt;br&gt;
Global Configuration&lt;br&gt;
Java&lt;br&gt;
@Configuration&lt;br&gt;
public class CorsConfig {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("http://localhost:3000")           .allowedMethods("GET", "POST", "PUT", "DELETE");
        }
    };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
Real-time usage:&lt;br&gt;
In production, React/Angular frontend calls Spring Boot APIs from another domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What is CSRF attack?&lt;/strong&gt;&lt;br&gt;
CSRF = Cross Site Request Forgery&lt;br&gt;
It tricks a logged-in user into performing unwanted actions.&lt;br&gt;
Example:&lt;br&gt;
User logged into banking site&lt;br&gt;
Malicious website sends transfer request automatically&lt;br&gt;
Browser sends session cookie&lt;br&gt;
Server thinks request is genuine&lt;br&gt;
Interview Answer:&lt;br&gt;
CSRF attack occurs when a malicious site tricks an authenticated user into sending unauthorized requests to another application where the user is already logged in.&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>java</category>
      <category>springboot</category>
    </item>
    <item>
      <title>LambdaTest vs BrowserStack : Detail Comparison in 2026</title>
      <dc:creator>Morris</dc:creator>
      <pubDate>Fri, 22 May 2026 18:18:16 +0000</pubDate>
      <link>https://dumb.dev.to/morrismoses149/lambdatest-vs-browserstack-detail-comparison-in-2026-3adf</link>
      <guid>https://dumb.dev.to/morrismoses149/lambdatest-vs-browserstack-detail-comparison-in-2026-3adf</guid>
      <description>&lt;p&gt;Choosing between LambdaTest and BrowserStack gets harder once you actually start using both in real testing workflows.&lt;/p&gt;

&lt;p&gt;On paper, they look very similar. Both offer cloud-based cross-browser testing, real device testing, automation support, and CI/CD integrations. But after spending time with both platforms, the differences start showing in day-to-day QA work especially around execution speed, debugging experience, pricing, and overall workflow flexibility.&lt;/p&gt;

&lt;p&gt;BrowserStack feels more polished from an enterprise reliability perspective. Its real device cloud is mature, stable, and trusted by larger engineering teams running large-scale automation suites.&lt;/p&gt;

&lt;p&gt;LambdaTest feels more aggressive around modern testing workflows. The platform focuses heavily on faster execution, affordability, and AI-assisted testing through Kane AI and the broader TestMu AI ecosystem.&lt;/p&gt;

&lt;p&gt;Neither platform is objectively better for everyone.&lt;/p&gt;

&lt;p&gt;Some teams will care more about enterprise stability and device coverage. Others will prioritize execution speed, lower costs, or AI-native testing capabilities. The right choice usually depends more on your testing workflow, team size, and automation maturity than feature lists alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is LambdaTest?
&lt;/h2&gt;

&lt;p&gt;LambdaTest is a cloud-based testing platform designed for cross-browser testing, real device testing, and automated test execution.&lt;/p&gt;

&lt;p&gt;Instead of maintaining an in-house device lab, teams can run tests across different browsers, operating systems, and real mobile devices directly from the cloud. The platform supports popular automation frameworks like Selenium, Playwright, Cypress, and Appium, which makes it easier for QA teams to integrate existing automation suites without major rewrites.&lt;/p&gt;

&lt;p&gt;What makes LambdaTest more interesting recently is its push toward AI-assisted testing workflows. Features like Kane AI and the broader TestMu AI positioning show that the platform is trying to move beyond traditional browser testing and into AI-driven automation, test generation, and autonomous testing workflows.&lt;/p&gt;

&lt;p&gt;From my experience, LambdaTest feels heavily optimized for teams that want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster parallel execution&lt;/li&gt;
&lt;li&gt;broader browser coverage&lt;/li&gt;
&lt;li&gt;lower infrastructure costs&lt;/li&gt;
&lt;li&gt;easier scaling for automation&lt;/li&gt;
&lt;li&gt;modern CI/CD-friendly testing workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s especially appealing for startups, lean QA teams, and engineering teams trying to scale testing quickly without investing heavily in physical device infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is BrowserStack?
&lt;/h2&gt;

&lt;p&gt;BrowserStack is one of the most widely used cloud testing platforms for cross-browser testing, mobile app testing, and real device testing.&lt;/p&gt;

&lt;p&gt;It allows QA and engineering teams to run manual and automated tests across a large range of browsers, operating systems, and physical mobile devices without maintaining their own device infrastructure. The platform supports major automation frameworks like Selenium, Playwright, Cypress, and Appium, making it easier to scale automation across different environments.&lt;/p&gt;

&lt;p&gt;What stood out to me while using BrowserStack was its overall stability and ecosystem maturity. The platform feels built for larger QA operations where reliability, debugging visibility, and device consistency matter more than flashy automation features.&lt;/p&gt;

&lt;p&gt;BrowserStack also has strong enterprise adoption because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;extensive real device coverage&lt;/li&gt;
&lt;li&gt;stable automation infrastructure&lt;/li&gt;
&lt;li&gt;mature debugging tools&lt;/li&gt;
&lt;li&gt;strong security and compliance support&lt;/li&gt;
&lt;li&gt;reliable CI/CD integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More recently, BrowserStack has also started moving toward AI-assisted testing workflows with features like Percy Visual Review Agent, but compared to LambdaTest, the platform still feels more infrastructure-first than AI-first.&lt;/p&gt;

&lt;p&gt;For enterprise QA teams and mobile-heavy testing environments, BrowserStack still feels like one of the safer long-term choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  LambdaTest vs BrowserStack: Feature Comparison Table
&lt;/h2&gt;

&lt;p&gt;Both LambdaTest and BrowserStack cover the core areas most QA teams need today cross-browser testing, automation support, real device testing, and CI/CD integrations.&lt;/p&gt;

&lt;p&gt;The real differences start showing once you compare execution speed, enterprise maturity, AI capabilities, pricing flexibility, and debugging workflows side by side.&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%2Fc93vn0en5mnssqrsog1n.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%2Fc93vn0en5mnssqrsog1n.png" alt=" " width="512" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From my experience, LambdaTest feels more aggressive around speed, pricing flexibility, and AI-native testing direction. BrowserStack feels more polished when it comes to reliability, device infrastructure, and large-scale enterprise testing operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Device and Browser Coverage
&lt;/h2&gt;

&lt;p&gt;This is usually where the biggest differences between LambdaTest and BrowserStack start becoming noticeable in real testing workflows.&lt;/p&gt;

&lt;p&gt;On the surface, both platforms support a wide range of browsers, operating systems, and mobile devices. But once you start running larger regression suites or mobile-heavy testing cycles, the overall experience feels different.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Feels Stronger for Real Device Testing
&lt;/h3&gt;

&lt;p&gt;BrowserStack still feels ahead when it comes to real device infrastructure maturity.&lt;br&gt;
The platform offers extensive coverage across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real iPhones and Android devices&lt;/li&gt;
&lt;li&gt;older browser versions&lt;/li&gt;
&lt;li&gt;multiple OS combinations&lt;/li&gt;
&lt;li&gt;tablet and mobile environments
What stood out most during testing was consistency. Device sessions felt stable, browser rendering was reliable, and debugging mobile-specific issues was generally smoother compared to most cloud testing platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For enterprise teams running large mobile test suites, stability matters a lot.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Focuses More on Flexibility and Scale
&lt;/h3&gt;

&lt;p&gt;LambdaTest also offers strong browser and device coverage, especially for cross-browser automation workflows.&lt;/p&gt;

&lt;p&gt;The platform performs well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browser compatibility testing&lt;/li&gt;
&lt;li&gt;parallel browser execution&lt;/li&gt;
&lt;li&gt;automation scaling&lt;/li&gt;
&lt;li&gt;cloud-based regression testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also felt faster in certain parallel execution scenarios, especially during browser-heavy automation runs.&lt;/p&gt;

&lt;p&gt;While BrowserStack still feels more mature for deep mobile device testing, LambdaTest feels more optimized for teams trying to scale browser testing efficiently without significantly increasing infrastructure costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which One Is Better?
&lt;/h3&gt;

&lt;p&gt;If your workflow is heavily focused on mobile app testing and real device reliability, BrowserStack still has an advantage in overall maturity and device ecosystem depth.&lt;/p&gt;

&lt;p&gt;If your team is more focused on browser automation, faster execution, pricing flexibility, and scaling cloud-based testing quickly, LambdaTest becomes very competitive.&lt;/p&gt;

&lt;p&gt;For most teams, the decision comes down to whether mobile device depth or browser automation efficiency matters more in day-to-day QA workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation Framework Support
&lt;/h2&gt;

&lt;p&gt;Both LambdaTest and BrowserStack support the major automation frameworks most QA teams already use today. So if your team already has an existing automation setup, migrating to either platform is usually straightforward.&lt;/p&gt;

&lt;p&gt;The biggest difference isn’t framework compatibility itself. It’s how smooth the execution, debugging, and scaling experience feels once automation suites become larger.&lt;/p&gt;

&lt;p&gt;Support for Modern Automation Frameworks&lt;br&gt;
Both platforms support popular frameworks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selenium&lt;/li&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;li&gt;Cypress&lt;/li&gt;
&lt;li&gt;Appium&lt;/li&gt;
&lt;li&gt;Puppeteer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They also support multiple programming languages including Java, Python, JavaScript, C#, and Ruby, which makes them flexible enough for most engineering teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Feels More Focused on Fast Automation Scaling
&lt;/h3&gt;

&lt;p&gt;While testing LambdaTest, the platform felt optimized for teams trying to execute large automation suites quickly across multiple browser combinations.&lt;/p&gt;

&lt;p&gt;Parallel execution setup was relatively simple, and the platform integrates well into CI/CD pipelines where faster feedback cycles matter heavily.&lt;/p&gt;

&lt;p&gt;The newer AI-focused direction through Kane AI and TestMu AI also makes the platform feel more aligned with modern automation workflows rather than purely infrastructure-focused testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Feels More Mature for Stable Enterprise Automation
&lt;/h3&gt;

&lt;p&gt;BrowserStack felt stronger from a reliability and debugging perspective.&lt;/p&gt;

&lt;p&gt;Automation sessions generally felt stable, logs and recordings were easier to analyze, and mobile automation workflows were especially polished during testing. That becomes important once teams start managing large-scale enterprise regression suites where debugging failed runs consumes significant time.&lt;/p&gt;

&lt;p&gt;For enterprise teams prioritizing stability and mature automation infrastructure, BrowserStack still feels slightly ahead overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which One Is Better for Automation?
&lt;/h3&gt;

&lt;p&gt;If your team prioritizes faster execution, flexible scaling, and modern AI-assisted workflows, LambdaTest feels more aggressive and developer-focused.&lt;/p&gt;

&lt;p&gt;If stability, mature debugging workflows, and enterprise-grade mobile automation matter more, BrowserStack still has a stronger reputation in those areas.&lt;/p&gt;

&lt;p&gt;For most teams already using Selenium, Playwright, or Cypress, both platforms are capable. The better choice usually comes down to workflow preferences rather than framework support itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed, Parallel Testing, and Test Execution
&lt;/h2&gt;

&lt;p&gt;Execution speed is one of the first things teams notice once automation suites start growing.&lt;/p&gt;

&lt;p&gt;A small regression suite might run fine anywhere, but once you begin testing across multiple browsers, devices, and environments simultaneously, platform performance starts affecting release cycles directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Focuses Heavily on Faster Parallel Execution
&lt;/h3&gt;

&lt;p&gt;LambdaTest feels aggressively optimized for parallel testing and faster automation scaling.&lt;/p&gt;

&lt;p&gt;During browser-heavy automation runs, the platform handled parallel execution smoothly, especially when running large Selenium and Playwright suites across multiple browser combinations. The setup process for scaling parallel sessions also felt relatively simple compared to some enterprise-focused platforms.&lt;/p&gt;

&lt;p&gt;For teams running frequent CI/CD pipelines, that faster execution can reduce feedback delays significantly during regression cycles.&lt;/p&gt;

&lt;p&gt;This is one of the areas where LambdaTest feels very startup and developer focused.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Prioritizes Stability Over Raw Speed
&lt;/h3&gt;

&lt;p&gt;BrowserStack still performs well in parallel execution scenarios, but the platform feels more focused on reliability and consistency than aggressive execution speed.&lt;/p&gt;

&lt;p&gt;Automation sessions generally felt stable during longer runs, especially in mobile and real-device testing workflows where infrastructure consistency matters more than shaving a few minutes off execution time.&lt;/p&gt;

&lt;p&gt;That tradeoff makes sense for enterprise teams where failed or inconsistent test runs can create larger operational problems than slightly slower execution.&lt;/p&gt;

&lt;p&gt;Real-World Difference Between the Two&lt;br&gt;
In smaller automation suites, the speed difference between the platforms is not huge.&lt;/p&gt;

&lt;p&gt;The differences become more noticeable when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;regression suites become larger&lt;/li&gt;
&lt;li&gt;parallel sessions increase&lt;/li&gt;
&lt;li&gt;multiple browser combinations run simultaneously&lt;/li&gt;
&lt;li&gt;CI/CD pipelines require faster feedback loops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LambdaTest tends to feel faster and more execution-focused, while BrowserStack feels more stable and infrastructure-focused.&lt;/p&gt;

&lt;p&gt;For fast-moving engineering teams shipping frequently, LambdaTest’s execution speed can become a real advantage. For enterprise environments where reliability matters more than raw execution time, BrowserStack still feels safer overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Testing and Debugging
&lt;/h2&gt;

&lt;p&gt;Visual testing and debugging are areas where both LambdaTest and BrowserStack have improved a lot over the last few years.&lt;/p&gt;

&lt;p&gt;Once automation suites grow, execution alone is not enough. Teams also need clear debugging workflows to understand why tests failed, what changed visually, and whether failures are actually important or just noisy automation issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Feels More Mature for Visual Debugging
&lt;/h3&gt;

&lt;p&gt;BrowserStack felt stronger from a debugging and reporting perspective during testing.&lt;/p&gt;

&lt;p&gt;The platform provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detailed session logs&lt;/li&gt;
&lt;li&gt;video recordings&lt;/li&gt;
&lt;li&gt;screenshots&lt;/li&gt;
&lt;li&gt;console logs&lt;/li&gt;
&lt;li&gt;network logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What stood out most was how polished the debugging workflow felt during failed automation runs. Analyzing browser behavior, reproducing issues, and tracking visual inconsistencies was generally smooth, especially in mobile testing scenarios.&lt;/p&gt;

&lt;p&gt;BrowserStack’s Percy Visual Review Agent also pushes the platform further into AI-assisted visual regression testing, which can help teams catch unexpected UI changes earlier.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Focuses More on Workflow Speed
&lt;/h3&gt;

&lt;p&gt;LambdaTest also offers strong debugging capabilities with logs, recordings, screenshots, and live testing visibility.&lt;/p&gt;

&lt;p&gt;The platform feels optimized for faster troubleshooting during browser automation workflows, especially when running large parallel execution suites. Debugging information is easy to access, and session analysis feels fairly developer-friendly.&lt;/p&gt;

&lt;p&gt;Where LambdaTest becomes more interesting is its growing AI-testing direction. Kane AI and the broader TestMu AI ecosystem suggest the platform is trying to move toward more intelligent debugging and AI-assisted automation workflows rather than traditional reporting alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Platform Handles Debugging Better?
&lt;/h3&gt;

&lt;p&gt;For enterprise teams that prioritize mature debugging workflows and polished visual regression tooling, BrowserStack still feels slightly ahead overall.&lt;/p&gt;

&lt;p&gt;For teams focused on execution speed, fast automation feedback, and modern AI-assisted workflows, LambdaTest feels more agile and developer-oriented.&lt;/p&gt;

&lt;p&gt;Both platforms cover the core debugging features well. The real difference comes down to whether your team values enterprise stability or faster AI-driven testing workflows more.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD, Local Testing, and Integrations
&lt;/h2&gt;

&lt;p&gt;Modern testing platforms are no longer just about running browser tests. They also need to fit smoothly into existing engineering workflows.&lt;/p&gt;

&lt;p&gt;That includes CI/CD pipelines, local environment testing, GitHub-based development workflows, and debugging applications before changes reach production.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Feels More Developer-Focused
&lt;/h3&gt;

&lt;p&gt;LambdaTest integrates well with modern CI/CD workflows and feels heavily optimized for fast automation execution inside deployment pipelines.&lt;/p&gt;

&lt;p&gt;The platform supports integrations with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;li&gt;CircleCI&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setting up automated execution across browser combinations felt relatively straightforward, especially for teams already using Selenium or Playwright pipelines.&lt;/p&gt;

&lt;p&gt;LambdaTest’s local testing tunnel also worked well during development-stage validation where applications are not publicly accessible yet. That becomes useful when testing staging environments, internal applications, or locally hosted builds before deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Feels More Mature for Enterprise Workflows
&lt;/h3&gt;

&lt;p&gt;BrowserStack supports similar CI/CD integrations and framework &lt;br&gt;
compatibility, but the overall experience feels slightly more enterprise-oriented.&lt;/p&gt;

&lt;p&gt;The platform integrates well into larger QA ecosystems where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automation pipelines are already mature&lt;/li&gt;
&lt;li&gt;multiple teams share infrastructure&lt;/li&gt;
&lt;li&gt;security and compliance matter heavily&lt;/li&gt;
&lt;li&gt;long-running regression suites are common&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BrowserStack Local also performs reliably for testing internal environments and locally hosted applications without exposing them publicly.&lt;/p&gt;

&lt;p&gt;What stood out most was stability. The integrations felt polished, predictable, and reliable during larger automation workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Platform Integrates Better?
&lt;/h3&gt;

&lt;p&gt;Honestly, both platforms handle modern CI/CD workflows well.&lt;/p&gt;

&lt;p&gt;If your team prioritizes faster setup, developer-focused workflows, and aggressive automation scaling, LambdaTest feels more flexible and execution-focused.&lt;/p&gt;

&lt;p&gt;If your organization already runs large enterprise testing pipelines and values long-term infrastructure stability, BrowserStack still feels more mature overall.&lt;/p&gt;

&lt;p&gt;For most engineering teams, integration support probably won’t be the deciding factor because both platforms already cover the major CI/CD and automation ecosystem requirements well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Enterprise Readiness
&lt;/h2&gt;

&lt;p&gt;Security and enterprise reliability become much more important once testing infrastructure starts scaling across larger engineering teams.&lt;/p&gt;

&lt;p&gt;For startups, browser coverage and pricing usually matter most. But enterprise teams care more about things like infrastructure stability, access controls, compliance requirements, audit visibility, and long-term reliability.&lt;/p&gt;

&lt;p&gt;This is one area where BrowserStack still feels slightly stronger overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  BrowserStack Feels More Enterprise-Mature
&lt;/h3&gt;

&lt;p&gt;BrowserStack has been heavily adopted by larger organizations for years, and the platform feels built around enterprise stability.&lt;/p&gt;

&lt;p&gt;During testing, the platform consistently felt polished in areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infrastructure reliability&lt;/li&gt;
&lt;li&gt;session consistency&lt;/li&gt;
&lt;li&gt;user management&lt;/li&gt;
&lt;li&gt;debugging visibility&lt;/li&gt;
&lt;li&gt;enterprise workflow integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BrowserStack also has a stronger reputation around enterprise trust, especially for organizations handling large-scale mobile testing, regulated environments, or distributed QA operations.&lt;/p&gt;

&lt;p&gt;For bigger teams, that maturity matters because unstable infrastructure quickly becomes expensive at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Is Catching Up Quickly
&lt;/h3&gt;

&lt;p&gt;LambdaTest has improved significantly in enterprise positioning over the last few years.&lt;/p&gt;

&lt;p&gt;The platform now supports many of the enterprise features larger teams expect, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;secure local testing&lt;/li&gt;
&lt;li&gt;role-based access&lt;/li&gt;
&lt;li&gt;CI/CD integrations&lt;/li&gt;
&lt;li&gt;scalable automation infrastructure&lt;/li&gt;
&lt;li&gt;enterprise support workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes LambdaTest different is that the company feels more aggressive around modern AI-assisted testing workflows. Kane AI and the broader TestMu AI direction make the platform feel more innovation-focused compared to traditional cloud testing providers.&lt;/p&gt;

&lt;p&gt;For teams prioritizing faster automation scaling and AI-native testing capabilities, that modern direction may actually matter more than enterprise legacy maturity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Platform Is Better for Enterprises?
&lt;/h2&gt;

&lt;p&gt;For large enterprises prioritizing long-term stability, mature infrastructure, and proven ecosystem trust, BrowserStack still feels like the safer choice overall.&lt;/p&gt;

&lt;p&gt;For organizations looking for a more flexible, cost-conscious, and AI-focused testing platform, LambdaTest has become a very serious alternative.&lt;/p&gt;

&lt;p&gt;The decision usually comes down to what matters more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mature enterprise stability&lt;/li&gt;
&lt;li&gt;AI-assisted testing innovation&lt;/li&gt;
&lt;li&gt;infrastructure reliability&lt;/li&gt;
&lt;li&gt;scaling costs&lt;/li&gt;
&lt;li&gt;workflow flexibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both platforms are enterprise-capable today. The difference is mostly in how they approach modern testing workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing and Total Cost of Ownership
&lt;/h2&gt;

&lt;p&gt;Pricing is one of the biggest reasons teams compare LambdaTest and BrowserStack so closely.&lt;/p&gt;

&lt;p&gt;At first glance, both platforms seem similar. But once teams start scaling automation, parallel sessions, real device usage, and CI/CD execution, the total cost can change very quickly.&lt;/p&gt;

&lt;p&gt;One important thing to remember is that pricing changes frequently, especially as both companies continue expanding AI testing and enterprise offerings. It’s always worth verifying the latest plans directly before making a final decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  LambdaTest Is Usually More Affordable
&lt;/h3&gt;

&lt;p&gt;LambdaTest is generally positioned as the more cost-effective option, especially for startups and automation-heavy teams.&lt;/p&gt;

&lt;p&gt;Current pricing commonly starts around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$15/month for live testing plans&lt;/li&gt;
&lt;li&gt;~$79/month for automation-focused plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;higher pricing for HyperExecute and enterprise scaling&lt;br&gt;
The platform also offers a free tier with limited testing access, which makes it easier for smaller teams to experiment before committing to larger plans.&lt;/p&gt;

&lt;p&gt;What makes LambdaTest attractive financially is that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parallel execution costs scale more gradually&lt;/li&gt;
&lt;li&gt;automation-focused plans are comparatively cheaper&lt;/li&gt;
&lt;li&gt;HyperExecute can reduce execution time significantly&lt;/li&gt;
&lt;li&gt;teams can scale browser testing without massive upfront infrastructure costs
For lean QA teams, the pricing-to-performance ratio feels very competitive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BrowserStack Has a Higher Enterprise Price Positioning
&lt;/h3&gt;

&lt;p&gt;BrowserStack is usually more expensive, especially once real-device automation and enterprise-scale parallel execution are involved.&lt;/p&gt;

&lt;p&gt;Typical pricing often starts around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$29–$39/month for live testing&lt;/li&gt;
&lt;li&gt;$129–$199/month for automation plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;higher enterprise pricing for larger QA teams and advanced device access&lt;br&gt;
The pricing increases faster when teams need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more parallel sessions&lt;/li&gt;
&lt;li&gt;larger real-device access&lt;/li&gt;
&lt;li&gt;enterprise support&lt;/li&gt;
&lt;li&gt;advanced security and compliance&lt;/li&gt;
&lt;li&gt;large-scale automation execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, many enterprises are willing to pay the premium because BrowserStack’s infrastructure maturity and real-device ecosystem are still considered among the strongest in the market.&lt;/p&gt;

&lt;p&gt;In practice, LambdaTest usually feels more cost-efficient for fast-growing teams and aggressive automation scaling, while BrowserStack feels more optimized for enterprise reliability and long-term infrastructure stability.&lt;/p&gt;

&lt;h2&gt;
  
  
  LambdaTest vs BrowserStack: Which One Should You Choose?
&lt;/h2&gt;

&lt;p&gt;After using both platforms in real testing workflows, I don’t think this decision comes down to feature checklists alone. Both tools already cover the basics extremely well. The better choice usually depends on how your team tests software, how fast you scale automation, and what problems you’re trying to solve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose LambdaTest If You Want Faster Scaling and Lower Costs
&lt;/h3&gt;

&lt;p&gt;LambdaTest makes more sense for teams that prioritize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster parallel execution&lt;/li&gt;
&lt;li&gt;aggressive automation scaling&lt;/li&gt;
&lt;li&gt;affordable pricing&lt;/li&gt;
&lt;li&gt;browser-heavy testing workflows&lt;/li&gt;
&lt;li&gt;AI-assisted testing features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform feels more modern and developer-focused overall. Features like Kane AI and the broader TestMu AI direction also make it appealing for teams exploring AI-native testing workflows rather than traditional cloud testing alone.&lt;/p&gt;

&lt;p&gt;For startups, lean QA teams, and fast-moving engineering organizations, LambdaTest often feels easier to scale financially without sacrificing too much functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose BrowserStack If You Prioritize Enterprise Stability
&lt;/h3&gt;

&lt;p&gt;BrowserStack feels stronger when stability, mature infrastructure, and real-device reliability matter most.&lt;/p&gt;

&lt;p&gt;It’s usually a better fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enterprise QA teams&lt;/li&gt;
&lt;li&gt;large mobile testing environments&lt;/li&gt;
&lt;li&gt;organizations running massive regression suites&lt;/li&gt;
&lt;li&gt;teams requiring mature debugging workflows&lt;/li&gt;
&lt;li&gt;companies with stricter compliance and infrastructure expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform feels polished and consistent, especially during large-scale automation and real-device testing workflows. That reliability becomes very valuable once testing operations grow across multiple teams and pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Practical Take After Testing Both
&lt;/h3&gt;

&lt;p&gt;If I were building a fast-moving startup QA workflow today, I’d probably lean toward LambdaTest because of the pricing flexibility, execution speed, and AI-focused direction.&lt;/p&gt;

&lt;p&gt;If I were managing enterprise-scale automation with heavy mobile testing requirements, I’d still trust BrowserStack slightly more because of its infrastructure maturity and overall ecosystem stability.&lt;/p&gt;

&lt;p&gt;The good news is that both platforms are strong enough now that most teams won’t make a “wrong” choice. The better decision usually comes down to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;speed vs stability&lt;/li&gt;
&lt;li&gt;affordability vs enterprise maturity
AI-native workflows vs traditional infrastructure reliability
That matters far more than small feature differences on comparison pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Top Test Automation Platforms Replacing BrowserStack &amp;amp; LambdaTest in 2026
&lt;/h2&gt;

&lt;p&gt;For a long time, most teams compared only BrowserStack and LambdaTest when choosing a cloud testing platform.&lt;/p&gt;

&lt;p&gt;That’s changing quickly.&lt;/p&gt;

&lt;p&gt;In 2026, QA teams are looking beyond traditional browser infrastructure. They want platforms that reduce automation maintenance, support AI-assisted testing, improve debugging, and fit modern CI/CD workflows without slowing releases down.&lt;/p&gt;

&lt;p&gt;A few platforms are starting to stand out because they focus on more than just running browser sessions in the cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  TestGrid
&lt;/h3&gt;

&lt;p&gt;TestGrid is a strong alternative enterprise-grade testing platform that combines real-device testing, automation, AI-powered workflows, and testing infrastructure into a single platform.&lt;/p&gt;

&lt;p&gt;It supports web, mobile, API, performance, and cross-browser testing while integrating with frameworks like Selenium, Appium, and Cypress.&lt;/p&gt;

&lt;p&gt;Through CoTester™, TestGrid also adds AI-powered assistance for test generation, execution, and maintenance workflows, helping teams reduce repetitive QA effort and scale testing more efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sauce Labs
&lt;/h3&gt;

&lt;p&gt;Sauce Labs still remains one of the strongest enterprise-focused alternatives in the market.The platform is heavily used by larger organizations running large automation suites across Selenium, Playwright, and mobile testing pipelines. Compared to BrowserStack and LambdaTest, Sauce Labs feels very enterprise-oriented and stability-focused.&lt;/p&gt;

&lt;p&gt;It’s usually a better fit for organizations that already have mature automation processes in place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kobiton
&lt;/h3&gt;

&lt;p&gt;Kobiton stands out mainly for mobile testing.Teams building mobile-first applications often prefer Kobiton because the platform focuses deeply on real-device mobile automation, Appium workflows, and mobile performance validation rather than broad browser testing alone.&lt;/p&gt;

&lt;p&gt;Compared to LambdaTest and BrowserStack, it feels much more specialized around mobile QA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perfecto
&lt;/h3&gt;

&lt;p&gt;Perfecto continues to position itself strongly in enterprise mobile and web testing.&lt;/p&gt;

&lt;p&gt;The platform focuses heavily on reliability, reporting, compliance, and large-scale automation stability. It’s commonly used in organizations where testing infrastructure maturity matters more than aggressive execution speed or low pricing.&lt;/p&gt;

&lt;p&gt;For enterprise QA operations, Perfecto still feels like one of the more stable long-term options.&lt;/p&gt;

&lt;h3&gt;
  
  
  HeadSpin
&lt;/h3&gt;

&lt;p&gt;HeadSpin approaches testing differently compared to traditional cloud testing platforms.Instead of focusing only on automation execution, the platform combines testing with performance monitoring and real-world user experience analysis. That makes it more appealing for teams that care heavily about mobile app performance and production-like testing environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selenium Grid
&lt;/h3&gt;

&lt;p&gt;Some teams are still moving away from cloud platforms entirely and building internal automation infrastructure using Selenium Grid.&lt;/p&gt;

&lt;p&gt;It offers full control over browser execution and scaling, but also requires significantly more maintenance and infrastructure management. For organizations with strong DevOps support, that tradeoff can still make sense financially at a very large scale.&lt;/p&gt;

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

&lt;p&gt;After testing both LambdaTest and BrowserStack, I don’t think there’s a universal winner.&lt;/p&gt;

&lt;p&gt;LambdaTest feels more modern and execution-focused. It’s a strong fit for teams that want faster automation scaling, lower costs, and AI-assisted testing workflows.&lt;/p&gt;

&lt;p&gt;BrowserStack still feels stronger from an enterprise reliability perspective. Its real-device infrastructure, debugging workflows, and ecosystem maturity make it a safer choice for larger QA operations.&lt;/p&gt;

&lt;p&gt;In the end, the better platform depends on your workflow. If your team prioritizes speed, flexibility, and AI-native testing, LambdaTest will probably feel more appealing. If stability, mobile testing maturity, and enterprise reliability matter more, BrowserStack still has the edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which is better: LambdaTest or BrowserStack?
&lt;/h3&gt;

&lt;p&gt;LambdaTest usually feels better for teams prioritizing faster execution, lower pricing, and AI-assisted testing workflows. BrowserStack feels stronger for enterprise reliability, real-device coverage, and mature mobile testing infrastructure.&lt;/p&gt;

&lt;p&gt;The better choice depends on your testing workflows, automation scale, and infrastructure needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is LambdaTest cheaper than BrowserStack?
&lt;/h3&gt;

&lt;p&gt;In most cases, yes.LambdaTest is generally more affordable for startups and growing QA teams, especially when scaling parallel automation execution. BrowserStack usually has higher pricing because of its mature enterprise infrastructure and larger real-device ecosystem.&lt;/p&gt;

&lt;p&gt;However, total cost also depends on parallel sessions, real-device usage, and enterprise support requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do LambdaTest and BrowserStack support Playwright and Cypress?
&lt;/h3&gt;

&lt;p&gt;Yes. Both platforms support modern automation frameworks including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;li&gt;Cypress&lt;/li&gt;
&lt;li&gt;Selenium&lt;/li&gt;
&lt;li&gt;Appium&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes it relatively easy for teams to migrate existing automation suites without major framework changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which platform is better for real device testing?
&lt;/h3&gt;

&lt;p&gt;BrowserStack still feels slightly stronger overall for real-device testing, especially in enterprise mobile testing environments.&lt;/p&gt;

&lt;p&gt;Its device ecosystem, session stability, and debugging workflows feel more mature during large-scale mobile testing. LambdaTest also offers strong device coverage, but BrowserStack currently feels more polished for deep mobile QA workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does AI testing change the LambdaTest vs BrowserStack decision?
&lt;/h3&gt;

&lt;p&gt;It can, especially for teams exploring AI-assisted QA workflows.&lt;/p&gt;

&lt;p&gt;LambdaTest is pushing more aggressively into AI-native testing through Kane AI and the broader TestMu AI ecosystem. That makes the platform more appealing for teams interested in AI-generated tests, autonomous workflows, and faster automation scaling.&lt;/p&gt;

&lt;p&gt;BrowserStack is also adding AI-assisted features like Percy Visual Review Agent, but the platform still feels more infrastructure-first than AI-first overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the best alternative to BrowserStack?
&lt;/h3&gt;

&lt;p&gt;The best alternative to BrowserStack is TestGrid, especially for teams that want real device testing, browser automation, mobile app testing, and AI-assisted QA workflows in one platform.&lt;/p&gt;

&lt;p&gt;Unlike traditional cloud testing platforms focused mainly on browser infrastructure, TestGrid combines automation, real-device cloud testing, visual testing, performance validation, codeless testing, and AI-powered workflows through CoTester. It also supports frameworks like Selenium, Appium, and Cypress while integrating directly into existing CI/CD and engineering workflows.&lt;/p&gt;

&lt;p&gt;For organizations looking for scalable testing across cloud, hybrid, dedicated, or on-premise environments, TestGrid has become a strong BrowserStack alternative for modern enterprise QA teams.&lt;/p&gt;

</description>
      <category>lambdatest</category>
      <category>browserstack</category>
      <category>crossbrowsertesting</category>
      <category>automationtesting</category>
    </item>
    <item>
      <title>Como eu acelerei o desenvolvimento frontend utilizando ferramentas de IA e o MCP do Figma</title>
      <dc:creator>Danilo Itagyba</dc:creator>
      <pubDate>Fri, 22 May 2026 18:17:46 +0000</pubDate>
      <link>https://dumb.dev.to/itagyba/como-eu-acelerei-o-desenvolvimento-frontend-utilizando-ferramentas-de-ia-e-o-mcp-do-figma-16c2</link>
      <guid>https://dumb.dev.to/itagyba/como-eu-acelerei-o-desenvolvimento-frontend-utilizando-ferramentas-de-ia-e-o-mcp-do-figma-16c2</guid>
      <description>&lt;p&gt;Ferramentas de IA aceleram muito o desenvolvimento frontend, mas só funcionam bem quando recebem contexto, limites e validação.&lt;/p&gt;

&lt;p&gt;O ganho real não veio de pedir “crie uma tela”. Veio de organizar o fluxo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;instruções claras para o agente&lt;/li&gt;
&lt;li&gt;integração com design via Figma MCP&lt;/li&gt;
&lt;li&gt;mudanças pequenas&lt;/li&gt;
&lt;li&gt;revisão humana&lt;/li&gt;
&lt;li&gt;testes automatizados&lt;/li&gt;
&lt;li&gt;validação visual com Playwright&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O problema: IA sem contexto gera ruído
&lt;/h2&gt;

&lt;p&gt;Um prompt assim normalmente gera dívida técnica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crie essa tela em React.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado tende a vir com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;componentes grandes&lt;/li&gt;
&lt;li&gt;CSS fora do padrão&lt;/li&gt;
&lt;li&gt;nomes genéricos&lt;/li&gt;
&lt;li&gt;regra de negócio misturada com UI&lt;/li&gt;
&lt;li&gt;poucos testes&lt;/li&gt;
&lt;li&gt;layout quebrando em estados reais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O que funcionou melhor foi tratar a IA como parte do fluxo de engenharia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Codex com instruções do projeto
&lt;/h2&gt;

&lt;p&gt;No Codex, usei um &lt;code&gt;AGENTS.md&lt;/code&gt; para definir como o agente deve trabalhar no repositório.&lt;/p&gt;

&lt;p&gt;Em vez de repetir regras em todo prompt, deixei o projeto explicar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stack&lt;/li&gt;
&lt;li&gt;estrutura de pastas&lt;/li&gt;
&lt;li&gt;padrão de testes&lt;/li&gt;
&lt;li&gt;comandos principais&lt;/li&gt;
&lt;li&gt;regras de TypeScript&lt;/li&gt;
&lt;li&gt;cuidados com integração&lt;/li&gt;
&lt;li&gt;checklist antes de finalizar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No corpo do artigo, deixo só a ideia. O exemplo completo está no final: AGENTS.md exemplo.&lt;/p&gt;

&lt;p&gt;Um prompt melhor para Codex fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refatore este componente seguindo o AGENTS.md.
Mantenha o comportamento visual.
Adicione testes relevantes.
Rode lint e testes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso muda bastante o resultado. O agente passa a respeitar o projeto em vez de inventar um padrão novo.&lt;/p&gt;

&lt;p&gt;O mesmo conceito pode ser aplicado a outras ferramentas, como Claude, com alguns ajustes no arquivo de instruções. No Claude, por exemplo, eu usaria um &lt;code&gt;CLAUDE.md&lt;/code&gt; mais focado em análise, revisão e tomada de decisão, enquanto no Codex o &lt;code&gt;AGENTS.md&lt;/code&gt; fica mais direcionado à execução dentro do repositório.&lt;/p&gt;




&lt;h2&gt;
  
  
  Figma MCP no fluxo frontend
&lt;/h2&gt;

&lt;p&gt;O MCP do Figma aproxima design e implementação.&lt;/p&gt;

&lt;p&gt;Ele permite que o agente leia contexto do Figma, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;estrutura da tela&lt;/li&gt;
&lt;li&gt;nomes de layers&lt;/li&gt;
&lt;li&gt;textos&lt;/li&gt;
&lt;li&gt;medidas&lt;/li&gt;
&lt;li&gt;componentes&lt;/li&gt;
&lt;li&gt;variáveis&lt;/li&gt;
&lt;li&gt;estilos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso ajuda muito em tarefas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use o frame selecionado no Figma como referência e implemente a tela usando os componentes existentes do projeto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ponto importante: o MCP não substitui engenharia frontend. Ele reduz o atrito entre design e código.&lt;/p&gt;

&lt;p&gt;Ainda é necessário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adaptar ao design system do projeto&lt;/li&gt;
&lt;li&gt;reaproveitar componentes existentes&lt;/li&gt;
&lt;li&gt;validar responsividade&lt;/li&gt;
&lt;li&gt;revisar acessibilidade&lt;/li&gt;
&lt;li&gt;testar estados reais&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Como configurar o MCP do Figma
&lt;/h2&gt;

&lt;p&gt;A forma exata muda conforme o cliente, mas o fluxo geral é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalar e abrir o Figma Desktop.&lt;/li&gt;
&lt;li&gt;Abrir o arquivo de design.&lt;/li&gt;
&lt;li&gt;Entrar em Dev Mode.&lt;/li&gt;
&lt;li&gt;Ativar o Dev Mode MCP Server.&lt;/li&gt;
&lt;li&gt;Configurar o cliente MCP para apontar para o servidor local.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O servidor local oficial do Figma usa HTTP, normalmente em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:3845/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo genérico de configuração MCP:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"figma-desktop"&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;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:3845/mcp"&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;Depois disso, o agente pode receber prompts como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Leia o frame selecionado no Figma e compare com a implementação atual.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use o design selecionado como referência e implemente a tela mantendo os padrões do projeto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fluxo prático com Codex
&lt;/h2&gt;

&lt;p&gt;O fluxo que mais funcionou foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Ler instruções do projeto
2. Inspecionar arquivos relevantes
3. Fazer mudança pequena
4. Adicionar ou ajustar testes
5. Rodar lint, testes e build
6. Revisar diff
7. Só então finalizar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IA acelera, mas testes e revisão seguram a qualidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testes são o contrato
&lt;/h2&gt;

&lt;p&gt;Sem testes, a IA acelera a entrega e também acelera regressões.&lt;/p&gt;

&lt;p&gt;Usei diferentes camadas de teste.&lt;/p&gt;




&lt;h2&gt;
  
  
  Teste unitário
&lt;/h2&gt;

&lt;p&gt;Para função pura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;formats currency&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;formatCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;R$ 10,50&lt;/span&gt;&lt;span class="dl"&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;
  
  
  Teste de componente
&lt;/h2&gt;

&lt;p&gt;Para comportamento visível:&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increments quantity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;QuantityStepper&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="sr"&gt;/aumentar/i&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;textbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&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;
  
  
  Teste de hook
&lt;/h2&gt;

&lt;p&gt;Para estado reutilizável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loads data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderHook&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;useItems&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;waitFor&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;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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;
  
  
  Teste de API
&lt;/h2&gt;

&lt;p&gt;Para contrato com backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;parses response&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="nf"&gt;mockFetch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&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;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toEqual&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&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;
  
  
  E2E com Playwright
&lt;/h2&gt;

&lt;p&gt;Para fluxo real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;opens product detail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;textbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="sr"&gt;/referência/i&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ABC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="sr"&gt;/realizar leitura/i&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="sr"&gt;/dados/i&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&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;
  
  
  Teste de layout
&lt;/h2&gt;

&lt;p&gt;Para proteger alinhamento e scroll:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&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;clientHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeLessThanOrEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientHeight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Teste de screenshot
&lt;/h2&gt;

&lt;p&gt;Para telas visualmente sensíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;matches open form layout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setViewportSize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;793&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="sr"&gt;/verificar/i&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;form-open.png&lt;/span&gt;&lt;span class="dl"&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;Esse teste pega regressões difíceis de cobrir só com assertions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;botão quebrando linha&lt;/li&gt;
&lt;li&gt;texto saindo do container&lt;/li&gt;
&lt;li&gt;painel desalinhado&lt;/li&gt;
&lt;li&gt;scroll inesperado&lt;/li&gt;
&lt;li&gt;espaçamento quebrado&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O que mudou na prática
&lt;/h2&gt;

&lt;p&gt;Com esse fluxo, o Codex virou uma ferramenta de engenharia, não só geração de código.&lt;/p&gt;

&lt;p&gt;Ganhos principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;menos tempo em boilerplate&lt;/li&gt;
&lt;li&gt;refactors mais rápidos&lt;/li&gt;
&lt;li&gt;testes criados junto com a alteração&lt;/li&gt;
&lt;li&gt;design mais próximo da implementação&lt;/li&gt;
&lt;li&gt;regressões visuais detectadas cedo&lt;/li&gt;
&lt;li&gt;revisão mais objetiva&lt;/li&gt;
&lt;li&gt;padrões documentados no repositório&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Codex e MCP do Figma ajudam muito no desenvolvimento frontend.&lt;/p&gt;

&lt;p&gt;Mas a aceleração sustentável vem da combinação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contexto claro&lt;/li&gt;
&lt;li&gt;instruções versionadas&lt;/li&gt;
&lt;li&gt;mudanças pequenas&lt;/li&gt;
&lt;li&gt;testes automatizados&lt;/li&gt;
&lt;li&gt;validação visual&lt;/li&gt;
&lt;li&gt;revisão humana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IA boa não substitui engenharia. Ela aumenta a velocidade de quem sabe definir limites e validar resultado.&lt;/p&gt;




&lt;h2&gt;
  
  
  AGENTS.md exemplo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# AGENTS.md&lt;/span&gt;

&lt;span class="gu"&gt;## Purpose&lt;/span&gt;

This project uses React, Vite and TypeScript with a focus on predictable, typed, testable and maintainable code.

&lt;span class="gu"&gt;## Language Rule&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All source code must be written in English.
&lt;span class="p"&gt;-&lt;/span&gt; Use English for identifiers, file names, comments, constants and test names.
&lt;span class="p"&gt;-&lt;/span&gt; User-facing UI copy may follow product requirements.

&lt;span class="gu"&gt;## Stack&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; React
&lt;span class="p"&gt;-&lt;/span&gt; Vite
&lt;span class="p"&gt;-&lt;/span&gt; TypeScript
&lt;span class="p"&gt;-&lt;/span&gt; ESLint
&lt;span class="p"&gt;-&lt;/span&gt; Vitest + Testing Library
&lt;span class="p"&gt;-&lt;/span&gt; Playwright

&lt;span class="gu"&gt;## Main Commands&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`npm run dev`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run test:e2e`&lt;/span&gt;

Before closing a meaningful change, run at least &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt; and the relevant test suite.

&lt;span class="gu"&gt;## Project Structure&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`src/app`&lt;/span&gt;: app composition and providers
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`src/pages`&lt;/span&gt;: route-level pages
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`src/features`&lt;/span&gt;: domain-specific modules
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`src/shared`&lt;/span&gt;: reusable UI, styles, config and utilities
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`src/test`&lt;/span&gt;: Vitest setup and helpers
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`e2e`&lt;/span&gt;: Playwright specs and page objects

&lt;span class="gu"&gt;## Core Conventions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Prefer small, local and predictable changes.
&lt;span class="p"&gt;-&lt;/span&gt; Prefer composition over premature abstraction.
&lt;span class="p"&gt;-&lt;/span&gt; Keep business logic out of purely visual components.
&lt;span class="p"&gt;-&lt;/span&gt; Avoid generic &lt;span class="sb"&gt;`utils.ts`&lt;/span&gt; dumping grounds.
&lt;span class="p"&gt;-&lt;/span&gt; Use explicit names for files, functions, props and types.
&lt;span class="p"&gt;-&lt;/span&gt; Do not introduce &lt;span class="sb"&gt;`any`&lt;/span&gt; unless there is a strong reason.

&lt;span class="gu"&gt;## React and TypeScript&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use functional components.
&lt;span class="p"&gt;-&lt;/span&gt; Keep components focused on one responsibility.
&lt;span class="p"&gt;-&lt;/span&gt; Derive values from props and state instead of duplicating state.
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`useEffect`&lt;/span&gt; only for real side effects.
&lt;span class="p"&gt;-&lt;/span&gt; Do not add &lt;span class="sb"&gt;`useMemo`&lt;/span&gt; or &lt;span class="sb"&gt;`useCallback`&lt;/span&gt; by default.

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Test user-visible behavior, not implementation details.
&lt;span class="p"&gt;-&lt;/span&gt; Prefer Testing Library queries by role, text or label.
&lt;span class="p"&gt;-&lt;/span&gt; Add tests when fixing bugs or introducing meaningful flows.
&lt;span class="p"&gt;-&lt;/span&gt; Keep unit, integration and E2E scopes separate.

&lt;span class="gu"&gt;## Checklist&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; The change respects project boundaries.
&lt;span class="p"&gt;-&lt;/span&gt; Types are clear.
&lt;span class="p"&gt;-&lt;/span&gt; No redundant state was introduced.
&lt;span class="p"&gt;-&lt;/span&gt; Relevant linting and tests were executed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Figma Dev Mode MCP Server: &lt;a href="https://developers.figma.com/docs/figma-mcp-server/local-server-installation/" rel="noopener noreferrer"&gt;https://developers.figma.com/docs/figma-mcp-server/local-server-installation/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Guia do Figma MCP Server: &lt;a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Figma-MCP-server" rel="noopener noreferrer"&gt;https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Figma-MCP-server&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Track YC Demo Day Companies in Real Time (with code)</title>
      <dc:creator>NexGenData</dc:creator>
      <pubDate>Fri, 22 May 2026 18:15:30 +0000</pubDate>
      <link>https://dumb.dev.to/nexgendata/track-yc-demo-day-companies-in-real-time-with-code-5668</link>
      <guid>https://dumb.dev.to/nexgendata/track-yc-demo-day-companies-in-real-time-with-code-5668</guid>
      <description>&lt;h1&gt;
  
  
  Track YC Demo Day Companies in Real Time (with code)
&lt;/h1&gt;

&lt;p&gt;Y Combinator Demo Day is the single most concentrated VC sourcing event of the year. Twice annually, ~250 companies present back-to-back over 1-2 days. Within 48 hours, the top 50 have term sheets. Within 7 days, the next 50 have term sheets. By day 14, the remaining 150 are either oversubscribed or starting to struggle.&lt;/p&gt;

&lt;p&gt;The associate's job at a multi-stage fund during Demo Day is roughly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Within 6 hours: scrape every company's details from the YC site&lt;/li&gt;
&lt;li&gt;Within 12 hours: triage to the 30-50 worth investigating&lt;/li&gt;
&lt;li&gt;Within 24 hours: book first calls with the top 15&lt;/li&gt;
&lt;li&gt;Within 48 hours: close on the top 5&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The bottleneck is step 1 — and it's an entirely-solvable bottleneck. YC's company directory updates in real time as Demo Day progresses. The Algolia-indexed search behind the YC site is publicly queryable. With 50 lines of Python you can pull the full active-batch roster in under 5 seconds, refresh every 90 seconds, and have a live feed during Demo Day itself.&lt;/p&gt;

&lt;p&gt;This post is the working code, the join logic, and the prioritization framework. The &lt;a href="https://apify.com/nexgendata/yc-companies-directory-scraper" rel="noopener noreferrer"&gt;NexGenData YC Companies Directory&lt;/a&gt; actor wraps this if you want a hosted version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The YC Algolia Endpoint
&lt;/h2&gt;

&lt;p&gt;YC's company list page (&lt;code&gt;https://www.ycombinator.com/companies&lt;/code&gt;) is fully client-rendered. The page bundle includes a hardcoded Algolia application ID and a public read-only API key. Both are visible in the browser dev tools network tab.&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;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="n"&gt;YC_ALGOLIA_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://45bwzj1sgc-dsn.algolia.net/1/indexes/YCCompany_production/query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;YC_ALGOLIA_HEADERS&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;X-Algolia-Application-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;45BWZJ1SGC&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;X-Algolia-API-Key&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;Y2VkOWQyMTJlYjZkZjE3MDRkY2YyNjBmYmIzMjVhMzA1ZmRlYTQ4OTUyZjEyZjRiNzc0OWQ4MjRmMzVlYmUxN3RhZ0ZpbHRlcnM9JTViJTIyJTVEJmZpbHRlcnM9aXNIaXJpbmclM0F0cnVl&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;Content-Type&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;application/json&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="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_yc_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&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;S26&lt;/span&gt;&lt;span class="sh"&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="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Fetch all companies in a specific YC batch.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;payload&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;query&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="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hitsPerPage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;facetFilters&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;batch:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="si"&gt;}&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="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;YC_ALGOLIA_HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;YC_ALGOLIA_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;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;hits&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;A response hit looks like:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleCo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exampleco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"batch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"S26"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B2B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subindustry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTools"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"team_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"regions"&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="s2"&gt;"United States of America"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isHiring"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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="s2"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"developer-tools"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleCo lets developers..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://exampleco.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"long_description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleCo is the missing layer between..."&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;For a full active batch, expect 200-280 hits. Demo Day batches are gradually populated over the 90-day program — by Demo Day itself, all companies are publicly searchable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling for Real-Time Updates
&lt;/h2&gt;

&lt;p&gt;During Demo Day, YC's batch index updates in waves as companies present. To get a live feed:&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;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&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;live_demo_day_tracker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;seen_slugs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch_yc_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen_slugs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datetime&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;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] NEW: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&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="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;seen_slugs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  poll error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&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;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Polling every 90 seconds is gentle on YC's Algolia backend and keeps you within ~2 minutes of the actual update. Run it in a &lt;code&gt;tmux&lt;/code&gt; session during Demo Day; pipe output to Slack via a webhook for team-wide visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Triage Logic: From 250 Companies to 30 Worth Investigating
&lt;/h2&gt;

&lt;p&gt;The hard part of Demo Day isn't ingest — it's prioritization. The naive approach (read all 250 descriptions) burns 3-4 hours and produces lukewarm shortlists. The better approach: pre-define your fund's thesis filters and score each company automatically.&lt;/p&gt;

&lt;p&gt;A simple scoring model:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;score_yc_company&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="c1"&gt;# Industry alignment (0-30 points)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;industry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_industries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;industry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adjacent_industries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;

    &lt;span class="c1"&gt;# Team size sweet spot (0-15 points)
&lt;/span&gt;    &lt;span class="n"&gt;team&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;team_size&lt;/span&gt;&lt;span class="sh"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;team&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;team&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;  &lt;span class="c1"&gt;# too early but not disqualifying
&lt;/span&gt;
    &lt;span class="c1"&gt;# Hiring signal (0-10 points)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;isHiring&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

    &lt;span class="c1"&gt;# Geography (0-10 points)
&lt;/span&gt;    &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;regions&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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_regions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

    &lt;span class="c1"&gt;# Tag overlap (0-20 points, 5/tag up to 4)
&lt;/span&gt;    &lt;span class="n"&gt;tag_overlap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;tags&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="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag_overlap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Description-based filter — keyword presence (0-15 points)
&lt;/span&gt;    &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;description&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="p"&gt;)&lt;/span&gt; &lt;span class="o"&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="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;long_description&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="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;keyword_hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thesis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyword_hits&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample thesis config for a B2B-SaaS-focused pre-seed fund:&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="n"&gt;B2B_SAAS_PRESEED&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;target_industries&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;B2B&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;adjacent_industries&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;Fintech&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;Healthcare&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;min_team&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;max_team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_regions&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;United States of America&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;Canada&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;target_tags&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;api&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;developer-tools&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;saas&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;infrastructure&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;automation&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;analytics&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;data&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;target_keywords&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;api&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;platform&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;automation&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;developer&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;dashboard&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;analytics&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;infrastructure&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;Run all 250 companies through the scoring function, sort by score descending, and the top 30 are your day-1 outbound list. Top 80 is your day-2/3 follow-up list. The bottom 140 you ignore unless something specific surfaces in a peer-investor conversation.&lt;/p&gt;

&lt;p&gt;This whole pipeline — fetch + score + sort — runs in under 8 seconds on a laptop. By contrast, manual triage of the same 250 companies takes 3-4 hours and is biased by reading order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Referencing With External Signals
&lt;/h2&gt;

&lt;p&gt;The real edge during Demo Day comes from cross-referencing YC's company data with external signals you've been tracking. Two sources that meaningfully sharpen the YC list:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn founder signal.&lt;/strong&gt; For each YC company, look up the founder LinkedIn profiles. Founders with prior senior IC roles at brand-name companies (FAANG, Stripe, Datadog, Snowflake, etc.) score 1.5-2x on conversion vs first-time founders without that pedigree. Auto-adding a "founder pedigree" multiplier pulls the right companies forward without manual triage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker News engagement.&lt;/strong&gt; YC companies whose CEO has an HN account with &amp;gt;500 karma and recent post history are statistically more articulate, more likely to be making something engineers want to talk about, and more likely to convert on a thoughtful cold email. The &lt;a href="https://apify.com/nexgendata/hacker-news-scraper" rel="noopener noreferrer"&gt;NexGenData Hacker News Scraper&lt;/a&gt; actor pulls user metadata including karma and post counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show HN history.&lt;/strong&gt; A YC company whose founder previously launched a Show HN post (even a different project) is, statistically, in the top quartile of demo day quality. Show HN selects for builders. Pull this with the &lt;a href="https://apify.com/nexgendata/hn-show-hn-tracker" rel="noopener noreferrer"&gt;NexGenData Show HN Tracker&lt;/a&gt; actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost of Not Automating This
&lt;/h2&gt;

&lt;p&gt;Most VC sourcing teams I've worked with at series-A firms don't have a real demo day automation pipeline. They send 1-2 associates to the live event, take notes, and triage by hand over the following week. By the time their shortlist is ready, the top 30 companies have already had calls with 5-10 funds and are in active term-sheet negotiations.&lt;/p&gt;

&lt;p&gt;The cost isn't the data — YC publishes everything for free. The cost is the speed delta. A team running this pipeline can triage on the day of demo day and book first calls within 48 hours. A team triaging by hand books first calls 5-10 days later, by which time the deal is set.&lt;/p&gt;

&lt;p&gt;Cost of building it yourself: ~1 day of engineering, then ~$5/month of compute. Cost of using the &lt;a href="https://apify.com/nexgendata/yc-companies-directory-scraper" rel="noopener noreferrer"&gt;YC Companies Directory actor&lt;/a&gt;: $0.01/company × ~270 companies/batch = ~$2.70/batch, runnable on demand.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://apify.com/nexgendata?fpr=2ayu9b" rel="noopener noreferrer"&gt;NexGenData publishes 195+ actors&lt;/a&gt; covering startup-stage signals: YC alumni, Show HN, Product Hunt, Delaware C-corp formations, SEC Form D, and more. All pay-per-result.&lt;/p&gt;

</description>
      <category>ycombinator</category>
      <category>demoday</category>
      <category>scraping</category>
      <category>preseed</category>
    </item>
    <item>
      <title>Google’s AI Search Demos Revealed a Ranking Crisis Hiding Inside the Web</title>
      <dc:creator>Touhidul Islam Protik</dc:creator>
      <pubDate>Fri, 22 May 2026 18:12:13 +0000</pubDate>
      <link>https://dumb.dev.to/protik_49/googles-ai-search-demos-revealed-a-ranking-crisis-hiding-inside-the-web-5f00</link>
      <guid>https://dumb.dev.to/protik_49/googles-ai-search-demos-revealed-a-ranking-crisis-hiding-inside-the-web-5f00</guid>
      <description>&lt;p&gt;The most revealing part of Google I/O 2026 wasn’t the AI.&lt;/p&gt;

&lt;p&gt;It was what quietly disappeared from the search result.&lt;/p&gt;

&lt;p&gt;Links.&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%2Flhfbi86lcf9bubkk06wj.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%2Flhfbi86lcf9bubkk06wj.png" alt="Google I/O 2026" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not completely.&lt;br&gt;
Not yet.&lt;/p&gt;

&lt;p&gt;But enough to expose a growing tension Google rarely addresses directly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI-native search changes the economic structure of the web itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And I don’t think the industry fully understands the consequences yet.&lt;/p&gt;




&lt;h1&gt;
  
  
  Search Results Used to Be Destinations
&lt;/h1&gt;

&lt;p&gt;Classic Google Search operated on a relatively stable exchange.&lt;/p&gt;

&lt;p&gt;Websites created information.&lt;br&gt;
Google indexed and ranked it.&lt;br&gt;
Users clicked through.&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%2Fwiifu08yaqcdur4tz6r8.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%2Fwiifu08yaqcdur4tz6r8.png" alt="PageRank" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone benefited differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users got discovery&lt;/li&gt;
&lt;li&gt;publishers got traffic&lt;/li&gt;
&lt;li&gt;Google got engagement&lt;/li&gt;
&lt;li&gt;creators got visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ecosystem depended on referral flow.&lt;/p&gt;

&lt;p&gt;That flow shaped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;publishing&lt;/li&gt;
&lt;li&gt;blogging&lt;/li&gt;
&lt;li&gt;affiliate systems&lt;/li&gt;
&lt;li&gt;journalism&lt;/li&gt;
&lt;li&gt;tutorials&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;even startup growth models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Search visibility became distribution infrastructure for the internet itself.&lt;/p&gt;

&lt;p&gt;That’s why ranking mattered so much.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI Overviews Quietly Alter the Incentive Structure
&lt;/h1&gt;

&lt;p&gt;Google’s recent AI search experiences increasingly collapse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieval&lt;/li&gt;
&lt;li&gt;summarization&lt;/li&gt;
&lt;li&gt;synthesis&lt;/li&gt;
&lt;li&gt;recommendation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;into a single interface layer.&lt;/p&gt;

&lt;p&gt;The user asks something complex.&lt;/p&gt;

&lt;p&gt;The system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interprets intent&lt;/li&gt;
&lt;li&gt;extracts information&lt;/li&gt;
&lt;li&gt;synthesizes responses&lt;/li&gt;
&lt;li&gt;generates follow-up reasoning&lt;/li&gt;
&lt;li&gt;sometimes completes the task directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without requiring navigation across multiple websites.&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%2Ff41u2kqb0lnv4u3ow5sp.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%2Ff41u2kqb0lnv4u3ow5sp.png" alt="Google AI Search" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a user perspective, this feels efficient.&lt;/p&gt;

&lt;p&gt;From a web ecosystem perspective, it changes everything.&lt;/p&gt;

&lt;p&gt;Because the moment answers stop requiring visits,&lt;br&gt;
traffic dynamics change fundamentally.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Important Shift Isn’t “Better Search”
&lt;/h1&gt;

&lt;p&gt;It’s Search Becoming an Execution Layer&lt;/p&gt;

&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;Traditional search engines helped users locate destinations.&lt;/p&gt;

&lt;p&gt;AI-native search increasingly attempts to complete objectives internally.&lt;/p&gt;

&lt;p&gt;That sounds subtle until you realize how much software architecture depends on outbound interaction.&lt;/p&gt;

&lt;p&gt;Historically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;search → website → action&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the pipeline increasingly becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;search → synthesis → completion&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That bypass layer is economically significant.&lt;/p&gt;

&lt;p&gt;Especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publishers&lt;/li&gt;
&lt;li&gt;forums&lt;/li&gt;
&lt;li&gt;educational sites&lt;/li&gt;
&lt;li&gt;independent blogs&lt;/li&gt;
&lt;li&gt;comparison platforms&lt;/li&gt;
&lt;li&gt;long-tail creators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web was built around referral behavior.&lt;/p&gt;

&lt;p&gt;AI-native retrieval compresses that behavior aggressively.&lt;/p&gt;




&lt;h1&gt;
  
  
  Google’s Demos Kept Prioritizing Completion Over Navigation
&lt;/h1&gt;

&lt;p&gt;This pattern appeared repeatedly throughout recent I/O showcases.&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%2Fgfso4ua9xb5cnmtfba5f.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%2Fgfso4ua9xb5cnmtfba5f.png" alt="Google I/O 2026" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system wasn’t merely finding information.&lt;/p&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;planning trips&lt;/li&gt;
&lt;li&gt;comparing products&lt;/li&gt;
&lt;li&gt;summarizing research&lt;/li&gt;
&lt;li&gt;scheduling actions&lt;/li&gt;
&lt;li&gt;organizing decisions&lt;/li&gt;
&lt;li&gt;maintaining conversational continuity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interaction goal shifted from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“show relevant pages”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“reduce interaction friction entirely.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a very different philosophy of search.&lt;/p&gt;

&lt;p&gt;And honestly, it starts resembling an operating environment more than a discovery engine.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI Summarization Creates an Attribution Compression Problem
&lt;/h1&gt;

&lt;p&gt;This is where things become structurally uncomfortable.&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%2F65h5zw4dmfs7qvgpw6xr.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%2F65h5zw4dmfs7qvgpw6xr.png" alt="Report Finds AI Tools Are Not Good at Citing Accurate Sources " width="700" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Large models depend heavily on web-scale information ecosystems.&lt;/p&gt;

&lt;p&gt;But synthesized outputs compress visibility dramatically.&lt;/p&gt;

&lt;p&gt;Ten websites may contribute signal.&lt;br&gt;
One interface delivers the answer.&lt;/p&gt;

&lt;p&gt;The user experiences coherence.&lt;/p&gt;

&lt;p&gt;The ecosystem experiences invisibility.&lt;/p&gt;

&lt;p&gt;That creates a strange imbalance:&lt;br&gt;
the systems benefiting most from the open web may gradually reduce the visibility incentives sustaining that same web.&lt;/p&gt;

&lt;p&gt;And unlike earlier search evolution,&lt;br&gt;
this compression happens conversationally.&lt;/p&gt;

&lt;p&gt;Which makes source boundaries feel psychologically weaker.&lt;/p&gt;




&lt;h1&gt;
  
  
  Reddit Became Valuable for a Reason
&lt;/h1&gt;

&lt;p&gt;One fascinating trend across Google’s AI search evolution:&lt;/p&gt;

&lt;p&gt;Human discussion suddenly became premium data.&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%2Fikg3o3lr3uu7u3txfk55.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%2Fikg3o3lr3uu7u3txfk55.png" alt="Reddit" width="800" height="1242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Especially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit&lt;/li&gt;
&lt;li&gt;forums&lt;/li&gt;
&lt;li&gt;niche communities&lt;/li&gt;
&lt;li&gt;long-tail expertise&lt;/li&gt;
&lt;li&gt;experience-heavy content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because heavily SEO-optimized content became increasingly homogeneous.&lt;/p&gt;

&lt;p&gt;A huge portion of the web started sounding structurally identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optimized headings&lt;/li&gt;
&lt;li&gt;repeated keywords&lt;/li&gt;
&lt;li&gt;templated formatting&lt;/li&gt;
&lt;li&gt;rewritten summaries&lt;/li&gt;
&lt;li&gt;affiliate-driven language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LLMs exposed that sameness brutally.&lt;/p&gt;

&lt;p&gt;Human unpredictability became useful again.&lt;/p&gt;

&lt;p&gt;Messy opinions.&lt;br&gt;
Specific experiences.&lt;br&gt;
Contradictions.&lt;br&gt;
Actual personality.&lt;/p&gt;

&lt;p&gt;Ironically, AI may have accidentally increased the value of authentic human context.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI Search Quietly Weakens Traditional SEO Assumptions
&lt;/h1&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%2Fbsdv0s1h1uvvqyzsrprn.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%2Fbsdv0s1h1uvvqyzsrprn.png" alt="AI SEO" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For years, SEO mostly optimized around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ranking position&lt;/li&gt;
&lt;li&gt;click-through rates&lt;/li&gt;
&lt;li&gt;keyword relevance&lt;/li&gt;
&lt;li&gt;structured metadata&lt;/li&gt;
&lt;li&gt;backlink authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI-native search introduces new dynamics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chunk retrieval&lt;/li&gt;
&lt;li&gt;semantic relevance&lt;/li&gt;
&lt;li&gt;synthesis quality&lt;/li&gt;
&lt;li&gt;conversational usefulness&lt;/li&gt;
&lt;li&gt;citation selection&lt;/li&gt;
&lt;li&gt;answer extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The unit of visibility shifts from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“page ranking”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;toward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“extractable informational utility.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a much stranger optimization target.&lt;/p&gt;

&lt;p&gt;Especially because users may consume the information&lt;br&gt;
without ever visiting the original source.&lt;/p&gt;




&lt;h1&gt;
  
  
  This May Create a “Visibility Without Audience” Problem
&lt;/h1&gt;

&lt;p&gt;A website can influence AI-generated answers heavily&lt;br&gt;
while receiving almost no direct user interaction.&lt;/p&gt;

&lt;p&gt;That’s historically unusual.&lt;/p&gt;

&lt;p&gt;Previously:&lt;br&gt;
visibility and audience were tightly connected.&lt;/p&gt;

&lt;p&gt;Now they may separate.&lt;/p&gt;

&lt;p&gt;A creator’s knowledge might shape millions of AI interactions invisibly while generating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer visits&lt;/li&gt;
&lt;li&gt;weaker branding&lt;/li&gt;
&lt;li&gt;lower subscriber growth&lt;/li&gt;
&lt;li&gt;reduced monetization opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web has never really operated under those conditions before.&lt;/p&gt;

&lt;p&gt;And I honestly don’t think we know what sustainable incentives look like there yet.&lt;/p&gt;




&lt;h1&gt;
  
  
  Google Seems to Be Optimizing for Cognitive Efficiency
&lt;/h1&gt;

&lt;p&gt;This became increasingly obvious during the demos.&lt;/p&gt;

&lt;p&gt;The system’s goal wasn’t:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exploration&lt;/li&gt;
&lt;li&gt;browsing&lt;/li&gt;
&lt;li&gt;wandering&lt;/li&gt;
&lt;li&gt;discovery depth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was compression.&lt;/p&gt;

&lt;p&gt;Fewer tabs.&lt;br&gt;
Fewer clicks.&lt;br&gt;
Less reconstruction effort.&lt;br&gt;
Less navigation overhead.&lt;/p&gt;

&lt;p&gt;From a usability perspective, that’s compelling.&lt;/p&gt;

&lt;p&gt;From an internet ecosystem perspective, it’s destabilizing.&lt;/p&gt;

&lt;p&gt;Because the open web historically depended on friction-driven exploration.&lt;/p&gt;

&lt;p&gt;Curiosity often emerged accidentally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;related articles&lt;/li&gt;
&lt;li&gt;side links&lt;/li&gt;
&lt;li&gt;forum tangents&lt;/li&gt;
&lt;li&gt;rabbit holes&lt;/li&gt;
&lt;li&gt;unexpected creators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI synthesis compresses those pathways aggressively.&lt;/p&gt;

&lt;p&gt;The experience becomes efficient.&lt;/p&gt;

&lt;p&gt;Potentially too efficient.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Web May Slowly Split Into Two Layers
&lt;/h1&gt;

&lt;p&gt;I keep coming back to this possibility.&lt;/p&gt;

&lt;p&gt;One layer becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;machine-readable&lt;/li&gt;
&lt;li&gt;retrieval-optimized&lt;/li&gt;
&lt;li&gt;structured for AI synthesis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The other becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personality-driven&lt;/li&gt;
&lt;li&gt;experiential&lt;/li&gt;
&lt;li&gt;community-based&lt;/li&gt;
&lt;li&gt;difficult to compress cleanly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because purely informational content is increasingly vulnerable to summarization abstraction.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;perspective&lt;/li&gt;
&lt;li&gt;identity&lt;/li&gt;
&lt;li&gt;lived experience&lt;/li&gt;
&lt;li&gt;trust&lt;/li&gt;
&lt;li&gt;humor&lt;/li&gt;
&lt;li&gt;voice&lt;/li&gt;
&lt;li&gt;interpretation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;still resist compression much more effectively.&lt;/p&gt;

&lt;p&gt;That may explain why personal writing suddenly feels more valuable again.&lt;/p&gt;




&lt;h1&gt;
  
  
  Google Isn’t Just Rebuilding Search
&lt;/h1&gt;

&lt;p&gt;It’s renegotiating the relationship between information and interaction.&lt;/p&gt;

&lt;p&gt;That’s a much larger transition than “AI answers.”&lt;/p&gt;

&lt;p&gt;Because once search engines stop functioning primarily as traffic routers,&lt;br&gt;
the structure of the web itself changes with them.&lt;/p&gt;

&lt;p&gt;And honestly, I don’t think the final outcome depends on model intelligence nearly as much as incentive design.&lt;/p&gt;

&lt;p&gt;Historically, the internet grew because visibility rewarded contribution.&lt;/p&gt;

&lt;p&gt;AI-native search quietly weakens that exchange.&lt;/p&gt;

&lt;p&gt;The difficult question now is whether the web can remain generative&lt;br&gt;
after the referral loop starts collapsing underneath it.&lt;/p&gt;

</description>
      <category>googleiochallenge</category>
    </item>
    <item>
      <title>I Got Tired of Passing --profile on Every OCI CLI Command</title>
      <dc:creator>Amaan Ul Haq Siddiqui</dc:creator>
      <pubDate>Fri, 22 May 2026 18:12:00 +0000</pubDate>
      <link>https://dumb.dev.to/amaanx86/i-got-tired-of-passing-profile-on-every-oci-cli-command-3jpd</link>
      <guid>https://dumb.dev.to/amaanx86/i-got-tired-of-passing-profile-on-every-oci-cli-command-3jpd</guid>
      <description>&lt;p&gt;This is a problem you only run into if you work for Oracle directly or you work at a Cloud/DevOps MSP managing OCI for multiple clients. Most people will never touch it. If you are reading this, you are probably not most people.&lt;/p&gt;

&lt;p&gt;The OCI CLI already demands a &lt;code&gt;--compartment-id&lt;/code&gt; on almost every command. Compartment IDs are long, they are not memorable, and you need a different one depending on what you are looking at. That was already a nightmare before you add multiple tenancies to the picture. Once you are juggling prod, staging, dev, and a handful of client accounts, passing &lt;code&gt;--profile&lt;/code&gt; on top of &lt;code&gt;--compartment-id&lt;/code&gt; on every single command becomes the kind of friction that breaks you.&lt;/p&gt;

&lt;p&gt;So I wrote &lt;code&gt;ocswitch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the OCI CLI Actually Gives You
&lt;/h2&gt;

&lt;p&gt;The OCI CLI reads config from &lt;code&gt;~/.oci/config&lt;/code&gt; by default. You can point it at a different file with &lt;code&gt;OCI_CONFIG_FILE&lt;/code&gt;, and select a named profile within that file with &lt;code&gt;OCI_CLI_PROFILE&lt;/code&gt;. That is the full surface area you have to work with.&lt;/p&gt;

&lt;p&gt;The multi-profile story in the official tooling is basically: put multiple &lt;code&gt;[PROFILE_NAME]&lt;/code&gt; sections in one config file and pass &lt;code&gt;--profile PROFILE_NAME&lt;/code&gt; every time. If you forget the flag, you hit whichever profile is in &lt;code&gt;[DEFAULT]&lt;/code&gt;. This works but it is tedious, and it is session-scoped - export the env var in one terminal, open another, you are back to default.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ocswitch&lt;/code&gt; fixes the persistence problem by writing the active profile to &lt;code&gt;~/.oci/active_profile&lt;/code&gt; and restoring it at shell startup.&lt;/p&gt;

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

&lt;p&gt;Profiles are separate config files in &lt;code&gt;~/.oci/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;~/.&lt;span class="n"&gt;oci&lt;/span&gt;/&lt;span class="n"&gt;config_prod&lt;/span&gt;
~/.&lt;span class="n"&gt;oci&lt;/span&gt;/&lt;span class="n"&gt;config_staging&lt;/span&gt;
~/.&lt;span class="n"&gt;oci&lt;/span&gt;/&lt;span class="n"&gt;config_dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One file per tenancy, named &lt;code&gt;config_&amp;lt;profile&amp;gt;&lt;/code&gt;. When you switch:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Two things happen: &lt;code&gt;~/.oci/active_profile&lt;/code&gt; gets written with the string &lt;code&gt;prod&lt;/code&gt;, and &lt;code&gt;OCI_CONFIG_FILE&lt;/code&gt; plus &lt;code&gt;OCI_CLI_PROFILE&lt;/code&gt; are exported in the current shell. Every &lt;code&gt;oci&lt;/code&gt; command you run after that hits the prod tenancy.&lt;/p&gt;

&lt;p&gt;The persistence part lives at the top of the script, outside the function, so it runs every time the shell sources the file:&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="nv"&gt;_oci_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.oci/active_profile"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_oci_state&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;_oci_profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_oci_state&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;_oci_cfg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.oci/config_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_oci_profile&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_oci_cfg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OCI_CONFIG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_oci_cfg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OCI_CLI_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"config_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_oci_profile&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi
fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a new terminal, source kicks in, reads the state file, exports the right vars. The active profile follows you across sessions without any extra steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Looks Like
&lt;/h2&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%2F8s9c8hdm8t2w2mswt1l9.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%2F8s9c8hdm8t2w2mswt1l9.png" alt="ocswitch terminal output" width="799" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ocswitch list&lt;/code&gt; shows all detected profiles (anything matching &lt;code&gt;~/.oci/config_*&lt;/code&gt;) with the active one highlighted in Oracle red. &lt;code&gt;ocswitch clear&lt;/code&gt; removes the state file and unsets both env vars.&lt;/p&gt;

&lt;p&gt;Tab completion is included for both bash and zsh. Hit tab after &lt;code&gt;ocswitch&lt;/code&gt; and you get &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;clear&lt;/code&gt;, and all your profile names.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ocid Bonus
&lt;/h2&gt;

&lt;p&gt;There is a second function in the script: &lt;code&gt;ocid&lt;/code&gt;. It reads the active config, pulls the tenancy OCID and user OCID out of it, and calls the OCI IAM API to resolve the human-readable names:&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;Tenant Name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mycompany-production&lt;/span&gt;
&lt;span class="na"&gt;Tenant ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;ocid1.tenancy.oc1..aaaa...&lt;/span&gt;
&lt;span class="na"&gt;User Email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;user@example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful when you have switched between a few profiles and want to confirm exactly which tenancy you are currently pointing at before running something destructive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;zsh&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gist.githubusercontent.com/amaanx86/2621a181e2f4b572a1904d65748d66bd/raw/ocswitch.zsh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; ~/.oci/ocswitch.zsh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source ~/.oci/ocswitch.zsh'&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;p&gt;&lt;strong&gt;bash&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gist.githubusercontent.com/amaanx86/2621a181e2f4b572a1904d65748d66bd/raw/ocswitch.bash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; ~/.oci/ocswitch.bash
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source ~/.oci/ocswitch.bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ocswitch               &lt;span class="c"&gt;# show help + logo&lt;/span&gt;
ocswitch list          &lt;span class="c"&gt;# list profiles (active highlighted)&lt;/span&gt;
ocswitch &amp;lt;profile&amp;gt;     &lt;span class="c"&gt;# switch profile (persists across all terminals)&lt;/span&gt;
ocswitch clear         &lt;span class="c"&gt;# clear active profile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Profile Setup
&lt;/h2&gt;

&lt;p&gt;Each profile is a standard OCI config file at &lt;code&gt;~/.oci/config_&amp;lt;profile&amp;gt;&lt;/code&gt;. The section header inside the file uses the same name as the file itself, not &lt;code&gt;[DEFAULT]&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[config_prod]&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ocid1.user.oc1..aaaa...&lt;/span&gt;
&lt;span class="py"&gt;fingerprint&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;xx:xx:xx:...&lt;/span&gt;
&lt;span class="py"&gt;tenancy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ocid1.tenancy.oc1..aaaa...&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;us-ashburn-1&lt;/span&gt;
&lt;span class="py"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;~/.oci/oci_api_key.pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So &lt;code&gt;~/.oci/config_staging&lt;/code&gt; has &lt;code&gt;[config_staging]&lt;/code&gt; inside, &lt;code&gt;~/.oci/config_dev&lt;/code&gt; has &lt;code&gt;[config_dev]&lt;/code&gt;, and so on.&lt;/p&gt;




&lt;p&gt;The full source is in &lt;a href="https://gist.github.com/amaanx86/2621a181e2f4b572a1904d65748d66bd" rel="noopener noreferrer"&gt;this gist&lt;/a&gt;. Two files, one for bash and one for zsh, no external dependencies beyond the OCI CLI itself.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://amaanx86.github.io/blog/ocswitch-oci-profile-switcher/" rel="noopener noreferrer"&gt;amaanx86.github.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>infrastructure</category>
      <category>oracle</category>
      <category>linux</category>
    </item>
    <item>
      <title>Running Flux Schnell (12B) + LLMs on a Legacy AMD RX 580 (8GB) via Native Vulkan — Full Architecture Guide [2026]</title>
      <dc:creator>AIVisionsLab</dc:creator>
      <pubDate>Fri, 22 May 2026 18:09:52 +0000</pubDate>
      <link>https://dumb.dev.to/aivisionslab/running-flux-schnell-12b-llms-on-a-legacy-amd-rx-580-8gb-via-native-vulkan-full-1aa8</link>
      <guid>https://dumb.dev.to/aivisionslab/running-flux-schnell-12b-llms-on-a-legacy-amd-rx-580-8gb-via-native-vulkan-full-1aa8</guid>
      <description>&lt;p&gt;Most people were told the RX 580 was dead for AI in 2026. CUDA-only ecosystems, ROCm dropping Polaris support at v5.x, DirectML abandoned before it matured. This is the full technical breakdown of how we proved that wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU:&lt;/strong&gt; AMD RX 580 2048SP — 8GB GDDR5 VRAM (Vulkan 1.x native)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU:&lt;/strong&gt; Intel Xeon E5-2690 v3 — 12c/24t @ 3.5GHz boost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; 32GB DDR4 REG ECC Quad Channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; NVMe 1TB — &lt;strong&gt;critical bottleneck fix&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Windows 10 Pro + WSL2 Ubuntu 22.04.5&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why everything else failed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CUDA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Nvidia-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ROCm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Dropped Polaris at v5.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DirectML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;OpaqueTensorImpl crash on CLIPTextEncode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenVINO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;ldm/sgm modules missing on Forge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  DirectML's fatal error:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NotImplementedError: Cannot access storage of OpaqueTensorImpl

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The driver wraps memory in opaque tensors that ComfyUI's attention backends can't read. It's a dead end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution — Dual Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PATH 1 — GPU Vulkan (RX 580 acceleration)
&lt;/h3&gt;

&lt;p&gt;Native build of &lt;code&gt;stable-diffusion.cpp&lt;/code&gt; compiled with &lt;code&gt;-DGGML_VULKAN=ON&lt;/code&gt;. The ggml engine maps directly to the GPU without ROCm or CUDA. SD 1.5 GGUF models render in ~72 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  PATH 2 — CPU Xeon (SOTA heavy models)
&lt;/h3&gt;

&lt;p&gt;FLUX.1 Schnell at 16GB exceeds physical VRAM. ComfyUI runs via CPU inside WSL2, using ECC RAM as stable virtual VRAM. Full 768x768 generation in ~24 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Memory Segmentation for Flux (12B Q4_K)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Allocation Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diffusion Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;flux1-schnell-q4_k.gguf&lt;/td&gt;
&lt;td&gt;GPU VRAM ~6.5GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VAE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ae.safetensors&lt;/td&gt;
&lt;td&gt;CPU RAM ~160MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLIP L&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;clip_l.safetensors&lt;/td&gt;
&lt;td&gt;GPU VRAM ~235MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;T5XXL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;t5xxl_fp16.safetensors&lt;/td&gt;
&lt;td&gt;CPU RAM ~9.3GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Production command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sd-server.exe &lt;span class="nt"&gt;--listen-ip&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--listen-port&lt;/span&gt; 7860 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--diffusion-model&lt;/span&gt; &lt;span class="s2"&gt;"E:&lt;/span&gt;&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="s2"&gt;odels&lt;/span&gt;&lt;span class="se"&gt;\f&lt;/span&gt;&lt;span class="s2"&gt;lux1-schnell-q4_k.gguf"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vae&lt;/span&gt; &lt;span class="s2"&gt;"E:&lt;/span&gt;&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="s2"&gt;odels&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;e.safetensors"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clip_l&lt;/span&gt; &lt;span class="s2"&gt;"E:&lt;/span&gt;&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="s2"&gt;odels&lt;/span&gt;&lt;span class="se"&gt;\c&lt;/span&gt;&lt;span class="s2"&gt;lip_l.safetensors"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--t5xxl&lt;/span&gt; &lt;span class="s2"&gt;"E:&lt;/span&gt;&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="s2"&gt;odels&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;5xxl_fp16.safetensors"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cfg-scale&lt;/span&gt; 1.0 &lt;span class="nt"&gt;--steps&lt;/span&gt; 4 &lt;span class="nt"&gt;--clip-on-cpu&lt;/span&gt; &lt;span class="nt"&gt;--vae-on-cpu&lt;/span&gt; &lt;span class="nt"&gt;--vae-tiling&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--vae-on-cpu&lt;/code&gt; + &lt;code&gt;--vae-tiling&lt;/code&gt; are non-negotiable. Without them: instant &lt;code&gt;DeviceMemoryAllocation&lt;/code&gt; crash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Benchmarks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM text inference&lt;/td&gt;
&lt;td&gt;CPU only&lt;/td&gt;
&lt;td&gt;3–5 tokens/s ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM text inference&lt;/td&gt;
&lt;td&gt;RX 580 Vulkan&lt;/td&gt;
&lt;td&gt;15–16 tokens/s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SD 1.5 20 steps&lt;/td&gt;
&lt;td&gt;DirectML&lt;/td&gt;
&lt;td&gt;~450s + crash ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SD 1.5 20 steps&lt;/td&gt;
&lt;td&gt;Vulkan native&lt;/td&gt;
&lt;td&gt;~72s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flux 1024x1024&lt;/td&gt;
&lt;td&gt;Xeon CPU WSL2&lt;/td&gt;
&lt;td&gt;~24 min ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;NVMe impact:&lt;/strong&gt; Model load time dropped from 25 minutes (HDD) to 4 minutes (NVMe). For Flux 16GB: from 25 min to ~30 seconds. Storage is as critical as compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Service Map
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenWebUI Docker :3000
  ├── llama-server.exe :8081  (Vulkan — RX 580)
  ├── sd-server.exe    :7860  (Vulkan — RX 580)
  └── ComfyUI          :8188  (CPU — Xeon WSL2)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Full documentation, .bat orchestration scripts, compiled binaries and model configs:&lt;br&gt;
👉 &lt;a href="https://setup-ia-local-rx580-vulkan.firebaseapp.com/" rel="noopener noreferrer"&gt;https://setup-ia-local-rx580-vulkan.firebaseapp.com/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Hardware doesn't die. It gets liberated by the right software.&lt;/strong&gt; &lt;em&gt;Are you running legacy AMD cards? Let's discuss your buffer allocation and command queue latency findings in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Investigation Reports: When Monitors Get Smarter</title>
      <dc:creator>Patrick Londa</dc:creator>
      <pubDate>Fri, 22 May 2026 18:04:01 +0000</pubDate>
      <link>https://dumb.dev.to/bronto_io/investigation-reports-when-monitors-get-smarter-51ei</link>
      <guid>https://dumb.dev.to/bronto_io/investigation-reports-when-monitors-get-smarter-51ei</guid>
      <description>&lt;p&gt;&lt;em&gt;Authored by Marco Aquilanti&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a monitor fires, there's a familiar sequence of checks required to find the root cause. The engineers who set up the monitor usually know these steps by heart — they know the dependencies, the error codes, what to check and where. But for the on-call responder, these steps aren't always obvious. Historically, the solution was to force engineering teams to document the checks in a playbook and hope the responder would read it under pressure.&lt;/p&gt;

&lt;p&gt;Today, we can offload these checks to an LLM, shifting the responder's role from &lt;strong&gt;gathering evidence&lt;/strong&gt; to &lt;strong&gt;reviewing a diagnosis&lt;/strong&gt; — significantly reducing MTTR.&lt;/p&gt;

&lt;p&gt;Our new &lt;strong&gt;Investigation Reports&lt;/strong&gt; feature does exactly this: an LLM completes the investigation and delivers a detailed report before the human even acknowledges the alert.&lt;/p&gt;

&lt;p&gt;Investigation Reports builds on &lt;a href="https://www.bronto.io/blog/error-investigations-with-brontoscope" rel="noopener noreferrer"&gt;BrontoScope&lt;/a&gt;, our first AI-powered investigation feature — and on the positive customer feedback it generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  BrontoScope vs. Investigation Reports
&lt;/h2&gt;

&lt;p&gt;Both BrontoScope and Investigation Reports perform automated investigations and provide reports, but they work differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BrontoScope&lt;/strong&gt; starts with a user request to investigate a specific error event in the logs. The investigation follows a defined workflow aimed at establishing when and where an error is occurring. The LLM guides the process and summarizes findings synchronously — the user is waiting for a response and gets it in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investigation Reports&lt;/strong&gt; is triggered by a system event (a monitor firing), with no user waiting for a synchronous response. This gives the LLM more time — not seconds but minutes — to query data and analyze results. Investigating an alert is also a more generic task than BrontoScope's focused error investigation, making it harder to define a single fixed workflow that succeeds in every scenario.&lt;/p&gt;

&lt;p&gt;For these reasons, Investigation Reports lets the LLM operate more freely — giving it &lt;strong&gt;tools&lt;/strong&gt; and &lt;strong&gt;context&lt;/strong&gt; rather than a coded workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tools Are Easy, Context Is Hard
&lt;/h2&gt;

&lt;p&gt;The tools side is straightforward: the LLM can call Bronto's APIs to perform &lt;a href="https://www.bronto.io/blog/why-is-bronto-so-fast" rel="noopener noreferrer"&gt;lightning-fast log search&lt;/a&gt;, query key-value dictionaries, check monitor history, retrieve precomputed metrics, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt; is the harder problem.&lt;/p&gt;

&lt;p&gt;LLMs make good logical decisions when provided with relevant, well-explained context. But the context window is limited — and it's been demonstrated repeatedly that longer context leads to worse answers and higher hallucination rates. This is known as "context rot" (see &lt;a href="https://research.trychroma.com/context-rot" rel="noopener noreferrer"&gt;research from Chroma&lt;/a&gt; and &lt;a href="https://arxiv.org/pdf/2509.21361" rel="noopener noreferrer"&gt;this arXiv paper&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;For an effective investigation, the LLM needs more than just the monitor that fired. It needs historical context and an understanding of the monitored system. But dumping thousands of tokens of documentation into the prompt backfires — it drastically increases hallucination risk and degrades report accuracy.&lt;/p&gt;




&lt;h2&gt;
  
  
  User-Defined Investigation Context
&lt;/h2&gt;

&lt;p&gt;The precise knowledge needed for a good investigation is hard for an LLM to infer autonomously — but it can be provided by the engineer who owns the monitor.&lt;/p&gt;

&lt;p&gt;In a dedicated "Investigation Prompt" text area, the user instructs the LLM on what to check and what to do when the monitor fires. Free-form text makes the feature highly flexible, effectively letting users define an ad-hoc workflow for each specific use case.&lt;/p&gt;

&lt;p&gt;Engineers and SREs commonly include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List of dependencies of the affected service&lt;/li&gt;
&lt;li&gt;Related log datasets and how to correlate/query them&lt;/li&gt;
&lt;li&gt;Relevant keys and metrics to check&lt;/li&gt;
&lt;li&gt;What to include in the report — affected components, customers, or users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The screenshot below shows an example investigation prompt telling the LLM to check datasets in a collection named "booking system":&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%2Fte4por6ohzd2dlbx3x1f.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%2Fte4por6ohzd2dlbx3x1f.png" alt="Investigation prompt configuration" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's the Investigation Report generated when that monitor fired — the LLM followed the instructions, ran multiple queries, and produced a report with a potential root cause, diagnosis, and timeline:&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%2Fysaqs1s1qt78m983721s.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%2Fysaqs1s1qt78m983721s.png" alt="Generated investigation report" width="583" height="699"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Investigation Reports Beyond Incident Response
&lt;/h2&gt;

&lt;p&gt;Bronto's own customer support and sales teams found an unexpected use case. They set up monitors to be notified when new organizations are created or contracts are updated in the system — keeping the team up to date on new sign-ups and customer onboarding.&lt;/p&gt;

&lt;p&gt;Investigation Reports automates the task of fetching context about each event. Details like contract type, retention plan, company size, and location are queried across multiple logs and assembled into a report that arrives within a minute of the monitor notification. This lets the team quickly identify relevant events among routine ones.&lt;/p&gt;

&lt;p&gt;Below is the investigation prompt used by the customer support team, and an example of the automatically generated report:&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%2Fx8bdmis1nhcvfg6xuqmv.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%2Fx8bdmis1nhcvfg6xuqmv.png" alt="Customer support investigation prompt" width="521" height="250"&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%2F2s62bhpw73lk5lqxui35.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%2F2s62bhpw73lk5lqxui35.png" alt="Customer support investigation report" width="486" height="540"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Investigation Reports are a great illustration of what LLMs are genuinely good at: taking a well-framed task with relevant context and producing a structured, actionable summary faster than any human could. Every monitor notification now comes with relevant information to speed up resolution.&lt;/p&gt;

&lt;p&gt;We'll be building further on this capability in the coming months — using AI alongside Bronto's logging platform to help teams reduce toil, resolve issues faster, and extract more value from their data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bronto.io/bronto-labs" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Explore Bronto Labs&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>observability</category>
      <category>devops</category>
      <category>logging</category>
    </item>
    <item>
      <title>Semantic Layer Best Practices: 7 Mistakes to Avoid</title>
      <dc:creator>Alex Merced</dc:creator>
      <pubDate>Fri, 22 May 2026 18:03:06 +0000</pubDate>
      <link>https://dumb.dev.to/alexmercedcoder/semantic-layer-best-practices-7-mistakes-to-avoid-ihk</link>
      <guid>https://dumb.dev.to/alexmercedcoder/semantic-layer-best-practices-7-mistakes-to-avoid-ihk</guid>
      <description>&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%2F9ll1esq3m14tx2gyh5z1.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%2F9ll1esq3m14tx2gyh5z1.png" alt="Semantic layer best practices checklist — checks and mistakes" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Semantic layers don't fail because the technology is wrong. They fail because of design decisions made in the first two weeks — choices that seem reasonable at the time and create compounding problems for months afterward.&lt;/p&gt;

&lt;p&gt;Here are the seven mistakes that kill semantic layer projects, and how to avoid each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Defining Metrics in Multiple Places
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: Revenue is defined in a Tableau calculated field, a Power BI DAX measure, a dbt model, and a SQL view. Four sources of truth. None of them agree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: Teams adopt new tools without migrating metric definitions. Each tool gets its own model. Over time, the definitions drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Every metric gets exactly one canonical definition in the semantic layer. All downstream tools query that definition. No exceptions. When someone needs Revenue, they query &lt;code&gt;business.revenue&lt;/code&gt;, not their own formula.&lt;/p&gt;

&lt;p&gt;This principle extends to AI agents. If your AI generates its own metric formulas instead of referencing the semantic layer, you've just added another source of truth — the least trustworthy one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: Skipping the Bronze Layer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: A data engineer creates a Silver view that joins raw source tables directly, mixing data cleanup (type casting, column renaming) with business logic (filters, calculations) in a single query. When the source schema changes — a column is renamed, a type is modified — the Silver view breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: The Bronze layer feels redundant. It's just a 1:1 mapping of the source. Why add a layer that doesn't change anything?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: The Bronze layer absorbs schema changes. When a source renames &lt;code&gt;col_7&lt;/code&gt; to &lt;code&gt;order_date_utc&lt;/code&gt;, you update one Bronze view. The Silver and Gold views above it don't change. This insulation is worth the tiny overhead of maintaining passthrough views.&lt;/p&gt;

&lt;p&gt;Bronze views also standardize data formats. Timestamps normalized to UTC. Strings cast to consistent encodings. Column names made human-readable. This cleanup happens once, at the bottom of the stack, and every view above benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: Using SQL Reserved Words as Column Names
&lt;/h2&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%2Ferqp8jpg31vu8jwnebpa.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%2Ferqp8jpg31vu8jwnebpa.png" alt="Bad vs. good naming conventions — cryptic abbreviations vs. clear business names" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: A Bronze view exposes a column called &lt;code&gt;Date&lt;/code&gt;. Now every downstream query must reference &lt;code&gt;"Date"&lt;/code&gt; with double quotes. Analysts forget. AI agents don't quote it at all. Queries break intermittently. Debugging is frustrating because the error messages are cryptic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: Source systems often use generic names. &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Timestamp&lt;/code&gt;, &lt;code&gt;Order&lt;/code&gt;, &lt;code&gt;Group&lt;/code&gt;, &lt;code&gt;Role&lt;/code&gt; — all are SQL reserved words. Bronze views that don't rename them propagate the problem to every consumer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Rename early. In the Bronze layer, map &lt;code&gt;Date&lt;/code&gt; to &lt;code&gt;TransactionDate&lt;/code&gt;, &lt;code&gt;Timestamp&lt;/code&gt; to &lt;code&gt;EventTimestamp&lt;/code&gt;, &lt;code&gt;Order&lt;/code&gt; to &lt;code&gt;CustomerOrder&lt;/code&gt;. Use domain-specific prefixes that are unambiguous and never conflict with SQL keywords.&lt;/p&gt;

&lt;p&gt;This small decision saves hundreds of hours of debugging across the life of the semantic layer. It also dramatically improves AI agent accuracy, since language models generating SQL rarely add appropriate quoting for reserved words.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: Building Without Stakeholder Input
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: A data engineering team builds 50 Silver views based on the database schema. They expose every table, every column, every possible metric. Business users look at the result, don't recognize any of the terms, and go back to their spreadsheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: Data engineers understand the schema. They assume the schema structure maps to business needs. It usually doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Start with a metric glossary co-created with stakeholders from Sales, Finance, Marketing, and Product. Ask them: What are your top 5 metrics? How do you calculate them? What decisions do they drive? Build the Silver layer around those answers, not around the database schema.&lt;/p&gt;

&lt;p&gt;This step feels slow. It's the fastest path to adoption. A semantic layer that uses business language and models business concepts gets adopted. A semantic layer that mirrors the database schema gets ignored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 5: Treating Documentation as Optional
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: Views are created with no Wikis, no column descriptions, no Labels. The semantic layer works for the person who built it. Everyone else — analysts, AI agents, new team members — can't figure out what the views mean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: Documentation takes time. Deadlines are tight. Teams plan to "add documentation later." Later never comes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Make documentation part of the view creation process, not a follow-up task. At minimum, every view gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A one-sentence description of what it represents&lt;/li&gt;
&lt;li&gt;Labels for governance (PII, Finance, Certified)&lt;/li&gt;
&lt;li&gt;Column descriptions for any non-obvious field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern platforms reduce this burden with AI-generated documentation. &lt;a href="https://www.dremio.com/blog/5-powerful-dremio-ai-features-you-should-be-using/?utm_source=ev_buffer&amp;amp;utm_medium=influencer&amp;amp;utm_campaign=next-gen-dremio&amp;amp;utm_term=blog-021826-02-18-2026&amp;amp;utm_content=alexmerced" rel="noopener noreferrer"&gt;Dremio's generative AI&lt;/a&gt; samples table data and auto-generates Wiki descriptions and Label suggestions. The AI provides a 70% first draft. The data team adds domain context for the other 30%.&lt;/p&gt;

&lt;p&gt;Undocumented views are invisible to AI agents. If the Wiki is empty, the AI agent has no context to generate accurate SQL. Documentation isn't just nice to have. It's an accuracy requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 6: Applying Security at the BI Tool Level Only
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: Row-level security is configured in Tableau so regional managers only see their region. Then an analyst opens a SQL client, queries the underlying table directly, and sees all regions. The security was enforced in the dashboard, not in the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: BI tools make it easy to apply filters and security rules. Data platforms require more setup. Teams take the easy path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Enforce access policies at the semantic layer, not the BI layer. Row-level security and column masking should be applied on the virtual datasets (views). Every query path — dashboard, notebook, API, AI agent — inherits the same rules.&lt;/p&gt;

&lt;p&gt;Dremio implements this through Fine-Grained Access Control (FGAC): policies defined as UDFs at the view level. A regional manager queries &lt;code&gt;business.revenue&lt;/code&gt; and automatically sees only their region, regardless of how they access the data. No security gaps between tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 7: Trying to Model Everything at Once
&lt;/h2&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%2Fkq07sz9l2pa6e76xlswu.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%2Fkq07sz9l2pa6e76xlswu.png" alt="Incremental growth — from a small core to a comprehensive semantic layer" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;: The team commits to building a complete semantic layer covering every source, every table, and every metric. The project takes six months. By the time it launches, requirements have changed, stakeholder interest has waned, and half the views are out of date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's common&lt;/strong&gt;: Ambitious leaders want a "complete" solution. Data teams want to avoid rework. Neither wants to ship an incomplete layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Start with 3-5 core metrics that the organization actively debates (usually Revenue, Active Users, Churn). Build one Bronze → Silver → Gold pipeline per metric. Validate that the same question produces the same answer across two different tools.&lt;/p&gt;

&lt;p&gt;Once those metrics are stable, expand incrementally. Add new sources, new views, new metrics — one at a time. Each addition is low-risk because the layered architecture isolates changes. A new Gold view doesn't affect existing Silver views.&lt;/p&gt;

&lt;p&gt;The fastest semantic layers reach 80% organizational coverage not by modeling everything up front, but by proving value quickly and expanding from momentum.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do Next
&lt;/h2&gt;

&lt;p&gt;Pick one mistake from this list. Check whether your semantic layer (or your plan for one) is making it. Fix that one thing this week. Then come back for the next one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dremio.com/get-started?utm_source=ev_buffer&amp;amp;utm_medium=influencer&amp;amp;utm_campaign=next-gen-dremio&amp;amp;utm_term=blog-021826-02-18-2026&amp;amp;utm_content=alexmerced" rel="noopener noreferrer"&gt;Try Dremio Cloud free for 30 days&lt;/a&gt;&lt;/p&gt;

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