<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aditya Agarwal</title>
    <description>The latest articles on DEV Community by Aditya Agarwal (@adioof).</description>
    <link>https://dev.to/adioof</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2760047%2F17358ceb-daca-46e9-9a88-1904b8402d3f.jpg</url>
      <title>DEV Community: Aditya Agarwal</title>
      <link>https://dev.to/adioof</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adioof"/>
    <language>en</language>
    <item>
      <title>Devs are inspecting Greenhouse payloads to find hidden salary caps</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:12:04 +0000</pubDate>
      <link>https://dev.to/adioof/devs-are-inspecting-greenhouse-payloads-to-find-hidden-salary-caps-1gj1</link>
      <guid>https://dev.to/adioof/devs-are-inspecting-greenhouse-payloads-to-find-hidden-salary-caps-1gj1</guid>
      <description>&lt;p&gt;Next time a job portal asks for your "desired salary," just open your DevTools and you might find the answer sitting right in the payload. Recently, developers have been peeping into application forms. The JSON they hide says far more than the recruiter ever will. 🕵️&lt;/p&gt;

&lt;h2&gt;
  
  
  The field that pretends to ask
&lt;/h2&gt;

&lt;p&gt;Here's how it goes. You complete an application on a platform such as Greenhouse. There is a box that says: "What are your salary expectations?" It seems non-threatening. It seems like a direct question. No, it's not. Pop open the network tab, watch the request fire, and sometimes you'll spot a number the form never showed you. An upper limit. A maximum threshold. The actual budget hidden in the reply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guess high, disappear
&lt;/h2&gt;

&lt;p&gt;In certain systems, candidates are automatically filtered out if they mention a number above the predefined budget threshold. You enter a number, which is then compared to an invisible limit.&lt;/p&gt;

&lt;p&gt;If your price is too high, you will simply disappear. No return call, no explanation that they chose someone else, just radio silence.&lt;/p&gt;

&lt;p&gt;The question was never asked with good intentions. It was a snare disguised as interest.&lt;/p&gt;

&lt;p&gt;Consider the implications of that. They have all the information. You're the only one who has to guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leaky frontends are doing the work laws couldn't
&lt;/h2&gt;

&lt;p&gt;This is what I actually find funny. We spent years discussing pay transparency, but what made a difference was poorly written client-side code.&lt;/p&gt;

&lt;p&gt;The number was meant to be kept on the server. But instead, someone sent it to the browser.&lt;/p&gt;

&lt;p&gt;→ The "desired salary" box is a filter, not a conversation.&lt;br&gt;
→ The budget often exists before you apply.&lt;br&gt;
→ The frontend sometimes hands you the answer for free.&lt;/p&gt;

&lt;p&gt;Companies patching these leaks are telling on themselves. If the industry were a fair playing field, there would be no secrets to keep.&lt;/p&gt;

&lt;p&gt;These leaks expose the bias, so of course they rush to fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes for you
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend inspecting payloads makes you a hacker. It's the network tab that you get with every browser. But knowing the game changes how you play it. If a portal is silently comparing numbers to a wall, you want to know where the wall is. Not every form leaks. Some companies handle it elegantly, server-side, so you don't notice anything. But the question is weaponized. Now you know why it feels off. The box that asks about your value may have a good idea of what it's willing to give you. Have you ever exposed the DevTools on a form and found something you shouldn't have? Share the payload inside.&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>career</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Svelte's runes are just React hooks wearing a Svelte hoodie</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Sat, 19 Sep 2026 19:16:08 +0000</pubDate>
      <link>https://dev.to/adioof/sveltes-runes-are-just-react-hooks-wearing-a-svelte-hoodie-10l3</link>
      <guid>https://dev.to/adioof/sveltes-runes-are-just-react-hooks-wearing-a-svelte-hoodie-10l3</guid>
      <description>&lt;p&gt;Svelte convinced me with a promise. You write &lt;code&gt;let count = 0&lt;/code&gt;, then modify that, and the UI updates magically. No need for hooks. No dependency arrays. No complex setup. That was the main idea behind it. After that, Svelte 5 introduced runes. And the magic left without us noticing. 🎒&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;The release of Svelte 5 was announced on September 20, 2023, and was finally stabilized in late 2024. This version introduced a concept called runes: &lt;code&gt;$state&lt;/code&gt;, &lt;code&gt;$derived&lt;/code&gt;, and &lt;code&gt;$effect&lt;/code&gt;. Here's the thing nobody wants to say out loud. &lt;code&gt;$state()&lt;/code&gt; is Svelte's &lt;code&gt;useState()&lt;/code&gt;. &lt;code&gt;$derived()&lt;/code&gt; is &lt;code&gt;useMemo()&lt;/code&gt;. &lt;code&gt;$effect()&lt;/code&gt; is &lt;code&gt;useEffect()&lt;/code&gt;. The framework constructed to avoid React hooks essentially redeveloped them. Same jobs, different hoodie. ## The old way was the whole point&lt;/p&gt;

&lt;p&gt;Implicit reactivity was a killer feature of Svelte 3 and 4. You just wrote &lt;code&gt;$: doubled = count * 2&lt;/code&gt; and the compiler did the magic. Svelte 5 uses &lt;code&gt;let doubled = $derived(count * 2)&lt;/code&gt; instead. Do you see the difference? Reactivity was once imperceptible. Now you define it explicitly. Well, that 's not a small tweak to have to make. That's the entire original promise of the approach being jettisoned. With some justification, people will feel a bit misled over Rich Harris's original claim that just a plain &lt;code&gt;let count = 0&lt;/code&gt; was enough to make the UI self-updating. The original pitch was that you didn't have to think about reactivity. The new pitch is here's a function to make things reactive. Ring a bell? ## The official reasoning&lt;/p&gt;

&lt;p&gt;In all fairness, this was not something the team pulled out of thin air. In the Svelte 5 intro video, Rich Harris mentioned that runes "use function syntax to achieve the same things and more". He described the change as something needed to address scaling issues that are becoming "hairy". And they are. The previous &lt;code&gt;$:&lt;/code&gt; magic that we had was not scalable to larger apps, hard to understand its behavior outside of .svelte files and thus hard to trust. Universal Reactivity was introduced in Svelte 5, so that &lt;code&gt;$state&lt;/code&gt; and &lt;code&gt;$derived&lt;/code&gt; can also be used in plain &lt;code&gt;.js&lt;/code&gt; or &lt;code&gt;.ts&lt;/code&gt; files. Similar to React's sharing stateful logic with custom hooks and Vue's solving with the Composition API, everyone converges to the same answer. ## So was it worth it? Based on the data available, we would say yes, to some extent. According to Strapi, when they migrated a 147-component app using their solution, the bundle size decreased from 382 KB to 171 KB. A 55% reduction. Smaller bundles, better scaling, code you can share across files. Better scaling ensures your app can grow without performance issues. And being able to share code across files improves code organization and maintenance. These are all real advantages. Svelte was the one framework that felt different. A Medium critique summarized it. The writer stated that Svelte is "having an identity crisis," that "Runes will be the de-facto standard and soon enough &lt;code&gt;$:&lt;/code&gt; and &lt;code&gt;export let&lt;/code&gt; syntax will be cycled out," and ended with the gut-punch: "Svelte was one of its kind."&lt;/p&gt;

&lt;p&gt;Svelte used to stand out from the crowd, and now it's becoming more like the pack it made fun of. ## The uncomfortable takeaway&lt;/p&gt;

&lt;p&gt;Perhaps being very clear about reactivity is the best approach after all. It's possible that any framework will recognize that using magic has limitations and eventually, you need to explicitly define how things work. If that's the case, fair enough. But we should also then stop pretending like Svelte was this groundbreaking departure from hooks. It was a prettier structure to convey the identical concept, and a compiler performed additional tasks. The runes revealed the truth of that. Here's something to think about:&lt;/p&gt;

&lt;p&gt;→ Runes solved genuine scaling pain, and the bundle numbers back it up. → But they traded away the exact thing that made Svelte feel special. → Every major framework landed on explicit, function-based reactivity anyway. → "Convergence" and "identity crisis" might just be two words for the same event. I'll most likely continue using Svelte 5. The advantages are significant and I am open-minded enough to appreciate a 55% bundle size reduction. 🤷♂️&lt;/p&gt;

&lt;p&gt;But we seem to have lost something along the way. Something about being shielded from having to think about "reactivity" in our components, I guess? Three new functions? So, my question to you is: was the implicit reactivity a great concept that just wasn't practical in real applications, or did Svelte abandon it too soon?&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>debate</category>
    </item>
    <item>
      <title>HTMX is fine until the third stakeholder wants a modal</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Thu, 17 Sep 2026 19:13:18 +0000</pubDate>
      <link>https://dev.to/adioof/htmx-is-fine-until-the-third-stakeholder-wants-a-modal-3dfb</link>
      <guid>https://dev.to/adioof/htmx-is-fine-until-the-third-stakeholder-wants-a-modal-3dfb</guid>
      <description>&lt;p&gt;HTMX was successfully implemented in a production environment earlier this year. Then, out of the blue, the third stakeholder expressed their desire for a modal. They tend to break your lovely little world of HTMX snappy actions that got a free pony, a grenade, and a lollipop.&lt;/p&gt;

&lt;p&gt;That's usually when the fantasy cracks. 🫠&lt;/p&gt;

&lt;h2&gt;
  
  
  The pitch is real, and it works
&lt;/h2&gt;

&lt;p&gt;HTMX made a surprising return that no one in the SPA community had expected. Fast forward to 2026, and it is being used to run real production dashboards, as opposed to just small demos.&lt;/p&gt;

&lt;p&gt;And to be honest? It works really well for dashboards.&lt;/p&gt;

&lt;p&gt;HTML is sent over the network. The server does the rendering, the fragment is replaced, and you can leave work before schedule.&lt;/p&gt;

&lt;p&gt;There's no need for hydration. There's no need for a client-side state to get out of sync with the server. There's no need for 200KB of JavaScript to render a table of numbers.&lt;/p&gt;

&lt;p&gt;This is the right tool for read-heavy screens with the occasional filter. I would not hesitate to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then reality shows up in a suit
&lt;/h2&gt;

&lt;p&gt;It's not HTMX that's the problem. It's what comes next once the prototype is successful.&lt;/p&gt;

&lt;p&gt;Stakeholder one is really happy with the dashboard. Stakeholder three has requested a modal that can edit a row without having to leave the page.&lt;/p&gt;

&lt;p&gt;Sure. Enter &lt;code&gt;hx-get&lt;/code&gt; into a conversation, replace it, close it if successful. Also clean.&lt;/p&gt;

&lt;p&gt;So, stakeholder one needs to be able to save wherever they are when they navigate away, stakeholder two wants one specific row of their entire overview to be constantly updating, and stakeholder three wants a counter on their "new" draft, as well as the entire row behind it, to be updating while also not losing the draft when they navigate away.&lt;/p&gt;

&lt;p&gt;You are now managing state in three different locations via HTTP. Congratulations on reaching the cliff!&lt;/p&gt;

&lt;p&gt;This is the moment when those who claim "scales to anything" stop arguing.&lt;/p&gt;

&lt;p&gt;None of this is hard to do. It's just not easy anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  "PHP spaghetti" is a lazy insult that's half right
&lt;/h2&gt;

&lt;p&gt;Critics often refer to HTMX as a regression back to PHP spaghetti.&lt;/p&gt;

&lt;p&gt;When your interactivity grows, your logic spreads across components, endpoint handlers, and a bunch of &lt;code&gt;hx-&lt;/code&gt; attributes.&lt;/p&gt;

&lt;p&gt;Your UI is not stored in one location for you to read. It is indicated by which fragment was last replaced.&lt;/p&gt;

&lt;p&gt;That's the actual cost. Not the tech, the &lt;em&gt;legibility&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A React component is messy but the state at least exists in a place you can reference and discuss.&lt;/p&gt;

&lt;p&gt;Highly responsive HTMX applications frequently involve lots of state changes on the server and a lot of template updates across multiple browser windows post-POST. It's an illusion that what you have locally is the "current" UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest version of the pitch
&lt;/h2&gt;

&lt;p&gt;We have implemented it before, and we would do it again if it's a suitable choice for a specific interface.&lt;/p&gt;

&lt;p&gt;What really bothers me is the lack of honesty. Saying "HTMX scales to anything" is marketing language, not technical language.&lt;/p&gt;

&lt;p&gt;The truth is boring and useful:&lt;/p&gt;

&lt;p&gt;→ Server-rendered simplicity is a genuine win until interactivity crosses a line&lt;br&gt;
→ That line is real, it exists, and pretending otherwise burns junior devs who trust the hype&lt;br&gt;
→ The cliff usually shows up around state split across multiple locations and client-held state&lt;br&gt;
→ Picking HTMX means deciding &lt;em&gt;in advance&lt;/em&gt; how spicy your UI is allowed to get&lt;/p&gt;

&lt;p&gt;The most successful HTMX applications I've encountered are not those that resisted the cliff. They are the ones which have drawn a solid line and declared "beyond this point, we are fine with some JavaScript."&lt;/p&gt;

&lt;p&gt;A little bit of Alpine. A small island of actual client state. Not a renunciation of the belief, but maturity. 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;HTMX is a fantastic tool with a specific shape. It rewards apps that are mostly server-truth with light interaction, and it punishes apps that pretend they're that when they're not.&lt;/p&gt;

&lt;p&gt;The complexity cliff is not a bug in HTMX. It's a bug in how people sell it.&lt;/p&gt;

&lt;p&gt;So, let me ask you this: Where do you have the most difficulty with HTMX? Was it the modal? The multi-window update? Or was it when a PM looked you in the eye and said, "Can it be Notion-like?"&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>opinion</category>
      <category>debate</category>
    </item>
    <item>
      <title>The Staff IC now out-earns the manager and it's not close</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:17:44 +0000</pubDate>
      <link>https://dev.to/adioof/the-staff-ic-now-out-earns-the-manager-and-its-not-close-3gmj</link>
      <guid>https://dev.to/adioof/the-staff-ic-now-out-earns-the-manager-and-its-not-close-3gmj</guid>
      <description>&lt;p&gt;For the last twenty years, the advice was pretty straightforward. If you want to make more money, get off the keyboard and start managing people. That suggestion translates to earning less now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number that broke the pipeline
&lt;/h2&gt;

&lt;p&gt;Levels.fyi's End of Year Pay Report, which was published in January 2026, based on 2025 data, revealed that the median total compensation for a Staff Software Engineer came in at $457,000. A 7.52% increase from the previous year. How about First-line Engineering Managers? Generally speaking, they make somewhere between $150,000 and $250,000. The median of the Staff IC is higher than the upper limit of the manager band.&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't one weird data point
&lt;/h2&gt;

&lt;p&gt;If it was just one report, I wouldn't be concerned. But it's more than one. According to HR Oasis's March 23, 2026 report, engineering managers are now being out-earned by Staff and Principal Engineers in top firms, occasionally by 15 to 25 percent. According to a report by recruiting firm KORE1's Tom Kenaley on June 22, 2026, Staff engineers are paid between $190,000 and $260,000 in base salary and total comp ranges between $350,000 and $700,000 at big tech vendors. The 2026 Algoroq.io Salary Guide shows an increase. Total comp for Staff Engineer at the top tier firms including FAANG, Stripe, OpenAI, Databricks is between $400,000 and $750,000, with a few extraordinaries above $900,000.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base salary is a trap. Look at the equity.
&lt;/h2&gt;

&lt;p&gt;Here's the part that initially threw me off. An analysis done on August 12, 2026, by Recruiting from Scratch came up with a median base salary of $248,050 for a Staff IC in New York based on 362 active US postings. It was almost the same as $240,000 for an Engineering Manager. So where does the pay gap come from? Statistics provided by Algoroq.io show stock grants representing 40% to 60% of the total compensation of a Staff IC. This is the lever companies pull the hardest on for hard-to-find experts. Basic salary may seem equivalent to tossing a coin. However, total compensation is not similar at all. The equity is what really matters, and it is mainly accumulated on the IC ladder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the market flipped
&lt;/h2&gt;

&lt;p&gt;Managers haven't become weaker. They have had more demands placed on their time and skills. According to SignalFire's analysis on June 22, 2026, every engineering manager at a Tech Major currently oversees about 12 engineers, which is 14% more than in 2019. For startups, it's 15 engineers per manager, 34% more. While management talent is plentiful and relatively inexpensive, technical talent faces shortages and higher costs. SignalFire put it plainly: "top-of-band staff and principal packages at the Tech Majors now rival or beat director pay, reversing the management premium that defined tech careers for two decades."&lt;/p&gt;

&lt;p&gt;Two decades of career advice, quietly inverted. Algoroq.io goes as far as mentioning a Senior Staff Engineer is paid more than a Senior Engineering Manager in a few companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this actually means for you
&lt;/h2&gt;

&lt;p&gt;I have seen competent engineers opt for the position of manager, believing that was the only way to get a substantial pay raise. The main differences to consider:&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Base is a wash, equity is the game.&lt;/strong&gt; If a role pays comp mostly in stock, that's where the gap opens. Compare total comp, not the number on the offer letter's first line. → &lt;strong&gt;Rarity beats headcount.&lt;/strong&gt; The market pays for skills few people have, not for how many reports you can absorb. → &lt;strong&gt;Management is a role, not a promotion.&lt;/strong&gt; Pick it because you want the work, not because you think it's the raise. This doesn't mean that managing people is negative. It is simply work that is different and some of us have the right mindset for it. However, if you are a strong specialist and only pursuing the manager track for the money, the 2026 data is sending a warning. Steer clear, the deep technical route is now a real destination, not a booby prize.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Many excellent engineers were convinced to take a life-long pay cut by the "go into management for more money" pipeline. It just took a while for the data to become more powerful than the narrative. If you enjoy managing, then go for it. But don't do it for a salary increase because the Individual Contributor (IC) ladder currently pays more, after all. 💰&lt;/p&gt;

&lt;p&gt;So, my question to you is this: if we take the money reason off the table for becoming a manager, what's left to motivate you to make that move?&lt;/p&gt;

</description>
      <category>career</category>
      <category>management</category>
      <category>hiring</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Astral endorsing Python Council candidates is corporate capture in slow motion</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Sun, 13 Sep 2026 10:17:31 +0000</pubDate>
      <link>https://dev.to/adioof/astral-endorsing-python-council-candidates-is-corporate-capture-in-slow-motion-3aa2</link>
      <guid>https://dev.to/adioof/astral-endorsing-python-council-candidates-is-corporate-capture-in-slow-motion-3aa2</guid>
      <description>&lt;p&gt;Recently, a venture-backed company implied to the Python community that they know best who should be governing Python packaging. A surprising move, right?&lt;/p&gt;

&lt;p&gt;Astral, the organization responsible for uv, openly supported four of the five individuals who stood for election to the first Python Packaging Council.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;On September 5, 2026, Astral dropped a blog post right near the start of the voting window!&lt;/p&gt;

&lt;p&gt;Astral endorsed four candidates for the five-seat Python Packaging Council: William Woodruff, Pradyun Gedam, Ralf Gommers, and Donald Stufft.&lt;/p&gt;

&lt;p&gt;This is the section that caused confusion. William Woodruff works for Astral and is a uv maintainer.&lt;/p&gt;

&lt;p&gt;Astral was straightforward: "We decided to nominate one candidate from the Astral team: William Woodruff... We're happy to throw our support in with William Woodruff, Pradyun Gedam, Ralf Gommers, and Donald Stufft for the inaugural Python Packaging Council."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this council even matters
&lt;/h2&gt;

&lt;p&gt;The Python community accepted PEP 772 in April 2026. It established a formal, five-member council that actually had authority to approve packaging standards.&lt;/p&gt;

&lt;p&gt;The first election took place from September 1 to September 15 and nominations were closed by August 11. This was not just a casual poll.&lt;/p&gt;

&lt;p&gt;This was the first governing body ever that had the power to decide how packaging in Python would work. And a single vendor put up four out of five of the candidates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conflict nobody wants to name
&lt;/h2&gt;

&lt;p&gt;Astral doesn't just stand by and watch. It's behind the Ruff linter, the uv package manager, and the ty type checker.&lt;/p&gt;

&lt;p&gt;These are powerful instruments, and their conduct is a direct result of the guidelines sanctioned by this council.&lt;/p&gt;

&lt;p&gt;The company that has the most to gain from the packaging regulations was the one lobbying for control over who creates those regulations.&lt;/p&gt;

&lt;p&gt;The criticism was immediate, raising fears of unfair treatment for rivals such as Hatch, Pixi, and Anaconda. When a dominant player chooses the umpires, the competition should be worried.&lt;/p&gt;

&lt;h2&gt;
  
  
  We keep rationalizing this
&lt;/h2&gt;

&lt;p&gt;The Python developer Glyph Lefkowitz put it best in September 2024: "Just dropping in here to say that corporate capture of the Python ecosystem is the #1 keeps-me-up-at-night topic of my community work, so I watch Astral with interest..."&lt;/p&gt;

&lt;p&gt;There was a good reason he kept an eye on Astral. Looking back now, two years later, it seems like he was more of a prophet than paranoid.&lt;/p&gt;

&lt;p&gt;OpenAI revealed on March 19, 2026, that it bought Astral and welcomed founder Charlie Marsh and his squad to the Codex division.&lt;/p&gt;

&lt;p&gt;So this isn't just a scrappy startup with good tooling anymore. The endorsement traces back to one of the most well-funded companies on the planet.&lt;/p&gt;

&lt;h2&gt;
  
  
  To be fair
&lt;/h2&gt;

&lt;p&gt;Two of the four named candidates are well qualified. Pradyun Gedam and Donald Stufft are highly experienced with Python packaging and have made substantial contributions to the community.&lt;/p&gt;

&lt;p&gt;There are no accusations of corruption being made. That's not what's being said. 🙂&lt;/p&gt;

&lt;p&gt;It's all about how it looks and what motivates people. You don't want a vendor who has a lot to gain financially to be the one proposing a group of candidates for the organization that oversees their products.&lt;/p&gt;

&lt;p&gt;Here's the excuse that people tend to ignore in such situations:&lt;/p&gt;

&lt;p&gt;→ "But the tools are good" is not the same as "the process is fair"&lt;br&gt;
→ Good candidates endorsed by a conflicted party still look conflicted&lt;br&gt;
→ An employee on the ballot plus a company blog post is not a coincidence&lt;br&gt;
→ Corporate money doesn't have to buy anything to shape outcomes&lt;/p&gt;

&lt;h2&gt;
  
  
  The slow part of slow motion
&lt;/h2&gt;

&lt;p&gt;Apathy seldom resembles a villain in a boardroom. It resembles a nicely written blog post in a voting window.&lt;/p&gt;

&lt;p&gt;It seems logical. It seems beneficial. That is precisely what makes it difficult to resist.&lt;/p&gt;

&lt;p&gt;The community continually reassures itself that this is acceptable because the individuals are competent. However, governance should not be based on trust in whoever delivers the best tool.&lt;/p&gt;

&lt;p&gt;Had Astral truly wished to defend the authority of the council, it should have refrained from interfering in the vote rather than seeking to seal it.&lt;/p&gt;

&lt;p&gt;So, where do we draw the line? When does advocating for your business turn into undue influence over the laws that are meant to keep competition fair and open?&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>discuss</category>
    </item>
    <item>
      <title>AI-generated websites are the Word Art era all over again</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Sat, 12 Sep 2026 19:11:50 +0000</pubDate>
      <link>https://dev.to/adioof/ai-generated-websites-are-the-word-art-era-all-over-again-42j0</link>
      <guid>https://dev.to/adioof/ai-generated-websites-are-the-word-art-era-all-over-again-42j0</guid>
      <description>&lt;p&gt;Do you recall Word Art? That rainbow gradient, arched text monster on every 90s school flyer. We are currently experiencing a resurgence of this technology, but this time it is used to create complete websites. ## The tell is already showing&lt;/p&gt;

&lt;p&gt;Frontend developers argue that when AI generates design, users can immediately tell that design was made with "sloppy" AI. There's no list of reasons, they can just sense that it looks cheap. This is not a new instinct. We've been detecting generic clip art images in the same way. The stock handshake photo. The generic swoosh logo. Your brain automatically categorizes them as "low budget" before you even realize it. Many people on a developer forum are making a direct comparison to the 90s Word Art era. And you know what? It's more accurate than I'd like to admit. ## Why everything looks the same&lt;/p&gt;

&lt;p&gt;Here's why the mess looks messy. A study from 2025, cited in a January 2026 article on Medium, showed that more than 80% of AI-generated websites had almost the same underlying structure. These tools replicate what already exists on the internet and reproduce the same trends. Framer's "Wireframer" was put through its paces by The Designer Review in June 2026. It certainly is an impressive tool, that spits out a responsive layout in under 60 seconds. While it can indeed generate "a typical SaaS product homepage," the problem with it is that if you feed it that prompt, you get an output that looks "assembled from a mood board of every SaaS homepage from 2021."&lt;/p&gt;

&lt;p&gt;According to an agency with 200+ sites like Goodspeed Studio in a review from May 2026, "AI gets the shape right and the detail wrong." It's ok for a first draft. It's not a client launch without rework. ## Cheap solutions have always existed&lt;/p&gt;

&lt;p&gt;This is what the panic crowd fails to understand. Affordable design tools did not destroy the art of design. They simply provided a low-cost solution for low-cost demands. An experienced designer commented in a thread from August 2025, "AI is the new clip art. It satisfies the same low budget demand with a cheap solution... Half the food trucks were using clip art shit for their marketing / logos so it makes sense."&lt;/p&gt;

&lt;p&gt;Nobody was hiring a $10k designer for a taco truck logo in 2005. The clip art tier and the craft tier were never in competition for the same money. Sophie Davies from Your Marketing Department actually made the shrewdest prediction back in March 2025. AI web design "might kill" the ThemeForest theme market. That makes sense. What AI truly endangers is not the skilled labor but the mid-level of pre-existing templates which were halfway to the slop. 💀&lt;/p&gt;

&lt;h2&gt;
  
  
  The bill comes later
&lt;/h2&gt;

&lt;p&gt;BlakSheep Creative rang the alarm on "AI jockeys" back in January 2026, and it's stayed with me. Sure, AI can write text but what about developing a strategy, building a brand, or creating a solid measurement and SEO framework? Most DIY AI websites lack all of these essential components. So the site ships. Then it doesn't convert. Then someone gets hired to fix it. BlakSheep's takeaway is the quiet punchline of this whole thing. → The rebuild cycles to un-slop a generic AI site often cost more than hiring a pro to build it right the first time. Buying cheap products may seem like a good deal initially, but if they don't last long and you have to buy them again, in the end it's not really a bargain. ## So what's actually happening&lt;/p&gt;

&lt;p&gt;Artificial intelligence hasn't turned design into a commodity; it has turned the &lt;em&gt;appearance&lt;/em&gt; of design into a commodity. Those two things are not equivalent. The thing AI actually threatens isn't skilled work; it's the low end that simply saturates the market, imitating a style that the general public will eventually notice without pinpointing. We already learned this lesson in the 90s. Word Art didn't kill off typography. It just made "made in Word Art" a thing you could read off a page in half a second. We are currently in the process of building that same reflex, one SaaS hero section at a time. Therefore, I would like to ask this: if the appearance of being AI-generated indicates an inferior product, does this ultimately increase the perceived value of human input, or will it simply result in more efforts to disguise this indicator?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>ux</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Postgres for everything hits a wall the moment dashboards get concurrent</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Sat, 12 Sep 2026 10:11:35 +0000</pubDate>
      <link>https://dev.to/adioof/postgres-for-everything-hits-a-wall-the-moment-dashboards-get-concurrent-h43</link>
      <guid>https://dev.to/adioof/postgres-for-everything-hits-a-wall-the-moment-dashboards-get-concurrent-h43</guid>
      <description>&lt;p&gt;I used to say, "Just use Postgres."&lt;/p&gt;

&lt;p&gt;After that, our dashboards became concurrent, and the read replica we quickly added to offload some of the pressure from the main database began overheating instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The meme that traps you
&lt;/h2&gt;

&lt;p&gt;There is a reassuring notion that Postgres can handle all tasks. OLTP, queues, search, analytics, everything in a single package.&lt;/p&gt;

&lt;p&gt;But it shouldn't be the ultimate goal.&lt;/p&gt;

&lt;p&gt;MotherDuck was direct in their analysis from July 2026. As soon as you start providing real analytics, the "Postgres for Everything" philosophy becomes a structural inconsistency.&lt;/p&gt;

&lt;p&gt;Typically, what most folks would do is they would probably get a read replica, isolate those heavy reads, protect the primary, and you're done.&lt;/p&gt;

&lt;p&gt;Except that's not what happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  A read replica does not fix the physics
&lt;/h2&gt;

&lt;p&gt;Here's the explanation people usually find less appealing: A read replica is a duplicate of the identical row-oriented storage.&lt;/p&gt;

&lt;p&gt;In May of 2026, the engineering team at ClickHouse put it best in their guide "While being beneficial in terms of high availability, performance, and horizontal read scalability, Postgres read replicas share the row-oriented limitations of the primary. They don't compress data effectively for analytics, and they still require heavy B-tree indexes that bloat memory."&lt;/p&gt;

&lt;p&gt;So the compute is isolated. The physics is not.&lt;/p&gt;

&lt;p&gt;The challenge lies in the physics. Postgres specifically stores data in pages of 8 KB, with a tuple header of 23 bytes fixed per tuple.&lt;/p&gt;

&lt;p&gt;This implies that a dashboard query, for example, will pull in an entire row even if it only needs 2 columns. It's reading the entire row for a &lt;code&gt;SELECT&lt;/code&gt; that only focuses on a fraction of it.&lt;/p&gt;

&lt;p&gt;When you multiply that by the level of concurrency, the situation quickly becomes very difficult to deal with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it actually breaks
&lt;/h2&gt;

&lt;p&gt;Looking back on a September 2026 data engineering incident, a retrospective analysis noted that a replica had been hit by "hundreds of similar aggregations running at once," causing both CPU and memory pressure to spike.&lt;/p&gt;

&lt;p&gt;WAL replay and fast queries were vying for the same resources, causing fast queries to become "painfully slow".&lt;/p&gt;

&lt;p&gt;That's the part that gives it away. It's not a single slow query, it's the accumulation of them.&lt;/p&gt;

&lt;p&gt;MotherDuck mimicked the curve as well. A dashboard aggregation that required 50ms when you were just starting out, increases to 5 seconds when you go into the tens of millions of rows.&lt;/p&gt;

&lt;p&gt;That same aggregation eventually times out once concurrent load piles on. And your latency budget for customer-facing analytics? Anything under 100 milliseconds, and users perceive it as instant.&lt;/p&gt;

&lt;p&gt;Five seconds may not be immediate, but it sure is faster than a support ticket!&lt;/p&gt;

&lt;p&gt;Another cost people tend to overlook is the one pointed out by Brandur Leach and Gunnar Morling: mixing queue-like workloads with normal OLTP workloads in Postgres causes MVCC bloat, index fragmentation, and WAL pile-up.&lt;/p&gt;

&lt;p&gt;You are not merely slow. You are gathering rot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The expensive band-aid
&lt;/h2&gt;

&lt;p&gt;Teams are forced to compensate for the limitations of a row store by investing heavily in hardware.&lt;/p&gt;

&lt;p&gt;This is the reason why you eventually over-provision an AWS r8gd.4xlarge to handle some dashboard spikes. It's just there mostly idle at 3am, burning money, but you know it must do it.&lt;/p&gt;

&lt;p&gt;You are paying the highest cost for a tool that is not meant to do that particular job. Increasing the size does not solve the problem of having the wrong format. It simply means you pay for it later.&lt;/p&gt;

&lt;p&gt;The fair thing to do is to stop expecting the row store to behave like a column store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I landed
&lt;/h2&gt;

&lt;p&gt;All of these reasons do not imply that Postgres is inferior. I still choose to store my transactional data in Postgres, and I will defend that choice.&lt;/p&gt;

&lt;p&gt;Asking one engine to be both the ledger and the analytics warehouse is the mistake. They're different shapes of problem.&lt;/p&gt;

&lt;p&gt;The solution does not involve creating a larger replica. Instead, a column-oriented serving layer designed for aggregations such as ClickHouse is used. This layer compresses data significantly and specifically accesses only the columns required for processing a query.&lt;/p&gt;

&lt;p&gt;→ Read replicas isolate compute, not storage format&lt;br&gt;
→ Row headers plus 8 KB pages force full-row scans for narrow queries&lt;br&gt;
→ Concurrency turns "fine" into "timeout" past tens of millions of rows&lt;br&gt;
→ Over-provisioning is a tax, not a solution&lt;/p&gt;

&lt;p&gt;Choosing Postgres for all kinds of data storage in your platform is like being madly in love. Nevertheless, everything comes at a cost.&lt;/p&gt;

&lt;p&gt;So here's my question for you. What was the exact row count or concurrency level where you finally had to throw in the towel and admit Postgres alone wasn't ever going to handle your analytics workloads? 👇&lt;/p&gt;

</description>
      <category>database</category>
      <category>performance</category>
      <category>architecture</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Feature flags are the loaded gun modern deploys pretend is safe</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Fri, 11 Sep 2026 19:14:01 +0000</pubDate>
      <link>https://dev.to/adioof/feature-flags-are-the-loaded-gun-modern-deploys-pretend-is-safe-59b6</link>
      <guid>https://dev.to/adioof/feature-flags-are-the-loaded-gun-modern-deploys-pretend-is-safe-59b6</guid>
      <description>&lt;p&gt;A trading firm experienced a loss of $440 million within 45 minutes. This was not due to a cyber attack or a sudden crash in the market. It was a forgotten and obsolete feature flag that nobody had taken the time to remove. Let's get rid of it once and for all. ## The gun we handed everyone&lt;/p&gt;

&lt;p&gt;The 2012 collapse of Knight Capital, one of the major participants in the US stock market, is the cautionary tale that every engineer kind of half-remembers when they're optimizing production error logging. A flag that had been repurposed caused Knight's systems to reactivate the "Power Peg" order router dead code from 2003. One accident of deployment turned it back on. Incorrect trading poured out for 45 minutes, and the company went out of business. Here's the part that bugs me. We learned almost nothing. Feature flags became extremely popular and began to be used in various applications, however, there was no proper method established to effectively manage them. ## The math nobody wants to look at&lt;/p&gt;

&lt;p&gt;A report in June 2026 by GrowthBook quantified the chaos. Ten active flags can create 1,024 potential code paths. Twenty flags? Over a million. It is impossible to test a million code paths. You can hardly analyze ten. Therefore, the majority of teams do not analyze them at all, they simply deliver the flag and continue working. And those toggles are never cleaned up. GrowthBook cited a survey indicating that 77% of developers intend to delete toggles once they are no longer needed. Yet 75% of those toggles remain in the codebase for as long as 49 weeks after they are introduced. This proves that intention is not a cleanup strategy. ## Engineers there create 2,300 new flags every month.&lt;/p&gt;

&lt;p&gt;DoorDash provided a glimpse in August 2026. The platform oversees over 60,000 feature flags in around 623 repositories. 2300 upcoming flags each month. More than 1000 of those are already marked as stale. If an engineer has to clean up a single stale flag manually, it will take them a full one to two hours of work. Imagine if there are 1,000 stale flags to clean up. Then we have a full-time job that no one wants to do. The issue here isn't specific to DoorDash. It's more about how default behaviors can lead to such situations. Once a flag is put in place, it's hard to get rid of it, so they accumulate over time. And then the stack of wood is ablaze. ## The blast radius is real&lt;/p&gt;

&lt;p&gt;In February 2026, LinkedIn experienced a total outage. It was due to an unintentional release that changed all of the feature flags to the on position. Old, untested flags smashed together in combinations never before seen. It's Knight Capital with a better brand. The flag &lt;em&gt;service&lt;/em&gt; is actually a single point of failure as well. PostHog's flag service had four different incidents over ten days in October 2025, with more than 14 hours of major impact in total. And that's how a denial-of-service attack can occur through resource exhaustion. Fireship performed a review of all these unaddressed risks and the theme is sadly the same for each one. → Flags are runtime mutations of production behavior&lt;br&gt;
→ We treat them like config, not like deployed code&lt;br&gt;
→ Nobody owns the cleanup, so entropy wins&lt;/p&gt;

&lt;h2&gt;
  
  
  The discipline gap
&lt;/h2&gt;

&lt;p&gt;Here's what I really think. Feature flags are not the bad guys here. Using them carelessly as if they cost nothing is the real issue. Each flag acts as a runtime switch in your production code. It's a seriously powerful concept. We've made it so common and normalized its usage to such an extent that we removed the necessary guardrails that this level of power should come with. There are some teams that are making an effort. Uber open-sourced Piranha, a tool that hunts down stale flags automatically. Over a six-month period, it created almost 5,000 pull requests to remove dead flags in 10 million lines of code. If that doesn't prove the point, I don't know what will. This is not a nice-to-have. This is you waving the white flag and saying the manual way simply doesn't work past a few hundred flags. The uncomfortable truth is that we should put as much effort and rigor into deleting flags as we do in creating them. Expiry dates, owners, automated audit rules that break the build when a flag smells past its best-by date. None of this is done by default. We simply add the flag, release the feature, and casually walk away. ## What I actually think&lt;/p&gt;

&lt;p&gt;I believe we have some redundant flags at my startup. Although, I have a tiny bit of doubt which is why we haven't removed them yet. The doubt you're referring to is the main issue we're all facing in the industry. A flag that you're afraid to remove is like a gun with its safety mechanism deliberately removed. We keep rerunning Knight Capital, crossing fingers that this time our accidental deployment will be a little cheaper. Here's a question for you: How many flags currently exist in your codebase that you could safely delete today, and how many are you just too scared to even think about touching?&lt;/p&gt;

</description>
      <category>reliability</category>
      <category>devops</category>
      <category>programming</category>
      <category>opinion</category>
    </item>
    <item>
      <title>A little copy-paste is cheaper than the wrong abstraction</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Fri, 11 Sep 2026 10:17:54 +0000</pubDate>
      <link>https://dev.to/adioof/a-little-copy-paste-is-cheaper-than-the-wrong-abstraction-1b9l</link>
      <guid>https://dev.to/adioof/a-little-copy-paste-is-cheaper-than-the-wrong-abstraction-1b9l</guid>
      <description>&lt;p&gt;One time I deleted what seemed to be a duplicated file, but it reappeared. I deleted it again, and the same thing happened. I did this three times before realizing it was an important file that kept regenerating itself for some reason. 🙃&lt;/p&gt;

&lt;h2&gt;
  
  
  The reflex we all learned wrong
&lt;/h2&gt;

&lt;p&gt;At some point in your initial year, you received the same advice that I did. If you see two similar blocks, separate them. Right away. Doing things the DRY (Don't Repeat Yourself) way has been ingrained so deeply in our culture for so long that it became a knee-jerk reaction. Repetition is bad; software is about handling complexity, and removing repetition is just part of that. However, it's not actually part of that - it's a side effect we now mistake for a cause. Here's the catch. It is more difficult to eliminate the wrong abstraction than the redundancy it substituted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sandi Metz called it a decade ago
&lt;/h2&gt;

&lt;p&gt;The phrase was coined by Sandi Metz during her RailsConf 2014 talk "All the Little Things." In no uncertain terms, she expressed that &lt;strong&gt;duplication is far cheaper than the wrong abstraction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In January 2016, she elaborated on this in a blog post titled "The Wrong Abstraction" and her explanation is quite powerful. A bad abstraction turns into a "condition-laden process that interweaves a handful of loosely related concepts." That function with eight boolean flags that no one dares refactor. The part of her advice that everyone skips is the most important. "If the abstraction is wrong, the fastest way to get to the right abstraction is to go back to duplicating."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the abstraction fights back
&lt;/h2&gt;

&lt;p&gt;Duplicated code is dumb and honest. The incorrect abstraction is not that. Each new caller adds another parameter, another 'if', another special case. It sprouts teeth. And no one wants to be in the position to delete it. Hence, it stays there, accumulating flags similar to barnacles. → Duplication has a local blast radius. One change, one place. → A bad shared function has a global one. One change, ten callers you didn't know existed. → Un-inlining a tangled abstraction is real archaeology. Copy-pasting is a keystroke.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pragmatists agree
&lt;/h2&gt;

&lt;p&gt;It was Rob Pike, Go co-creator, back at Gopherfest SV in November 2015 who included it in the Go Proverbs: &lt;strong&gt;"A little copying is better than a little dependency."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider what a dependency really is. It's a promise that two things will keep meaning the same thing forever. That promise is broken all the time. Kent C. Dodds elaborated on the same concept with "AHA Programming" - Avoid Hasty Abstractions, terminology first coined by Cher Scarlett. His mantra is just perfect. Keep replicating the code until the precise abstraction becomes evident through the repetition. Should you identify a pattern, don't assume it's the correct one after the second repetition. Revisit this process for a third or fourth repetition and let the pattern naturally emerge.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just taste, it's productivity
&lt;/h2&gt;

&lt;p&gt;Here is where I cease gesticulating wildly. Daniel J. Sturtevant's 2013 MIT PhD thesis quantified the impact of complex architecture on actual teams. Working in high-complexity areas dropped developer productivity by up to 50%. Bug density tripled. 📉&lt;/p&gt;

&lt;p&gt;Also, turnover among employees increased significantly. Individuals will leave a certain codebase because they are unable to understand it. The process of prematurely implementing an abstraction contributes to this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually do now
&lt;/h2&gt;

&lt;p&gt;In our team, at a small startup, I ceased extracting on sight. If two blocks resemble each other, I let them be. I will wait and see. If they mutate simultaneously three times, let's say they are one thought and I will merge them. If they mutate separately, I've avoided a landmine. The key is to be patient, and patience doesn't feel right when you have been accustomed to feeling smart. Being lazy for a few lines of code by copy-pasting I have learned to digest that. 😅&lt;/p&gt;

&lt;p&gt;Because the alternative is a "clever" helper that ten people curse for two years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;It's not that DRY is incorrect. It's more like DRY came into the game too soon. The real mistake is not in repeating yourself, but in making assumptions about the abstraction you're creating before your code clarifies what it is. Wait for the scream, and then take out the core. Here's a question for you: Can you think of the worst abstraction you were ever hesitant to remove, and if so, did you ultimately remove it or did you keep it in place?&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opinion</category>
      <category>debate</category>
      <category>devlife</category>
    </item>
    <item>
      <title>text-box-trim is the best CSS feature in years and nobody's using it yet</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Thu, 10 Sep 2026 19:11:10 +0000</pubDate>
      <link>https://dev.to/adioof/text-box-trim-is-the-best-css-feature-in-years-and-nobodys-using-it-yet-5c8m</link>
      <guid>https://dev.to/adioof/text-box-trim-is-the-best-css-feature-in-years-and-nobodys-using-it-yet-5c8m</guid>
      <description>&lt;p&gt;For years, you've been fighting the good fight for consistent text spacing in your digital products. But the fact is, all modern browsers quietly fixed that problem while no one was looking.&lt;/p&gt;

&lt;p&gt;There is a text-box-trim native CSS feature that removes the phantom gap above and below your text. It's amazing!&lt;/p&gt;

&lt;h2&gt;
  
  
  The ghost space nobody talks about
&lt;/h2&gt;

&lt;p&gt;There is invisible cushioning in every line of text, which is embedded within the font metrics and exists above the cap height and beneath the baseline.&lt;/p&gt;

&lt;p&gt;You've experienced it. That button where the text is a bit higher than you'd like. That title which seems to be misaligned with the icon next to it, and you can't seem to correct it.&lt;/p&gt;

&lt;p&gt;For years, we tackled this issue by using line-height calculations. We also used negative margins, and resorted to using magic numbers taken from a designer's Figma file that we hoped would work.&lt;/p&gt;

&lt;p&gt;The entire ritual was actually a solution to a problem that we were facing because the browser failed to do so.&lt;/p&gt;

&lt;h2&gt;
  
  
  What text-box-trim actually does
&lt;/h2&gt;

&lt;p&gt;It removes the extra space from the text box. No hacks, no negative margins, no guesswork.&lt;/p&gt;

&lt;p&gt;The Syntax Podcast has just covered it. Along with &lt;code&gt;alpha()&lt;/code&gt; and &lt;code&gt;progress()&lt;/code&gt;, that's how a lot of people are hearing about it at all. Tells you something.&lt;/p&gt;

&lt;p&gt;Here is how it goes:&lt;/p&gt;

&lt;p&gt;The text-box-trim property in CSS is used to set the trimming of the text box. The text-box-edge property is used to define a reference edge for the cap-height of the content.&lt;/p&gt;

&lt;p&gt;The top is capped at the cap height and the bottom is based on the alphabetic baseline. All other ghost (and possibly grim) padding is shaved entirely off the character.&lt;/p&gt;

&lt;p&gt;Your text is now perfectly in line with where the letters sit. Vertical centering just does its thing. Icons line up perfectly. Buttons stop looking slightly off.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why is nobody using it?
&lt;/h2&gt;

&lt;p&gt;It's all about the tooling being resistant to change and difficult to adapt.&lt;/p&gt;

&lt;p&gt;We developed spacing systems based on this old issue. Including design tokens, utility classes, and spacing scales that assumed the invisible gap was always there.&lt;/p&gt;

&lt;p&gt;Removing such a hack poses a risk. So teams keep shipping the line-height hacks they've shipped for a decade, because the hack is what the codebase already knows.&lt;/p&gt;

&lt;p&gt;That really confuses me. 🙃&lt;/p&gt;

&lt;p&gt;We often express a preference for native platform features. However, when a really good one is introduced and our current tools or frameworks don't support it right away, we tend to overlook its potential.&lt;/p&gt;

&lt;h2&gt;
  
  
  This keeps happening
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-box-trim&lt;/code&gt; isn't special in being ignored. It's special in being obviously useful and &lt;em&gt;still&lt;/em&gt; ignored.&lt;/p&gt;

&lt;p&gt;The industry repeats this cycle endlessly:&lt;/p&gt;

&lt;p&gt;→ A native feature ships and solves a real pain&lt;br&gt;
→ Everyone keeps using the old workaround out of muscle memory&lt;br&gt;
→ Two years later a framework "adds support" and suddenly it's cool&lt;/p&gt;

&lt;p&gt;It wasn't the star that changed, it was our attitude.&lt;/p&gt;

&lt;p&gt;I must admit, I've been guilty of this as well. Reflexively resorting to the old negative-margin trick, instead of using the proper tool designed to handle such cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just try it
&lt;/h2&gt;

&lt;p&gt;You don't need a migration plan. Just choose one troublesome heading. One button label that has always seemed inappropriate.&lt;/p&gt;

&lt;p&gt;Simply apply &lt;code&gt;text-box-trim&lt;/code&gt; to it, and you'll see that ghost gap disappear. That tiny moment where you think "oh, that's all?" is extremely important.&lt;/p&gt;

&lt;p&gt;The platform has improved in our absence. The minimum we can do is pay attention. ✨&lt;/p&gt;

&lt;p&gt;What's a native CSS feature you slept on for way too long before it clicked?&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Function coloring is real and pretending context propagation isn't infection</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:19:14 +0000</pubDate>
      <link>https://dev.to/adioof/function-coloring-is-real-and-pretending-context-propagation-isnt-infection-1ihj</link>
      <guid>https://dev.to/adioof/function-coloring-is-real-and-pretending-context-propagation-isnt-infection-1ihj</guid>
      <description>&lt;p&gt;Someone recently attempted to make the bold claim that function color isn't a real phenomenon. Unsurprisingly, the internet had a field day with that.&lt;/p&gt;

&lt;p&gt;An essay went viral on this topic, cross-language, bringing Go, Rust, and Zig into the conflict. The argument: coloring is a non-issue conceptually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the term even came from
&lt;/h2&gt;

&lt;p&gt;Bob Nystrom actually first introduced the concept of "function coloring" in February 2015. His article "What Color is Your Function?" described async functions as red and sync functions as blue (even though Nystrom's colors were just made up on the spot and history has shown this to be the correct assignment).&lt;/p&gt;

&lt;p&gt;The issue was straightforward. Red and blue do not blend well, and introducing one to the other requires a modification in the higher-ups.&lt;/p&gt;

&lt;p&gt;Ron Pressler, tech lead for Java's Project Loom, would later describe this spread as "viral asyncification." Not a flavor of design, a virus.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Go context detour
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. The Go language doesn't use async keywords, so many people believed it avoided the problem of "coloring".&lt;/p&gt;

&lt;p&gt;A retrospective of a Causality.blog commented on this very occurrence in April 2026. It said Go "actually introduced a form of coloring through context.Context," since &lt;code&gt;ctx&lt;/code&gt; flows through invocations for cancellation.&lt;/p&gt;

&lt;p&gt;If you have been using Go since version 1.7, this is familiar to you. Input/output functions require the &lt;code&gt;ctx context.Context&lt;/code&gt; as the first argument, and if one function needs it, you must pass it from every caller above.&lt;/p&gt;

&lt;p&gt;That's the entire infection process. No keyword needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "it's not real coloring" argument
&lt;/h2&gt;

&lt;p&gt;An essay from September 2026 on Jerf.org is revisited. The essay pushed back on the idea. Its argument was that &lt;code&gt;context.Context&lt;/code&gt; is not a color because you can pass &lt;code&gt;context.Background()&lt;/code&gt; to stop the spread locally.&lt;/p&gt;

&lt;p&gt;I understand the reasoning behind it. It is possible to fix the leak at one location.&lt;/p&gt;

&lt;p&gt;But you know what really hurts? It's not the keyword or the type name it's the rewrite you have to do to add &lt;code&gt;ctx&lt;/code&gt; to forty functions that never asked for it.&lt;/p&gt;

&lt;p&gt;Even if you pass &lt;code&gt;Background()&lt;/code&gt; it doesn't reverse it. It simply provides you with a false token to compile the signature. The plumbing remains plumbing. 🔧&lt;/p&gt;

&lt;p&gt;What you're doing doesn't matter in a practical sense, since the circumstances will require you to update all callers in the stack. That's the main point, and rephrasing the definition of the term won't change that fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Loom actually proved
&lt;/h2&gt;

&lt;p&gt;Here's the scoop. Java's Project Loom shipped Virtual Threads in Java 21 back in September 2023.&lt;/p&gt;

&lt;p&gt;Pressler was talking about avoiding the "method color problem" altogether, not by designing a better context object, but by allowing the runtime to handle the context of a thread.&lt;/p&gt;

&lt;p&gt;Consider the implications. If context propagation was just for show, Loom wouldn't have gone to the trouble of having the runtime do it for you.&lt;/p&gt;

&lt;p&gt;Years of effort were dedicated to avoiding the need for you to manually thread anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why devs weren't buying it
&lt;/h2&gt;

&lt;p&gt;Perhaps if we rename the illness, the associated symptoms will seem less like our own failings.&lt;/p&gt;

&lt;p&gt;However, every developer who has been in the industry for a while has had to do a refactor that is not appreciated. For example, a leaf function that did not require a token, and you had to spend an afternoon passing it through the call tree.&lt;/p&gt;

&lt;p&gt;→ Keyword or context object, the infection travels up the stack either way.&lt;/p&gt;

&lt;p&gt;→ "You can stop it locally" is true and irrelevant, because the cost lives in the rewrite, not the escape hatch.&lt;/p&gt;

&lt;p&gt;→ Loom's existence is the strongest evidence coloring is real pain, not pedantry.&lt;/p&gt;

&lt;p&gt;Writing code in Go is different than writing Rust, which is different than writing Zig. But not so different that you think the other one is doing it wrong.&lt;/p&gt;

&lt;p&gt;Describing an issue in terms of its functionality doesn't eliminate its impact on an actual codebase. This is what most essays fail to address.&lt;/p&gt;

&lt;p&gt;So, my question to you is: Is &lt;code&gt;context.Context&lt;/code&gt; in Go a color, a smell, or is it just the tax we pay for cancellation? Where do you draw the line?&lt;/p&gt;

</description>
      <category>go</category>
      <category>concurrency</category>
      <category>programming</category>
      <category>debate</category>
    </item>
    <item>
      <title>Whiteboard interviews died the day AI could solve them live</title>
      <dc:creator>Aditya Agarwal</dc:creator>
      <pubDate>Wed, 09 Sep 2026 19:16:46 +0000</pubDate>
      <link>https://dev.to/adioof/whiteboard-interviews-died-the-day-ai-could-solve-them-live-lag</link>
      <guid>https://dev.to/adioof/whiteboard-interviews-died-the-day-ai-could-solve-them-live-lag</guid>
      <description>&lt;p&gt;The whiteboard interview went away not because it was inhumane, but because it lost out to a bot that could flicker faster than you could squeak the dry-erase marker.&lt;/p&gt;

&lt;p&gt;Basically, timed algorithm puzzles only test one skill. How good you are at hiding a second monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trivia game we all agreed to play
&lt;/h2&gt;

&lt;p&gt;Can we have an open conversation about what LeetCode screening has always measured? It's not skills. It's memory.&lt;/p&gt;

&lt;p&gt;It calculated the amount of time you had spent grinding patterns over the past six months. That's it.&lt;/p&gt;

&lt;p&gt;An essay on Medium from June 28, 2026 said it best. "AI didn't corrupt the whiteboard interview. It just made the corruption impossible to ignore by removing the one thing the ritual was actually measuring: how much time you'd spent on LeetCode recently."&lt;/p&gt;

&lt;p&gt;That's the entire deception summarized concisely. We masked memorization as a substitute for engineering aptitude and assumed no one was aware of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cheating got too easy to ignore
&lt;/h2&gt;

&lt;p&gt;Here's where it falls apart. The machine is now better at the test than the people it's supposed to filter.&lt;/p&gt;

&lt;p&gt;An article on PlainEnglish.io in November 2025 mentioned that GPT-5.1 and Claude 4.5 kind of models can solve a "Hard" LeetCode prompt like Trapping Rain Water for you instantly. They hand you the O(n) solution, comments, and explanation of trade-offs.&lt;/p&gt;

&lt;p&gt;The same PlainEnglish.io piece, titled "The LeetCode Interview is a Scam," expressed it more straightforwardly. "If your entry test can be solved by a non-sentient autocomplete engine in 3 seconds, your test is garbage."&lt;/p&gt;

&lt;p&gt;It's not only puzzle websites. As of August 2026, Failingfast.io reports that Claude Opus 4.5 achieved a 76.8% resolution rate with SWE-bench Verified, and GPT-5 scored 88.0% on the Aider Polyglot code editing benchmark.&lt;/p&gt;

&lt;p&gt;In February 2026, Braincuber Technologies published a report stating that Claude 3.5 Sonnet achieved 93.7% overall coding accuracy, and scored 80.9% on SWE-bench Verified. The two SWE-bench figures come from different test runs and setups, so they aren't directly comparable. These aren't fluke numbers. They're consuming the very format we test on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arms race nobody can win
&lt;/h2&gt;

&lt;p&gt;Cheating is not done in a clever way. It has become a commercial commodity.&lt;/p&gt;

&lt;p&gt;In 2026, Final Round AI's Interview CoPilot™ became a fixture of live FAANG interviews. When the interviewer began to read the problem, the pattern silently appeared on the candidate's screen. "Prefix sums." "Sliding window." The response, whispered.&lt;/p&gt;

&lt;p&gt;Now interviews have become a test for paranoia. Is the candidate looking away from the camera?&lt;/p&gt;

&lt;p&gt;Devrim, who works as a software engineer, hit the nail on the head in September 2026. "You solved 300 problems, memorized all the pattern... and spent six months preparing to prove you can do a job that looks almost nothing like the interview... You are not going to beat a machine by becoming a larger storage device for known solutions."&lt;/p&gt;

&lt;p&gt;That's the punchline. You can't out-memorize the thing built to memorize.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually replaces it
&lt;/h2&gt;

&lt;p&gt;The companies with integrity are already making a shift toward decisions.&lt;/p&gt;

&lt;p&gt;The shift is loud and clear if you're paying attention:&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Architectural judgment&lt;/strong&gt; over pattern recall. Can you reason about a system, not recite an algorithm?&lt;br&gt;
→ &lt;strong&gt;System ownership&lt;/strong&gt; over solo sprints. Do you know why a design breaks at scale?&lt;br&gt;
→ &lt;strong&gt;AI-assisted rounds&lt;/strong&gt; where the tool is on the table, not under it.&lt;/p&gt;

&lt;p&gt;In reality, in the second quarter of 2026, Google launched a pilot of AI-aided coding rounds with interviewers' own models. By mid-2026, its internal research found that 75% of the new code in key software development repositories was generated by AI models. The final code was reviewed and committed by a human.&lt;/p&gt;

&lt;p&gt;Isn't it interesting to consider? Nowadays, Google's hiring standards require you to work &lt;em&gt;with&lt;/em&gt; a machine, rather than wait until you get the job to do so. Finally, the interview process reflects the real world.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The fact that the whiteboard ritual has made it this far is that it was easy to schedule, and easy to tally as a score. It was never precise. AI simply pulled the curtain and revealed that we were grading trivia all along.&lt;/p&gt;

&lt;p&gt;Good riddance. The best engineers I've worked with weren't fast at Trapping Rain Water. They were slow, careful, and asked the right question before writing a line.&lt;/p&gt;

&lt;p&gt;Here's the thing I can't get out of my head: if you can be 3 seconds faster than an autofill at an interview, what are we actually trying to assess for? What sets the great apart from the mediocre other than sheer fatigue resistance?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What replaced LeetCode in your last interview loop, and did it feel more honest or just harder to fake?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>career</category>
      <category>opinion</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
