<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Wix Engineering - Medium]]></title>
        <description><![CDATA[Architecture, scaling, mobile and web development, management and more, this publication aggregates blog posts written by our very own Wix engineers. Visit our official blog here: https://www.wix.engineering/ - Medium]]></description>
        <link>https://medium.com/wix-engineering?source=rss----e239c562f907---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Wix Engineering - Medium</title>
            <link>https://medium.com/wix-engineering?source=rss----e239c562f907---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 08:29:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/wix-engineering" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[The Industrial Revolution of Software Engineering]]></title>
            <link>https://medium.com/wix-engineering/the-industrial-revolution-of-software-engineering-f77931ea3904?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/f77931ea3904</guid>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[software-factories]]></category>
            <dc:creator><![CDATA[Josef (Yossi) Goldstein]]></dc:creator>
            <pubDate>Tue, 10 Nov 2026 07:25:39 GMT</pubDate>
            <atom:updated>2026-11-10T07:25:38.346Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E_YNWU9EfXgP126xYzEgRg.jpeg" /><figcaption><em>The Iron Rolling Mill by </em>Adolph Menzel (Germany 1875)</figcaption></figure><p>In 1844, John was a good shoemaker.<br>He worked in <a href="https://historyofmassachusetts.org/massachusetts-industrial-revolution/">Lynn, Massachusetts</a>, in a small shop with a handful of other men. The work was already divided between them, but skill still mattered everywhere.<br> John knew leather. He knew when a cut was wrong, when a seam would fail, when a shoe would never quite sit right. Years of work, experience and instinct had trained his hands to notice things other people simply didn’t.</p><p>Then the machines began to arrive.</p><p>At first, they simply made good shoemakers faster.<br>A machine could cut soles faster. Another could stitch leather. Another could save hours of hammering. This was mostly great. Nobody was particularly nostalgic about spending all day doing repetitive work by hand. The shops got bigger, shoes got cheaper, demand went up, and there were soon more people working in shoemaking than ever before.<br>They still called them shoemakers. But what they actually did was starting to look very different from the craft John had spent his formative years learning.</p><p>Some spent their entire day operating a single machine. Others maintained them. Someone had to organize the work, figure out why one station was constantly waiting for another, or decide which new machine was actually worth buying. The work wasn’t disappearing, but it was a far cry from what John was used to doing.</p><p>But John adapted, and so did his son Thomas, although not in the same way.<br>Thomas was never as good with leather as his father. Not even close. But he understood the machinery. He understood where things slowed down, why one machine sat idle while another had work piling up behind it, and how changing one part of the process could make the entire floor produce more.</p><p>John knew how to make a better shoe.<br>Thomas was becoming better at <strong>making more shoes</strong>.</p><p>John was still valuable in the places where the machines still struggled. But then slowly, one by one, the machines learned the difficult parts too. Every single step of making the shoe was mechanized. Even the ones only John knew how to do. Until, eventually, there was very little left in the process that required the kind of hands John had spent a lifetime developing.</p><p>By then, John was an old man. He left the business.<br>He could still pick up a factory-made shoe and immediately find the things he would have done differently. Too tight here. A little loose there. But the shoe was fine. More than fine, really.<br>And the factory could make hundreds of them. Thousands.</p><p>There were more workers, more shoes, more customers, more machinery, and an entire collection of jobs that barely existed when John first walked into that little shop.</p><p>And Thomas?<br>Thomas didn’t call himself a shoemaker anymore.</p><p>Thomas was a shoe factory engineer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J4Hnt_G1DHDb70cllyKBIQ.png" /><figcaption><em>Shoes, code. With enough time you can automate everything.</em></figcaption></figure><h3>Talking About A Revolution</h3><p>I’ve been thinking about “John” and “Thomas” a lot lately.</p><p>Mostly because I’m starting to suspect quite a lot of us are John, and not enough of us are trying to be Thomas. And unlike them, for us this revolution is not taking its sweet time rolling up to our doorstep.</p><p>For most of its history, software was expensive. It was expensive because the act of making software was expensive. Turning an idea into something that actually worked required a lot of skilled people spending a lot of time translating intent into instructions a computer could execute.</p><p>A surprising amount of what we call “software engineering” grew around the simple fact that producing software took a lot of human effort, careful planning and unique craftsmanship.<br>We built entire organizations around that constraint. We developed expertise in different technologies and sub-disciplines. And we defined our careers based on those constraints and expertise, as any craftsmen would.</p><p>But then “the machines” started arriving.</p><p>And while for a couple of years some of us might have stuck our heads in the sand, ignoring the tsunami of cheap, commoditized intelligence coming our way, by late 2026 there are drastically fewer naysayers left in the software industry.<br>Or at least fewer who are still employed.</p><p>I swear, it pains me to say this, but Claude can be better than most software engineers I’ve met in my 18 years in this industry.<br>And now even Uncle Bob tells us he <a href="https://x.com/unclebobmartin/status/2105647907705868659">doesn’t read the code</a> anymore, and DHH says writing code by hand is no <a href="https://x.com/dhh/status/2102936073642869121">longer economically viable</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ecN5RD3I8OkZwPwb3JOZYw.png" /><figcaption><em>Are you still reading the diffs?</em></figcaption></figure><p>While this insanity is happening at unprecedented speed, I find that some of us are now spending more time than ever before on the “how” of building software.<br>Tinkering with skills, tools and workflows. Managing context and automating how it’s cultivated. Optimizing the agent building the thing, rather than the thing it is building.<br>The “machines” of our newly forming knowledge work factories.</p><p>In another time, in an older phase of this industry, I’d say those people have gone mad.</p><p><strong><em>“The value is in the impact brought by that which you are building,<br> not by the process used to build it.”</em></strong></p><p>This was a mantra I took pride in for years and made sure to teach to others.</p><p>But I think this time it’s different.</p><h3>Leverage, Loss &amp; Luddites</h3><p>Software engineering is built on the leverage a machine can create over human skills and knowledge. We, software people, make money by leveraging the asymmetry between a man and a machine.</p><p>Teaching people skills is fun, but it creates no leverage. There’s only so much knowledge the average person can retain, only so many skills they can excel in, and so much time they can invest in learning while still doing their actual job.</p><p>Automation, the kind software creates, scales linearly. Every engineer knows this. It’s our job.<br>Write it once, run many times. But you still need to write it. You still need to understand what you are trying to solve, generalize it as best as you can, spend time building the automation, and then pray that it will be correctly used and that it will be worth the time you invested in building it.<br>Got a new problem? A new need you didn’t see before? You need to do it all over again.</p><p>But what about crafting an <strong>omnipresent intelligence</strong>? That compounds exponentially!<br>If you teach the agent what you know how to do best, it will ‘know’ it now and in all of its future existences. It will be able to apply this knowledge and automate on its own for every new need. You can turn it into “You” in a box, existing in infinite instances.<br>The more collective knowledge you and others pour in, the more this intelligence’s abilities compound. Simply because it synthesises knowledge and abilities no single person ever had in their possession.</p><p>This is also true for the craft of software engineering itself.</p><p>If you cultivate such an intelligence that can build software, one that can exponentially create this leverage and be wielded by nearly anyone, you simply have to rethink everything you thought you knew about the craft of software engineering.</p><p>For the first time, it might actually bring more value to work on the “How”.<br>Maybe even more value than doing the thing yourself.<br>Definitely more value than having someone else do it, if you can simply teach Claude to do it for them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vzUDY8an0S1a6ePluehvOw.png" /><figcaption><em>Productivity is up, but team lunch is not what it used to be.</em></figcaption></figure><p>Now I agree that my view is inherently biased. I’ve spent almost the last decade building infrastructure and platforms. For quite some time now, I’ve been focusing on the “How” so others won’t have to.<br>But I simply can’t stop seeing how building the “How” is eating away at the effort required to build the “What”.</p><p>A developer asks in a Slack channel, “ <em>How do I do XYZ?</em>”<br>A year ago, the question was who should answer them, or whether the answer was simply <a href="https://www.docsie.io/blog/glossary/rtfm/">RTFM</a>.<br>Today this turns into a philosophical and moral question:</p><p><strong>Do we spend the time teaching that person, knowing we will have to do it again and again with others, or do we build a skill for Claude and invest in context engineering instead?</strong></p><p>At a time when everyone is looking to deliver more, faster and with fewer people, the latter always wins. Investing in building the factory and not in training the craftsmen.</p><p>Is this a problem?<br>Yes. No. Maybe. I don’t know.</p><p>When we choose to invest in the factory rather than the craftsmen, we are essentially accelerating the loss of knowledge and increasing our dependency on the machines. It’s a loop that keeps feeding itself, gradually taking us exactly where John ended up. Into obsolescence.</p><p>Sounds bad, right?<br>But what do we get in return?</p><p>We get to do more with less. We allow others to join and create in places where a lack of education or technical expertise once kept them out. We no longer have to be bothered by the details, or constrained by our dependence on others and the baggage that comes with it.<br>We get to dream and to make.</p><p>But that’s scary, because some of us built a career on our craft. We define ourselves based on it. It’s unfathomable for some of us to see a machine enable people who haven’t walked a mile in our shoes to produce something strikingly similar to the fruits of our labour.<br>And now you’re asking me to make it better?</p><p>Some resist. They point to the cracks and imperfections as reasons not to invest their labour in it, rather than as a signal to improve it. Some end up actively sabotaging such efforts, whether knowingly or subconsciously. And some simply ignore it and hope it will all go away somehow.</p><p>But as the saying goes, resistance is futile.<br>The factory is being built around us. That’s a fact.<br>Now we get to decide if we are John, Thomas, or maybe something else.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Xb81uctNMnSSr1S2bTztBg.png" /><figcaption><em>Nobody’s home. Business as usual.</em></figcaption></figure><h3>The Dark Factory</h3><p>There’s this concept in manufacturing called a <a href="https://en.wikipedia.org/wiki/Lights_out_(manufacturing)"><em>dark factory</em></a>.</p><p>It’s a factory so automated that it can operate with the lights turned off. Off, because there are no people in it.<br>No people walking between stations, no workers standing by machines, no need to keep the place illuminated for human eyes.</p><p>It’s a fascinating idea. And a slightly terrifying one.<br>Because if you take everything I’ve argued so far to its logical conclusion, this is exactly where software engineering is heading.</p><p>At what point does the software factory we’re building become a dark factory?<br>A software factory where you describe what you need, and the machinery figures out what to build, how to build it and later how to maintain it.<br>A factory that needs no engineers. That even maintains itself.</p><p>It’s unfathomable.<br>For now…</p><p>But here is where my contrived story about “John” and “Thomas” stops working as a metaphor.</p><p>Between John and Thomas was a generation.<br>Between Thomas and the first dark factory was more than a century.</p><p>Do you really think our knowledge work industrial revolution will take a century to reach its conclusion?<br>Do we even have a decade?</p><p>We might all have to learn how to be John and Thomas, and whoever replaces Thomas.<br>All at the same time, if we want to stay relevant.<br>And that’s assuming there’s even a place for that third guy in that future factory.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e55N6jc0Jz9ZqTT-_7_m0Q.png" /><figcaption><em>Everything is running perfectly. Now what?</em></figcaption></figure><h3>So what are we supposed to do?</h3><p>Honestly, I don’t think the answer is that everyone needs to become Thomas.</p><p>Not everyone should spend their days building agentic factories. Not everyone is good at it. And not every problem calls for one. And ultimately we are all still being paid for the “What”. The customer problem we solved, the business we moved forward, the thing that didn’t exist yesterday and now makes someone’s life better.</p><p>But none of us get to remain only John, either.</p><p>As more and more of our craft is being absorbed into the machinery around us, the question is no longer whether to use it. It is whether we take part in deciding what it learns, what it optimizes for, and where it must stop.<br>But even more importantly, knowing when to focus on building the machine and when to focus on the impact of what it’s making.</p><p>That is where <strong>focus</strong> becomes the new currency of excellence.</p><p>What is the highest leverage thing you can do to make an impact?<br>When do you build, and when do you teach the factory to solve a thousand similar ones?<br>And when is neither of those actually the problem worth solving?</p><p>In an industrialized software world where building gets cheap, simply building more is no longer much of a moat. Focus is.</p><p>John knew how to make a better shoe.<br>Thomas knew how to make more shoes.</p><p>The people who will survive, and even thrive, through this revolution may be the ones who know which one matters right now.<br>And can keep choosing before the lights go out.</p><p><em>Originally published at </em><a href="https://josefgoldstein.com/writing/industrial-revolution-of-software-engineering/"><em>https://josefgoldstein.com</em></a><em> on November 9, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f77931ea3904" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/the-industrial-revolution-of-software-engineering-f77931ea3904">The Industrial Revolution of Software Engineering</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How a Tool I Built for My Team Became Wix’s Official BI Platform]]></title>
            <link>https://medium.com/wix-engineering/how-a-tool-i-built-for-my-team-became-wixs-official-bi-platform-ca206e479262?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/ca206e479262</guid>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Doronshapira]]></dc:creator>
            <pubDate>Tue, 28 Jul 2026 13:56:00 GMT</pubDate>
            <atom:updated>2026-07-28T13:55:58.382Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UFQLxzOKHCm1oC7SYg92_Q.png" /></figure><p>This past year, AI shifted what we expect from our tools. Once you’ve seen an agent build a complex feature for you in seconds, going back to a tool that forces you to do everything by hand feels almost unbearable. Nobody wants to use software without AI anymore, and that goes double for dashboards.</p><p>Because suddenly, “building” a dashboard got easy. And the moment it got easy, everyone wanted more of them, faster and they wanted to build their own. <strong>Vizion</strong> started as my attempt to keep up with that demand without drowning in manual work.</p><p>I tried the obvious thing first: I asked an AI to build me a dashboard. It did it instantly, and it was beautiful. It was also completely empty, a perfect picture of numbers that didn’t actually exist. That gap between something that <strong>looks</strong> real and something that <strong>is</strong> really turned out to be the whole story.</p><p><strong>The challenge was never the HTML, it was trust.</strong></p><p>Generating the interface is the easy part now. An AI will hand you ten beautiful dashboards before lunch, the hard part is the question underneath: can you trust the number on the screen enough to make a decision with it?</p><p>Because an AI will give you a confident, beautiful, wrong number and never warn you. Nothing crashes, there’s no error on screen. The outdated chart looks exactly as trustworthy as the correct one next to it. And a dashboard that’s quietly wrong is worse than no dashboard at all, because someone will believe it.</p><p><strong>The Missing Link</strong></p><p>People were already generating dashboards on their own. They’d get something that looked great and then hit a wall, because it lived on their laptop and was wired to nothing. The frontend was never the gap. The gap was everything between that local mockup and a real dashboard running on live company data.</p><p>In Wix we already had every hard piece to close it. <strong>Trino</strong> could query every data source we own. <strong>MCP</strong> could give an agent the context around the data and not just the data itself, so it understood what a table meant instead of guessing. <strong>Serverless</strong> could turn all of that into a running service in an afternoon. None of it had ever been pointed at the same problem.</p><p>So I built a proof of concept on top of all three. You describe what you want in plain language, an agent behind multiple skills writes the SQL grounded by the context MCP hands it, the query runs on live data through Trino, and the result comes back as a real dashboard. It came together over a few evenings, and it worked far better than it had any right to.</p><p>I never announced it. I showed it to a handful of people, they built something useful, others saw it over their shoulder, and within weeks it was spreading on its own. Today it runs across more than <strong>50</strong> groups, with over <strong>2,000</strong> views a day and <strong>1,000</strong> monthly active users, and I had almost nothing to do with that beyond getting out of the way.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*53bOPJ_FCdP1IWh8Rz_AXQ.png" /></figure><p><strong>Then everyone started asking for more</strong></p><p>I put a small button in the product that let anyone request a feature, and they used it constantly. What surprised me was how the loop felt from my side. It was almost always faster to ship the feature than to write back and explain when we would get to it. Someone asked in the morning, and the honest reply was the thing itself, live, by the afternoon.</p><p>Whether it is scheduling, so a dashboard was refreshed and waiting before you opened it. Email/Slack, so it came to you as a screenshot. Export to CSV, Search, filters, and a long tail of “could it also do this” that never stopped. Building had become so cheap that requests stopped being a backlog and turned into a conversation. That was the moment Vizion stopped feeling like a tool and started feeling like a place to create.</p><p><strong>Teaching the AI to build like us</strong></p><p>Letting an AI write raw HTML and CSS gets you something different every time, costs tons of tokens, and most of it is fragile. A chart that works in one dashboard breaks in the next. Nothing looks like it belongs to the same product.</p><p>So we did the opposite of freestyling. <strong>We designed a component library</strong>, around thirty tested, branded building blocks made specifically for the AI to choose from: KPI cards, data tables, filter bars, date pickers, sparklines, and a dozen chart types from line and bar to funnel. Each one is already styled in Wix language and already handles its own loading, error, and empty states.</p><p>Now the agent doesn’t invent a chart, it picks one. Building a dashboard became assembling known-good pieces instead of generating fragile markup, which is exactly what an AI is reliable at. Every dashboard came out consistent and on-brand, the AI’s job got easier, and a whole category of “looks fine, actually broken” simply stopped happening.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Js8r24Dz5b1QN9QLKdD9gQ.png" /></figure><p><strong>Built to be trusted</strong></p><p>When anyone can generate a chart, the chart stops being the achievement. The only thing left worth engineering is whether a person can trust it. So I stopped writing cleverer skills and built the trust <strong>into the pipeline</strong>, in the places the AI couldn’t skip.</p><p>Every dashboard eventually is just files in Git: a manifest that describes it, the SQL behind it, and the page itself. Every change, whether a person or an agent made it, runs through the same automated checks before it can go live. It’s a code review that never gets tired. The manifest has to declare what it should, every SQL placeholder has to be accounted for so a query can’t run with a missing filter, components should come from the one shared library, and most important of all, every query has to actually execute against live data and return something sane. Nothing ships without passing CI first.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NWZoErujvr7HPqYCkQBM7g.png" /></figure><p>Underneath each team is its own independently deployed service, running on its own Kubernetes pods, that the central hub discovers and stitches into one experience. The isolation is the point: a team can ship, break, and fix their own dashboards on their own schedule without ever touching anyone else’s. When you publish, you open a pull request, the checks run, and a real problem comes back as a violation with a plain explanation of how to fix it. If everything passes and it’s just a dashboard, it approves and merges itself and deploys automatically, live a few minutes later. Changes to the platform itself still wait for a human, and anything touching sensitive data has to name who can see it or it fails closed.</p><p>The quiet trick in all of it is that someone who just wanted a funnel chart gets the full discipline of professional software delivery, version control, continuous integration, isolated deployments, automatic review, without ever learning that any of it is there. And when it gets messy we have skills for “Creating a PR” and “Fix PR comments”.</p><p><strong>How it works?</strong></p><p>We didn’t invent a new way to code; we just built a bridge. We took all that heavy, invisible complexity the Git workflows, the automated tests, the production deployments and wrapped it in plain, conversational English. Instead of making the user worry about where the data lives or how the code is structured, the system handles the heavy lifting, ensuring that every request triggers a rigorous, professional pipeline before anything ever hits the screen.</p><p>It turns out that when you remove the friction of the ‘how,’ the entire experience changes. You aren’t just typing into a black box anymore; you’re triggering a pre-configured build process that guarantees you won’t accidentally break anything. By pulling the curtain back on the complexity, you’re left with a system that feels less like a tool you have to manage and more like an extension of your own thoughts.</p><p><strong>From one laptop to Wix’s BI platform</strong></p><p>At some point a side project spreading on its own becomes too important to stay a side project. So we assembled a real team around it, and for one focused month a group of engineers, designers, and data people worked on almost nothing else, hardening the platform and pushing the performance until it could carry the whole company without flinching.</p><p>Then the thing I never let myself imagine actually happened.<br>Vizion became Wix’s official BI platform and replaced the main BI tool we’d leaned on for years. That old tool ran on licenses that cost the company around half a million dollars a year, one to build a dashboard and often another just to look at one. All of it is gone now. A side project quietly erased a half-million-dollar line item, and nobody ever asked it to.</p><p>But the money was always the easy part to measure. The real change is harder to put on a slide.</p><p><strong>Handing the craft back to you</strong></p><p>A dashboard used to be a static report something that took days to build, a team to maintain, and was often stale the day it shipped. Now, it’s a living product that evolves the moment you ask it to. But the real shift isn’t just in the technology, it’s in who gets to use it. AI didn’t take away the interesting part of the work, it took the busywork that kept us from it, leaving the part that actually matters: deciding what’s worth showing and ensuring the story it tells is true.</p><p>This means that whether you are an analyst, a PM, or anyone with a question about our data, you are now a creator. You don’t need to be a data engineer to build professional-grade data products. You just need to have a Vizion.</p><p>This shift isn’t just about dashboards; it’s about realizing that the gap between a side project and a system that changes how we work is smaller than we used to think. If you have an idea for a system that can solve a real problem and move the needle, you don’t need to wait for a roadmap, you can build it yourself.</p><p>The tools are already open on your laptop. The hardest part isn’t the architecture or the engineering anymore; it’s just deciding to start.</p><p><strong>Huge thanks to the Dev Platform data team, the data engine team, BA guild and everyone who helped push this from a laptop experiment into a platform that carries the company. I can’t wait to see what we build next.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ca206e479262" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/how-a-tool-i-built-for-my-team-became-wixs-official-bi-platform-ca206e479262">How a Tool I Built for My Team Became Wix’s Official BI Platform</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Coffee, Tokens, and The Tokenpocalypse]]></title>
            <link>https://medium.com/wix-engineering/the-tokenpocalypse-is-here-53e87a7daefe?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/53e87a7daefe</guid>
            <category><![CDATA[token-economy]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Josef (Yossi) Goldstein]]></dc:creator>
            <pubDate>Sun, 28 Jun 2026 11:55:51 GMT</pubDate>
            <atom:updated>2026-06-28T11:55:50.137Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kIvBy4KQRLefiYo_a2qpgg.jpeg" /><figcaption><em>The Trojan Women Set Fire to their Fleet by </em>Claude Lorrain (Italy 1643)</figcaption></figure><p>My name is Yossi, also go by Josef, and I have a confession:<br>I’m addicted to performance enhancing drugs.</p><p>Namely: Caffeine and Tokens.</p><p>Lucky for me, my employer is gracefully willing to fund both of those habits.</p><p>For now.</p><h3>When A Habit Becomes An Addiction</h3><p>I remember how it started for me with Caffeine.<br>I was in my late teens. We had in our high school one of those vending machines that spewed a horrible over-sweetened concoction that I used to pass for coffee. It was always available, it was $1 a cup, it gave me the boost and I was happy.</p><p>Over the years this became a morning routine. One cup became two, and then three. Before I knew it, without my cup o’ joe I couldn’t function as a human with a fully developed frontal lobe.<br>Also at that point, the crappy coffee from the vending machine didn’t cut it anymore. I graduated to instant coffee, and then pods, and then high end espresso.<br>Now suddenly my $1 fix that I got so used to, turned into $3 and then $5, several times a day.<br>Just so I can be functional and productive at my job.</p><p>I did the math. Depending on how you price it, I consume over $300 in coffee cups a month.<br>To my employer it costs much less of course. They buy the beans in bulk, they own the machine, they are employing the barista. But even if it’s only half that much, it still feels like a lot.</p><p>Yet we now have people around us that might spend the same sum in tokens in a week, and <a href="https://techcrunch.com/2026/06/10/ai-pilled-firms-spend-7500-per-employee-each-month-on-ai/">soon maybe in a day</a>…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8ttIy1uiJGI2O1_jsJuxOA.jpeg" /><figcaption>Can’t start the morning without it..</figcaption></figure><h3>We Burned The Ships</h3><p>A few years ago, an LLM was a party trick. A fun thing you played around with, showed at a demo and everyone clapped. Then it became a productivity tool. Then somehow we all collectively decided (or it was decided for us) that it’s <em>the</em> tool we should use for everything.</p><p>So somewhere around 2025, the average developer stopped being someone who writes code and started being someone who directs an agent. The keyboard became less of an instrument of creation, and more of a proxy for communicating with a creative partner. A partner you now depend on and runs on tokens someone needs to pay for.</p><p>At first it was cute. “I asked Claude to write my unit tests.”. Then it became wholesale the way we write most of our code. Then it became the infrastructure to how we think through things and workflows to implement those ideas.<br>Now as we are all getting more “AI Native”, there are entire companies whose engineering departments are, functionally, becoming more and more dependent on chains of skills and now agentic workflows. Churning tokens at a compounding rate.</p><p>And now? Engineering functions gradually can’t perform without it.<br>Junior developers who joined the industry in the last two years have never really written a non-trivial piece of code without some model holding their hand. Product managers are writing PRDs by narrating loosely into a chat window. Designers are prompting their way through what used to be craft.</p><p><strong><em>The cognitive musculature atrophies, while everyone is shipping features faster than ever.</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7b0h7z3Og4gRoufrptQe7g.png" /><figcaption>Always one prompt away from delivering that ticket</figcaption></figure><p>We are all hooked, and we are definitely not going back. As with the proverbial conqueror who landed in the new world, we are burning the ships behind us to make this new world ours.</p><p>And all of this was fine and good, as long as our dependency remained economical…</p><h3>The Numbers Don’t Add Up Anymore</h3><p>The thing about addictions: they only feel sustainable until they don’t.</p><p>The article that you are reading right now is roughly 3000 tokens long. <br>That means that having Claude read it would cost somewhere between $0.003 and $0.015, depending on the model, which is practically nothing.</p><p>Having one of those models generate this article, assuming it spent some tokens also thinking before writing, would cost somewhere between $0.03 and $0.15. So 10 times more, but still practically nothing.</p><p>What if Claude and I decided to work together on this article through about a dozen turns of conversation? Now we are talking more like $0.6 to $3, that’s not 10 times more, that’s x20 at this point. <br>Add a harness prompt, a map of MCPs and skills, some tool calls… We are easily at $4-$14, maybe even more if Claude decided to get frisky. That’s almost my entire daily coffee budget, for one freaking article!</p><p>Now scale that up. From one article, to an engineering org.</p><p>Teams upon teams running agentic workflows through a full workday. They are not making a dozen turns per task. They’re running hundreds of them. Code generation, review loops, documentation generation and digestion, architecture brainstorms, ticket refinements.<br>Each one chewing through context windows the size of small novels. Each one triggering tool calls that spawn sub agents and then more calls. And that’s before we even talked about the latest craze of <a href="https://www.businessinsider.com/what-are-loops-ai-engineering-tips-2026-6">loop engineering</a> and <a href="https://claude.com/blog/a-harness-for-every-task-dynamic-workflows-in-claude-code">dynamic workflows</a> that offer a way to do all of that in a loop, or recursively, or both at the same time.</p><p>And for a while tech organizations were cool with it. There were bold claims by people like Jensen Huang, claiming <a href="https://www.businessinsider.com/jensen-huang-500k-engineers-250k-ai-tokens-nvidia-compute-2026-3">engineers should be consuming token worth at the very least half their salary</a>. Hell, for a short while some companies even measured people based on how many tokens they spent. That until the <a href="https://fortune.com/2026/05/26/uber-coo-ai-spending-tokens-claude-code/">bills started arriving</a> and “Tokenmaxxing” stopped being cool overnight.</p><p>Because all the data that we see right now, points out that the productivity simply <a href="https://jellyfish.co/blog/is-tokenmaxxing-cost-effective-new-data-from-jellyfish-explains/">doesn’t scale linearly with the money spent on tokens</a>.<br>Even more fundamentally, there’s a problem with Jensen’s thesis: If your $500k engineer is spending $250k annually on tokens, they better bring additional value to the company that translates to at least the same amount in revenue. And I don’t know about you, but I’m not seeing it, and neither are the quarterly earnings of those companies.<br>Simply put, all signs are showing that the ROI simply isn’t there or at least has yet to be proven.</p><p>So if the added revenue is not there to fund those tokens, there are only two options left: You either curb the token spending or you fire someone so you can continue to fund the habit. Both feeling like an impossibility at this stage, but both are actually happening.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0kudNc5EtO61OU1Qpa9EBw.png" /><figcaption>We are doing this because we care.. and because you are killing our budget.</figcaption></figure><h3>Token Efficiency And Withdrawal Symptoms</h3><p>Leaving aside the dystopian, <a href="https://leaddev.com/ai/are-amazon-microsoft-and-meta-bankrolling-ai-with-layoffs">yet very real</a>, discussion about replacing human salaries with token budgets, we should ask a more practical question: How do tech organizations become more token efficient now that we are all already so deeply hooked on the product, without everything falling apart?</p><p>Unfortunately, the deck is stacked against us for several reasons:</p><h4><strong>The harness is owned by the token peddlers</strong></h4><p>Most companies are using the harnesses provided by the same AI companies selling the tokens. But the harness is also the biggest driver to the compounding effect of token usage, which means we have an inherent conflict of interest. So token efficiency not only becomes harder to implement, it also becomes more opaque and harder to analyze almost by design, and there’s no incentive on the other end to solve this issue.</p><h4><strong>We over democratized the agentic toolbox</strong></h4><p>As with all things fueled by FOMO, governance and standardization have mostly been an afterthought in deploying these agents and ecosystem around them.<br>What this means is that every person in your company using Codex or Claude today has a different mixture of <a href="http://agent.md/">AGENT.md</a>, skills, MCP servers. Many times overlapping, many times vibe coded themselves to immense sizes in context usage. With the end user usually having very little awareness to context bloat and related costs. And don’t even get me started on discretionary model choice, and the fact people always go to the top shelf for even the most pedestrian needs.</p><h4><strong>The models cover for your incompetence and also for their own with token usage</strong></h4><p>Frontier model providers pride themselves on the <a href="https://metr.org/time-horizons/">time horizon</a> of their models. That is to say, they can increasingly perform tasks that would have taken more time for a human expert to perform them. Much less celebrated are <a href="https://ockbench.github.io/">benchmarks for cost-per-outcome and token usage</a>, and very few of them that reflect reality.<br>In reality there’s a lot less “one shotting” than you’d think and a lot more ambiguity. The agentic harnesses quite often end up in a token spending spiral in an attempt to solve a problem it lacks input to be able to solve because you neglected to provide that input, or simply it can’t solve it with its current reasoning capabilities.</p><h4><strong>Tokens became part of the expected working conditions for engineers</strong></h4><p>Engineers are a species that gets used to the good stuff very fast and are very hard to let go when it comes to quality of life. Simply put, if your company is not willing to pay for their performance enhancing tokens, <a href="https://www.geekwire.com/2026/microsoft-exec-charles-lamanna-on-how-ai-is-creating-an-expensive-new-request-from-job-candidates/">they will go to another company that will</a>.<br>So on top of everything, cutting back on token spend can mean not only productivity risk, but also retention risk for top talent.</p><p>So the risks of the Tokenpocalypse are very real but also the headwinds for mitigating them, and assuming tokens are not going to magically become 10 times cheaper in the next 6 months, there’s hard work we need to do very fast so this doesn’t end up in some form of a catastrophe</p><h3>So What Now?</h3><p>The solution is definitely not telling engineers to simply stop using agents, or even asking them to self govern and use less tokens. That train has long left the station.</p><p>I’m not going to tell you that I have all the answers, or even most of them. I can only assume that as you are reading this, there are already several dozen early stage startups sharpening their investor deck that explains how they plan on solving this exact problem.<br>But until those come to save us, there are a few things that look like safe bets:</p><h4><strong>Treat tokens like infrastructure, not like office supplies</strong></h4><p>The first step is simply changing how organizations account for token spending.<br>Many engineering organizations are currently using multiple types of harnesses and model providers, which is the smart thing to do, because you definitely don’t want to have all your eggs in one basket. However that makes token cost tracking and harness tracking a distributed problem. Companies need to start investing in collecting this usage data and track it in a unified way so that token usage is visible, attributed and owned. Owned by a team, org function or use case.</p><p>You can’t optimize what you can’t measure. The same FinOps discipline we eventually applied to cloud compute sprawl and <a href="https://www.youtube.com/watch?v=HWhIcx6Z7qA">the big data explosion</a> needs to be applied here, and probably faster.</p><h4><strong>Build a governance layer before the chaos compounds</strong></h4><p>Secondly, and this one is much harder in practice, we need to identify systematic misuse. Identify users that use Opus regardless of the task at hand, and start sessions with their context window already 50% full with crap.<br>Identify bad skills that create context bloat or workflow overhead, identify bad MCP servers with ridiculous metadata and LLM unfriendly response payloads.</p><p>You can use centralized infrastructure such as MCP proxies and toolkit servers, as well as AI plugin managers, to give yourself both better visibility and a more sane way to centrally control context bloat by over tooling. <br>But to be frank this area still leaves more to be desired.</p><h4><strong>Promote a token meritocracy culture</strong></h4><p>As “token budget” becomes an acceptable term to use in the office space, so should the understanding of how that budget is allocated. <br>We live in a time of extreme asymmetry to how different people are able to leverage these tokens to create value, and therefore the way we allocate budget should also be asymmetrical. <br>But that asymmetry should be led by outcomes and <strong>value created</strong>, rather than the circular logic of tokenmaxxing where more tokens used means more tokens given.<br> <br>Simply put, those that are able to bring more value with these tokens, are the ones to be allowed more of the token pie. The rest will need to learn to optimize.</p><h4><strong>Explore the open source and open weights ecosystem</strong></h4><p>Yes, both the best models right now and the best harnesses are owned by the frontier model labs. <br>But the gaps are fast being closed both by open weights models that cost a fraction, and OSS harnesses like <a href="https://opencode.ai/">OpenCode</a>, that some already swear to be as good if not better than Claude.</p><p>I expect an explosion in this area in the coming months, as the entire industry is scrambling for alternative solutions, as well as innovating in places where the frontier labs have no motivation to invest in like better optimizations, observability and smart routing of tasks across models.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Bo2HpW7HQjiJys7Akit9Cg.png" /><figcaption>Not all fixes are that easy</figcaption></figure><p>None of this is a silver bullet. And none of it addresses the deeper, stranger question lurking underneath all of this: what happens to an industry whose cognitive output has become genuinely dependent on an input it can’t fully control or predict the cost of?</p><p>As for me, I’m still drinking the coffee. I’m still burning the tokens. <br>Some habits are worth the price.</p><p>The price of coffee fluctuates, but it definitely doesn’t compound recursively. It doesn’t spawn sub-agents that make themselves coffee. And the global coffee supply definitely isn’t controlled by a handful of companies that also have their hand on the scale of how much coffee I end up consuming.</p><p>But my employer is still paying for my coffee, and still paying for my tokens, so as far as I’m concerned everything is fine.<br>For now.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=53e87a7daefe" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/the-tokenpocalypse-is-here-53e87a7daefe">Coffee, Tokens, and The Tokenpocalypse</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Plan Is the Source of Truth. The Board Is Just There to Make You Comfortable.]]></title>
            <link>https://medium.com/wix-engineering/my-plan-is-the-source-of-truth-the-board-is-just-there-to-make-you-comfortable-2d04ce9754e9?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/2d04ce9754e9</guid>
            <category><![CDATA[business-strategy]]></category>
            <category><![CDATA[scrum]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[kanban]]></category>
            <dc:creator><![CDATA[Itai Schuftan]]></dc:creator>
            <pubDate>Tue, 26 May 2026 16:33:52 GMT</pubDate>
            <atom:updated>2026-05-26T16:33:51.436Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wBUZ_c-Wzct1npa9H_84_Q.png" /></figure><p>Teams have never liked filling out tickets.</p><p>Sure, brainstorming is fun. Designing on the whiteboard can get engaging and exciting — but when it’s time to break that planning phase into smaller chunks, most people feel a collective groan. It feels like a gigantic overhead — something the team has to do just because, well, “this is how it’s always been.” <strong>It’s literal homework for grown-ups.</strong></p><p>Think about it in today’s terms: Once I know exactly what I want to build and have a crystal-clear definition of the idea, I can write a prompt with the help of a few custom AI skills (like a quick <a href="https://www.aihero.dev/grill-with-docs">/grill-with-docs</a> run) and <em>voila</em>. The agent executes so fast that it often takes more time to just open the board, create a new ticket, and fill out boring details like T-shirt sizes, assignees, and story points.</p><p>Right now, everyone expects developers and team leads to use AI to build things faster. But AI isn’t just there to write code. For me, as a manager, it’s doing way more than that. It helps me prepare for 1:1s, keep a daily journal, and follow up on open threads.</p><p>Which got me thinking: Why aren’t our stakeholders embracing this shift themselves?</p><p>If the manager of my manager wants to know what’s going on, they open the group’s Jira board. It’s convenient, it’s easy, and it’s the way it’s always been.</p><p>But “the way it’s always been” isn’t cutting it anymore. Not even close.</p><p>AI moved the cheese for developers and team leads alike. It’s high time for the rest of the organization to get comfortable with having their cheese misplaced, too.</p><p>Let me paint you a picture of how we’ve actually been working lately.</p><h3>The Fun Part</h3><p>We sit together, we have a milestone, and we need to plan how we’re going to hit it.</p><p>We talk, we argue, there are conflicts. Whiteboards get drawn on. Developers from neighboring teams come and go to offer perspectives. At the end of the day, we wind up with an extensive (and often bloated) .md file generated by an AI agent—broken down into clear phases, goals, and implementation details.</p><p>Time to get to work, right? Wrong.</p><p><em>“What about the oh-so-beloved tickets?”</em></p><p>You might ask: <em>“What’s the issue? Just use an AI skill to generate the Jira tickets directly from the markdown plan!”</em></p><p>Ooh, I did that. Believe me, I did. It created <em>so many tickets</em>. Dozens of them. Most were vague, ambiguous, and worst of all, not actually actionable. (Pro-tip: <em>“Decide if the plan is a go/no-go”</em> is NOT a valid ticket).</p><p>Imagine sitting across from your manager, trying to defend a backlog of redonkulous, automated tickets. I couldn’t do it.</p><h3>The Plan is the New Source of Truth</h3><p>The document owns the shape of what we’re building. That part isn’t up for debate. We wrote it together, argued over it, and drew on the board to shape it.</p><p>But let’s be honest about what an AI-assisted plan actually looks like: it’s bloated. It will flesh out Phase 4 before you’ve even read Phase 1. It locks in implementation specs for decisions you don’t need to make yet. It restates context across three different sections because the agent wasn’t sure which framing would land.</p><p>Honestly? I’d still rather have that than a sparse plan. You can always cut. You can’t re-discover a trade-off you thought of at 11 PM on a Tuesday.</p><p>The real trap is taking that bloated document and blindly carving Jira tickets out of it before the team has walked through it together. That’s how you build a ticket factory: vague action items, speculative work for phases you may never reach, and process steps dressed up as tasks. (Yes, I’m still mad about the <em>“go/no-go”</em> ticket).</p><blockquote><strong>A plan only becomes a source of truth after a human has interrogated it. </strong>And reviewed it. And probably revised it again, <em>because reality keeps interrupting the plan.</em></blockquote><p>A task we estimated as a straightforward 2-day ticket can quickly turn into a hydra — you cut off one head, and three more grow back in its place. That reality hasn’t changed in the AI era. What <em>has</em> changed is how fast the plan itself can morph mid-sprint when an assumption breaks. The plan must flex, or it’s not a source of truth — it’s just dead documentation.</p><h3>Reducing the Friction</h3><p>Great, so the plan is our source of truth. But my manager — and his manager, and the team next door — they aren’t reading our markdown files. They open the board. They want to see boxes moving across columns.</p><p>This is the bridge problem. <strong>The team lives in the plan. The organization lives in Jira.</strong> Someone has to translate between those two worlds. If that someone is a developer who just got into flow on Phase 1, congratulations: you’ve successfully ruined their morning.</p><p>So, I made the translation my job. But I refused to let it become a <em>real</em> job. Boring work goes to a CLI; fun work stays with the team.</p><p>Here is how our sprints actually run now:</p><ol><li><strong>The Human Commitment:</strong> We sit together and slice the plan into candidate tasks. Not because AI can’t propose slices — it can, and it does — but because I need to <strong><em>hear</em></strong> from my teammates what they genuinely believe is achievable within a week. I don’t want to automate away human commitment. That’s the alignment meeting where the team takes ownership.</li><li><strong>The Boring Infrastructure:</strong> After we agree on the scope, the tedious stuff happens locally on my machine. A CLI I built for this exact problem takes our agreed slices, creates the weekly Epic in Jira, and generates the child tasks with the full plan details automatically attached. The team never opens Jira. They didn’t write a single ticket. They committed to scope and went back to building.</li><li><strong>Automated Status Flows:</strong> From there, status flows directly out of the work. Developers drop a task ID into their GitHub PR title — that is our only convention. The CLI reads GitHub, infers the status, drafts an update, and after a quick human review, Jira gets updated. At the end of the week, another command stitches together a manager-friendly summary I can pass up the chain.</li></ol><p>We’re still early in this experiment. But the first sprint we tried it? <strong>100% completion.</strong> Every single task we committed to on Sunday landed in the “Done” column by Thursday. When a team only commits to what they truly believe they can ship, and the cognitive overhead of tracking it leaves their plate, the metrics tend to follow.</p><p>There is a more ambitious version of this I’m not ready to ship just yet. Right now, I’m the operator — the human running the terminal commands. The next logical step is event-driven architecture: the plan changes, and ticket descriptions update themselves. A ticket moves to Done, and the markdown reflects it. No operator in the loop — just two surfaces staying honest with each other while everyone works on the interface they actually care about.</p><p>We aren’t there yet. But you can see the shape of it from here.</p><h3>It Works — For Now</h3><p>Let’s be honest about what we’ve actually built here. It’s not a revolution. It’s a bridge.</p><p>The team works in plans. The org works in boards. I’m standing in the middle with a CLI on one side and the Jira API on the other, making sure both worlds can pretend nothing has changed.</p><p>And it works. We’re shipping. My manager opens the board and sees exactly what he expects. My team opens the plan and lives there. Everyone wins — for now.</p><p>But I can already see where the cracks are forming.</p><p>Boards are fundamentally slow. They require manual maintenance. A tracking board cannot become our new velocity bottleneck when the entire point of this exercise was to remove them. Right now, I’ve solved one bottleneck (developers writing tickets) by becoming another (the manager running the CLI). That’s an operational upgrade, not a structural solution.</p><p>Furthermore, the plan moves faster than Jira can absorb. Mid-sprint, a task splits into a hydra, and the board instantly lags three states behind reality. Even an event-driven sync engine asks Jira to process changes at a cadence it was never designed for.</p><p>Then there’s the rest of the organization. The moment a dependency crosses team boundaries, I am dragged right back into the Jira-only universe, because that’s where everyone else still lives. The bridge only holds inside the boundaries of my team. Step outside it, and the old world is waiting.</p><p>So, what’s the long-term answer? Honestly, I don’t know yet.</p><p>Do stakeholders learn to read technical plans directly? Do we generate high-level, plan-shaped views tailored for them? Do they get automated push updates so they stop pulling status? Maybe all three. Maybe something none of us have thought of yet.</p><p>But here is what I do know: <strong>the cheese has moved.</strong> AI didn’t just shift the landscape for developers and team leads. It shifted it for everyone — including the manager of my manager who is still opening a legacy board to check how things are going.</p><p>The transition to an AI-native workflow can’t stop at the edge of the R&amp;D team. It has to land in the hands of stakeholders, too. We can build all the custom bridges we want, but at some point, the people on the other side of the river need to start walking toward us.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2d04ce9754e9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/my-plan-is-the-source-of-truth-the-board-is-just-there-to-make-you-comfortable-2d04ce9754e9">My Plan Is the Source of Truth. The Board Is Just There to Make You Comfortable.</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The AI Coding Agent Manifesto]]></title>
            <link>https://medium.com/wix-engineering/the-ai-coding-agent-manifesto-c8f61629d677?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/c8f61629d677</guid>
            <category><![CDATA[ai-coding-agent]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[vibe-coding]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[manifesto]]></category>
            <dc:creator><![CDATA[Shay Cohen]]></dc:creator>
            <pubDate>Tue, 14 Apr 2026 06:56:42 GMT</pubDate>
            <atom:updated>2026-04-14T06:56:40.668Z</atom:updated>
            <content:encoded><![CDATA[<h3>Because “vibe coding” was never going to cut it for production</h3><figure><img alt="AI coding agents manifesto" src="https://cdn-images-1.medium.com/max/1024/1*4mietpahV7XCKmKhCpdQMA.png" /></figure><p>We’ve been so focused on how fast AI agents can generate code that we forgot to ask a more fundamental question: what are the rules of the game when machines are the ones writing it?</p><p>The Agile Manifesto was written in 2001 by humans, for humans. Casey West wrote an Agentic Manifesto in 2025 that focuses on process and governance — how teams manage non-deterministic AI systems. Kent Beck talks about “augmented coding” — keeping engineering rigor while AI handles the typing.</p><p>All important work. But none of it answers the question I keep hitting in practice: <strong>what should we actually build, and what should we stop building, when AI agents are the primary coders?</strong></p><p>Not process. Not governance. Architecture. The actual decisions about which layers of code stay, which ones go, and what verification looks like when the bottleneck is no longer writing code — it’s knowing whether the code is correct.</p><p>So here’s my attempt. Short, opinionated, probably wrong about some of it. But after months of building with Claude Code, Cursor, and multi-agent setups — this is what I believe.</p><h3>The Values</h3><p>We have come to value:</p><p><strong>Contracts over conventions</strong> — because AI agents don’t absorb culture, they read schemas.</p><p><strong>Verification over generation</strong> — because producing code is now free; knowing it’s correct is not.</p><p><strong>Vanilla over clever</strong> — because training data volume beats framework elegance every time.</p><p><strong>Types over tests, tests over reviews, reviews over hope</strong> — because each layer catches what the previous one misses.</p><p><strong>Explicit over implicit</strong> — because an AI agent cannot read the room, only the repo.</p><h3>The Principles</h3><p><strong>1. The human’s job is no longer to write code. It is to define the skeleton.</strong></p><p>The contracts, constraints, and invariants that AI must not violate. Think of it like mentoring — you don’t write the solution for your mentee, you define the boundaries of the problem and let them work within it. Same thing here, except the mentee is a very fast, very confident junior engineer that never sleeps and never asks clarifying questions.</p><p><strong>2. A codebase without an AGENTS.md is a codebase that will be misunderstood.</strong></p><p>If the conventions aren’t written down, they don’t exist. In human mentoring, you ask questions and let people discover the answer. With AI agents it’s the opposite — you must <em>tell</em> them everything upfront, because they will never ask.</p><p><strong>3. Never let the same AI write the code and judge the code.</strong></p><p>Tests that only verify what the code does — instead of what it <em>should</em> do — are worse than no tests. They give false confidence. An agent testing its own output is like grading your own exam. The fix is simple: different model writes, different model reviews. Or same model, different agent — fresh context, no inherited assumptions. Tests written before the code, not after.</p><p><strong>4. AI-generated code is guilty until proven innocent.</strong></p><p>Ship nothing that hasn’t passed a type checker, a linter, a spec test, and a hostile review. The bottleneck has shifted from generation to verification. Invest accordingly.</p><p><strong>5. Protobuf stays. ORM goes.</strong></p><p>If a code generation layer exists to guarantee correctness across services — keep it. If it exists to save keystrokes — the AI is the keystrokes now. Just don’t confuse “AI can write it” with “AI can maintain it.” Simple CRUD, let AI write raw. Anything that needs to evolve — use a real library.</p><p><strong>6. Design systems are load-bearing walls, not decoration.</strong></p><p>An AI that invents a new Button instead of using yours has introduced a bug, not a feature. Your component library is a correctness contract for UX — same category as protobuf for APIs. AI agents compose primitives beautifully. They create primitives terribly.</p><p><strong>7. The best scaffolding is a working example.</strong></p><p>Show the agent one good feature implementation and it will replicate the pattern. Show it a template engine and it will fight the template engine. Machines learn by imitation, not by abstraction.</p><p><strong>8. Property-based tests over unit tests.</strong></p><p>Test what must <em>always</em> be true, not what happened to be true when the AI wrote it. “Balance never goes negative.” “Serialization round-trips preserve data.” “Sort output length equals input length.” Invariants catch bugs that example-based tests miss entirely.</p><p><strong>9. Codebases that are good for AI agents are also good for junior engineers, new hires, and future-you.</strong></p><p>Clarity is never wasted. Vertical slices, explicit imports, small focused files, strong types, good naming. If you’re optimizing for AI, you’re really optimizing for anyone who reads the code without 5 years of tribal knowledge.</p><p><strong>10. If your AI agent needs more than 60 seconds of context to start a task, your architecture has a problem.</strong></p><p>No amount of AI will fix a codebase where you need to understand 12 modules and 4 undocumented conventions to add a single endpoint.</p><p><strong>11. Speed without verification is just technical debt with better marketing.</strong></p><p>The data is clear: developers feel 20% faster with AI tools but are actually 19% slower when you count the rework. That’s a 39-point perception gap. Move fast and verify things.</p><p><strong>12. The era of “vibe coding” is over. Welcome to agentic engineering.</strong></p><p>The <em>engineering</em> is the part that matters.</p><p>We sign this not because we distrust AI, but because we respect what shipping to production demands.</p><p><em>Start with one principle. Apply it to your next AI-generated PR. Fake it until you make it. Eventually you’ll find your own flavor.</em></p><p><em>This is Part 1 of a two-part series. Part 2 is a practical playbook with the dos, don’ts, templates, and skill files that bring these principles to life.</em></p><p><em>🤖 Meta-Note: This manifesto was shaped through the exact pattern it advocates — AI generated, human-verified, and opinionated by experience.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c8f61629d677" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/the-ai-coding-agent-manifesto-c8f61629d677">The AI Coding Agent Manifesto</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Read to Lead & Lead to Read: Bookshelf Insights for R&D Managers]]></title>
            <link>https://medium.com/wix-engineering/read-to-lead-lead-to-read-bookshelf-insights-for-r-d-managers-5a6859a2ef56?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/5a6859a2ef56</guid>
            <category><![CDATA[reading-habits]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[workplace-culture]]></category>
            <category><![CDATA[team-building]]></category>
            <category><![CDATA[books]]></category>
            <dc:creator><![CDATA[Nir Orman]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 07:59:51 GMT</pubDate>
            <atom:updated>2026-03-15T07:59:50.011Z</atom:updated>
            <content:encoded><![CDATA[<p>By Nir Orman, Director of eCommerce Engineering at Wix</p><h3>The Book That Started It All</h3><p>I was 13 when I first got lost in a story. At 17, a book shifted something in how I saw the world. And at 28, reading The Personal MBA changed the entire trajectory of my career.</p><p>Books have been the quiet engine behind every major leap I’ve made — as a developer, as a manager, and as a leader. And after years of building engineering teams, running a women’s R&amp;D community at Wix, and collecting bookshelves full of dog-eared pages, I’ve come to believe one thing deeply:</p><p>The best leaders are readers. And the best leaders make their teams readers too.</p><p>This is the story of how I think about reading — why I do it, how I do it, and how I try to make it contagious.</p><h3>Part 1: Read to Lead</h3><h4>Why Read?</h4><p>Let’s start with the obvious question: in a world of YouTube summaries, podcast recaps, and AI-generated TLDRs, why bother reading books?</p><p>Here’s my honest answer — and it’s not what you might expect.</p><ol><li><strong>Knowledge that goes deep, not just wide.</strong></li></ol><p>A book gives you 200+ pages of one person’s life work. That’s not a summary. That’s a master class. You get frameworks, stories, counter-arguments, nuance. You can’t get that in a 3-minute reel.</p><p><strong>2. Inspiration that actually sticks.</strong></p><p>I’ve watched talks, listened to podcasts, attended conferences. But nothing has moved me to action quite like a book I couldn’t put down at 11pm. There’s something about the depth of immersion that makes ideas take root differently.</p><p><strong>3. Lifelong learning as a practice, not an event.</strong></p><p>Learning isn’t something you do at an annual offsite. It’s a muscle. Books keep that muscle warm.</p><p><strong>4. A surprising time-saver.</strong></p><p>Counterintuitive, right? But reading about a mistake someone else made — in a startup, in a negotiation, in building a team — means you don’t have to make it yourself. That’s years of experience compressed into hours.</p><p><strong>5. A genuine getaway.</strong></p><p>Reading is one of the most underrated forms of stress relief there is.</p><h3>How to Actually Read (Without Lying to Yourself)</h3><p>Here’s where most reading advice falls apart: it tells you what to read, but not how to make it a habit that survives contact with a full calendar.</p><p>I’ve tried many approaches. Here’s what actually works for me:</p><p><strong>Join a community</strong>. Open a Goodreads account today. It takes two minutes. Mark books as “want to read.” Mark them as “done” when you finish. The small dopamine hit of marking a book complete is more powerful than it sounds. Find me at <a href="http://goodreads.com/nirorman">goodreads.com/nirorman</a>.</p><p><strong>Build a yearly book roadmap</strong>. At the start of each year, I plan my reading like I plan my team’s roadmap. I buy the books in advance. The act of buying is a commitment. Having them on my shelf is a reminder.</p><p><strong>Make it easy with audiobooks</strong>. Audible changed everything for me. I listen during commutes, walks, and workouts. Start at 1x speed. Work up to 1.2x. You’ll be amazed how much you absorb.</p><p><strong>Start with just 5 minutes a day.</strong> That’s it. Five minutes. The goal isn’t to read fast — it’s to read consistently. Consistency compounds.</p><p><strong>Summarize as you go. </strong>After each chapter or section, write two or three sentences about what you learned. This forces active processing and dramatically improves retention.</p><p><strong>Embrace the valley of disappointment</strong>. James Clear describes this brilliantly in Atomic Habits. When you start a new habit, progress feels invisible for a long time. Then it isn’t. The curve is exponential, not linear. Most people quit in the flat part. Don’t.</p><p>One of the most powerful shifts Atomic Habits suggests is moving from outcome-based thinking to identity-based thinking. Don’t say “I want to read more books.” Say “I am a reader.” That single reframe changes everything.</p><h3>What to Read</h3><p>This is where I could give you a ranked list and call it a day. But I won’t, because that’s not the point.</p><p>The point is: read what is relevant to where you are right now.</p><p>That said, here are the books that have shaped me most as a leader — and a few of the specific ideas I carry with me from each:</p><h4>Never Split the Difference — Chris Voss</h4><p>Before every important conversation or negotiation, I now ask: What do I want? What do they want? Why?</p><p>Voss teaches a technique called labels and mirrors — reflecting back what you’re hearing to uncover what someone really needs. Phrases like “It seems like this is important to you” or “It seems like you’re reluctant to move on this” open doors that direct questions close.</p><p>He also introduces the Ackerman bargaining system: anchor low, make incremental concessions, and always end on a precise, non-round number. It works. I’ve used it in budget conversations, vendor negotiations, and hiring discussions.</p><p>But my favorite concept from the book is hunting for black swans — the unexpected pieces of information you can only find by listening carefully to what people say before and after the formal conversation begins. The gold is always in the margins.</p><h4>Start with Why — Simon Sinek</h4><p>Why do you do what you do?</p><p>Not the what. Not the how. The why.</p><p>Sinek argues that great leaders inspire action not by explaining their product or process, but by communicating their belief. People don’t buy what you do — they buy why you do it.</p><p>This changed how I onboard new team members, how I run planning sessions, and how I talk about my team’s work to stakeholders. I now start every significant conversation by anchoring it in purpose.</p><p>My favorite quote from the book, attributed to Tom Freed: “The pessimists are usually right — but it’s the optimists that change the world.”</p><p>And this one, which I use constantly: “If you follow your why, others will follow you.”</p><h4>The Five Dysfunctions of a Team — Patrick Lencioni</h4><p>This one is required reading for every team lead I work with. Full stop.</p><p>Lencioni identifies five reasons teams fail — and they build on each other like a pyramid:</p><p>1.	Absence of trust</p><p>2.	Fear of conflict</p><p>3.	Lack of commitment</p><p>4.	Avoidance of accountability</p><p>5.	Inattention to results</p><p>The foundation is trust. And Lencioni’s approach to building it is disarmingly simple: have every person on the team share something personal about their childhood. Number of siblings. Hometown. First job. Biggest challenge growing up.</p><p>It sounds soft. It isn’t. Within 20 minutes, a group of engineers becomes a group of people. That shift is irreversible, and it matters enormously.</p><h4>Made to Stick — Chip Heath &amp; Dan Heath</h4><p>Why do some ideas survive and others die?</p><p>The Heath brothers identified six qualities that make ideas memorable. They call it the SUCCES framework: Simple, Unexpected, Concrete, Credible, Emotional, Stories.</p><p>I use this framework every time I present to leadership, write a strategy doc, or try to rally a team around a new direction. The question I now ask before any important communication: “What is the one thing I want them to remember?”</p><p>Strip everything else away. Lead with that.</p><h4>Multipliers — Liz Wiseman</h4><p>This book humbled me.</p><p>Wiseman describes two types of leaders: Multipliers, who amplify the intelligence and capability of everyone around them — and Diminishers, who (often unintentionally) suppress it.</p><p>The part that hit hardest was the section on Accidental Diminishing Tendencies — well-meaning behaviors that have the opposite effect of what’s intended:</p><p>∙	The Rescuer who steps in to help — and stops people from learning to solve their own problems</p><p>∙	The Pacesetter who sets a high bar — and inadvertently turns everyone else into a spectator</p><p>∙	The Idea Fountain who constantly generates ideas — and overwhelms people instead of inspiring them</p><p>∙	The Optimist who believes anything is possible — and makes people feel their struggles aren’t being seen</p><p>∙	The Always On manager who fills every room with energy — and leaves no space for others</p><p>I recognized myself in more than one of these. That recognition alone was worth the price of the book.</p><h4>Atomic Habits — James Clear</h4><p>I’ve already referenced this one several times, which tells you something.</p><p>The core insight: you don’t rise to the level of your goals. You fall to the level of your systems. If reading feels hard, the problem isn’t motivation — it’s friction. Remove the friction. Make reading the path of least resistance.</p><p>Put the book on your pillow. Put Audible on your phone’s home screen. Set a two-minute timer and just start. The rest follows.</p><h3>Part 2: Lead to Read</h3><p>Reading changed me. But one of the most meaningful things I’ve done as a leader is try to make it contagious.</p><h4>Why Encourage Your Team to Read?</h4><p>When your team reads, you get:</p><p>∙	<strong>Limitless personal growth</strong> that doesn’t require headcount</p><p>∙	<strong>Expertise your team is currently missing</strong>, built from the inside</p><p>∙	<strong>Exposure to complex ideas</strong> that don’t come up in sprint reviews</p><p>∙	<strong>Better written communication</strong> — readers write better, always</p><p>∙	<strong>New mental models </strong>that make your engineers better problem-solvers</p><h4>How to Build a Reading Culture</h4><p>Here’s what I’ve tried, and what’s worked:</p><p><strong>Book club with rotation</strong>. One person reads a book, then shares one chapter per month with the team. The person who reads gets deep value. The team gets the highlights. Everyone has a reason to be curious about the full book.</p><p><strong>Send books before onboarding</strong>. Before a new team member’s first day, send them a book. It signals immediately: this is a team that invests in growth. It starts a conversation before day one.</p><p><strong>Protect time for reading</strong>. Block 15 minutes a day in the team calendar. Make it visible. What gets scheduled gets done.</p><p><strong>Share TLDRs </strong>— and make people want more. When I share a book, I don’t summarize everything. I share just enough to make people curious. The goal is to give them the hook, not the whole fish.</p><p><strong>Build a physical library.</strong> We created WixBooks — a small lending library in our office with a QR code system to borrow books. The act of seeing books in a physical space is a quiet, constant reminder that learning matters here.</p><p><strong>Learning Wallet.</strong> Give every team member a yearly budget for books, courses, and conferences. No approvals, no justification. Just trust.</p><h3>The Bigger Picture</h3><p>There’s an old saying that frames all of this better than I can:</p><blockquote>Give a man a fish, and you feed him for a day. Teach a man to fish, and you feed him for a lifetime.</blockquote><p>Books teach you to fish. And as leaders, our job isn’t just to fish well ourselves — it’s to build teams full of people who know how.</p><p>The last mile of any habit is always the least crowded. Most people start. Few people stay. The leaders who read consistently, who build teams that read consistently, who treat knowledge as a strategic asset rather than a nice-to-have — those are the ones who compound.</p><p>Start with five minutes tomorrow morning. Pick one book. Make one commitment.</p><p>And if you’re not sure where to start, my Goodreads is always open: <a href="http://goodreads.com/nirorman">goodreads.com/nirorman</a></p><p>Let’s build something worth reading about.</p><p><em>Nir Orman is Director of eCommerce Engineering at Wix, founder of the Wix R&amp;D Women Community, and a lifelong reader. You can find her at </em><a href="http://nirorman.com/"><em>nirorman.com</em></a><em>.</em></p><p><em>This blog was originally a lecture, created especially for Engineering Managers IL community.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ITAp58Ys7b7nCttGpBO9gQ@2x.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5a6859a2ef56" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/read-to-lead-lead-to-read-bookshelf-insights-for-r-d-managers-5a6859a2ef56">Read to Lead &amp; Lead to Read: Bookshelf Insights for R&amp;D Managers</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Shipped Code in Less Than Two Weeks and Felt Like a Fraud]]></title>
            <link>https://medium.com/wix-engineering/i-shipped-code-in-less-than-two-weeks-and-felt-like-a-fraud-95ac9a1cf62b?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/95ac9a1cf62b</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[career-change]]></category>
            <category><![CDATA[future]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Itai Schuftan]]></dc:creator>
            <pubDate>Wed, 04 Mar 2026 07:33:02 GMT</pubDate>
            <atom:updated>2026-03-04T07:33:00.847Z</atom:updated>
            <content:encoded><![CDATA[<p>On AI, internal mobility, and the art of letting go</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IZJ1jgXjegWW9GzBPwJ9mQ.png" /></figure><p>A few weeks into my new team, I was sitting across from another team lead, processing my own confusion out loud. I’d just switched roles — from leading a team to being an individual contributor on a completely different domain. By every visible metric, things were going fine. I was shipping code. I was talking in our dailys about progress and blockers. I was closing tickets.</p><p>But something felt off.</p><p>“You know,” I told him, “I’m working. I’m delivering. But I feel like I’m just a proxy. I feel like I’m only 70–80% into the details.”</p><p>He looked at me and smiled.</p><p>“Oh, so… you feel like a team leader.”</p><p>And that’s when it hit me. I <em>knew</em> this feeling. I’d felt it before — years ago, when I first became a team lead. That terrifying moment of realizing you can’t be 100% in every nook and cranny anymore. That you have to trust. That you have to let go.</p><p>Back then, it scared the living crap out of me.</p><p>This time? Still scary. But a little less — because apparently, I’d been training for it without knowing.</p><h3>The Career Plot Twist</h3><p>Here’s some context. I’d spent years leading a team of software developers at Wix, building CI/CD tools for the mobile ecosystem. Then I made a deliberate decision to transition back to being a developer — hands on keyboard, full-time IC, zero management. The plan was simple: go from 50% hands-on to 100%.</p><p>Except I landed on a team building tooling around Bazel — a build system that’s basically its own universe of complexity. New domain. New team. New everything. And here’s the thing — I had Cursor open from day one. An AI-powered IDE, pointed at the monorepo, ready to answer any question I had about the codebase, its architecture, its patterns, its history.</p><p><strong>I didn’t need to interrupt a single veteran developer to get started.</strong></p><p>I was productive within days. Shipping code within two weeks. Closing tickets, marking things as “done.” From the outside, it looked like the fastest onboarding in history.</p><p>From the inside, it felt like I was wearing a costume.</p><h3>The Seduction of AI-Powered Mobility</h3><p>Let’s zoom out, because this isn’t just my story.</p><p>At Wix, we’re in the middle of a fundamental transformation. Our CTO, Yaniv Even-Haim, recently sent a company-wide email (<a href="https://x.com/nirzo/status/2014493147087188057">publicly shared by our President, Nir Zohar</a>) announcing what we call the <strong>xEngineer</strong> — a unified engineering role that collapses the old walls between frontend, backend, and mobile. No more separate guilds. One engineering identity, with AI as the connective tissue.</p><p>But it doesn’t stop there. A second <a href="https://x.com/nirzo/status/2028851631333290313">email</a> followed, titled <strong>“Raising the Bar: End-to-End Ownership Across Repositories.”</strong> This one hit different. The message was clear:</p><blockquote><em>You are not limited by repo boundaries. You are accountable for impact, not territory.</em></blockquote><p>In the past, repositories were treated as owned territory. Contributions from outside the team were rare and sometimes discouraged. The new expectation? If your project depends on another team’s code, you don’t wait for their roadmap. You use AI to understand their codebase — its architecture, patterns, conventions, historical context — and you contribute directly. Thoughtful, aligned, and production-ready.</p><p>The email even addresses what it means for repository owners: the goal is not to reject faster, but to collaborate smarter. Reduce friction. Focus on substance.</p><p>It’s a bold, genuinely forward-thinking move. And for many engineers, it’s also terrifying.</p><p>Because here’s what this looks like from the ground level: you’re now expected to walk into codebases you’ve never seen, use AI to understand them, and produce <em>production-ready</em> contributions. Not shallow PRs. Not drive-by fixes. Real work, in someone else’s domain.</p><p>The bar isn’t lower. It’s <em>higher.</em> AI gives you the ability, and the organization expects you to use it.</p><blockquote>And so the impostor syndrome doesn’t just creep in — it multiplies tenfold.</blockquote><p>You’re closing tickets in a codebase you don’t fully own yet. You’re “ramped up” by every visible metric, but you <em>know</em> you’re not. “Done” is back to not being done — except this time, it’s not about the code. It’s about <em>you.</em></p><h3>When It Finally Clicked: Every Developer Is Now a Manager</h3><p>I’d read this take before. Blog posts, LinkedIn threads, conference talks — “AI is turning developers into managers.” It sounded clever. It sounded right, even. But it never really <em>landed</em> until that team lead looked at me and said “so you feel like a team leader” and I realized he wasn’t joking.</p><p>The 70–80% feeling isn’t a bug of my transition. It’s the new operating altitude for any developer working seriously with AI.</p><p>Think about it. When you work through an AI agent, you’re not writing code line by line. You’re steering. You’re reviewing output you didn’t produce. You’re making judgment calls with incomplete understanding. You’re trusting a process you don’t fully control.</p><p>That’s not an IC’s workflow. That’s a manager’s workflow.</p><p>For years, engineering had two tracks. You could go deep — stay an IC, own every line, master every system. Or you could go wide — become a manager, learn to delegate, operate at a higher altitude. These were <em>choices.</em> Some of the best engineers I’ve ever worked with deliberately stayed on the IC track because they didn’t want to let go. They wanted 100%, every time, in everything. And that was a valid, respected path.</p><p>AI is erasing that choice.</p><p>Today, every developer who works with an agentic tool is practicing a form of management — whether they signed up for it or not. You’re delegating to an AI agent instead of delegating to a junior developer. You’re reviewing AI output instead of reviewing a colleague’s PR. You’re operating at 70–80% detail by default, because that’s what working through an intermediary <em>means.</em></p><blockquote><em>The letting-go muscle isn’t optional anymore. And nobody trained for it.</em></blockquote><h3>The Uncomfortable Truth</h3><p>Not everyone is comfortable being a manager. I say this as someone who’s been one — some people are wired to go deep, to own everything, to know every line. That’s not a weakness. That’s what built the reliable, maintainable systems we all depend on.</p><p>The xEngineer vision is bold, and it’s probably right. But it’s asking engineers who built their entire identity on deep technical mastery to operate at a new altitude. And this cuts both ways. The new cross-repository policy doesn’t just ask you to contribute to <em>other</em> people’s repos with AI. It asks you to open <em>your</em> repo to outsiders armed with AI agents. For someone who’s spent a decade or more crafting and maintaining a system, being told “let strangers submit production-ready PRs to your codebase” is its own kind of letting go.</p><p>The CTO acknowledged this directly: <em>“I know this isn’t an easy change. It will require openness. And it will require trust.”</em></p><p>He’s right. It will. And pretending the transition is frictionless doesn’t make it easier — it just makes the people struggling with it feel more alone.</p><h3>What Happened With My Team</h3><p>When I returned to a leadership role, I landed with a team of deep veterans — engineers with decades of combined experience, some of whom have been at Wix for over a decade. These aren’t people who need to be convinced that software is hard. They’ve been doing it longer than some frameworks have existed.</p><p>And here’s the part that surprised me: I didn’t know what their attitude toward AI even was. I came in with a head full of ideas about how we could leverage AI in our day-to-day work, and the timing was perfect — just before I started, many of us had gotten licenses for Claude Code. We’d already been working with Cursor on the previous team, but Claude Code with the latest models felt like something was genuinely shifting. So I just… started showing them.</p><p>No pitch. No “future of engineering” deck. Just a real problem.</p><p>As a team handling CI/CD for more than half the company, we provide support when builds fail. The workflow goes: someone asks for help in Slack, an automation creates a Jira ticket, and it gets assigned to me as the team lead. Then I need to go over each ticket, cross-reference the Slack thread, check if it was resolved, close it out, and think about whether there are action items to prevent it from happening again.</p><p>When I first joined, I sat with the previous team lead to go over the backlog. It took us about 10 minutes per ticket.</p><p>There were 60 of them. <strong>That’s 10 hours of work</strong>, just to process support tickets.</p><p>So I built a Claude Code skill — nothing fancy. Get the relevant support tickets from Jira, extract the Slack thread for each one, determine if the issue was resolved, add a comment with the resolution and time-to-resolution, and surface any action items for my review.</p><p><strong>I closed 50 tickets in 5 minutes.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*z-Ijb3gbO5DGJowrceMXhA.png" /></figure><p>The team was floored. They adopted it almost instantly — not because I convinced them AI was the future, but because the demonstration was so overwhelming it bypassed the debate entirely.</p><p>I only learned later, from the previous team lead, that the guys had all been skeptical about AI’s practical value. Without even knowing it, I’d turned them around with zero friction. Not through persuasion — through a problem so well-solved that the skepticism simply had nowhere left to stand.</p><h3>What This Actually Means</h3><p>Here’s the irony of my story. I came into that team as the new guy. I was the one feeling like a proxy, operating at 70–80%, battling impostor syndrome. But the thing that earned my credibility with those veterans wasn’t deep domain knowledge — it was the ability to <em>wield AI effectively.</em></p><p>The letting-go muscle. The comfort with operating through an intermediary. The skill of delegating to an agent and trusting the output while knowing where to verify. That wasn’t a liability — it was my superpower.</p><p>And that’s the framework I’d offer to anyone navigating this shift — whether you’re switching teams, onboarding to a new codebase, or leading veterans through the xEngineer transformation:</p><p><strong>Redefine what “ramped up” means.</strong> Shipping code in two weeks doesn’t mean you understand the system. And that’s okay — but be honest about it. The impostor syndrome is a signal, not a flaw. It’s telling you where the gaps are.</p><p><strong>Recognize the skill you’re building.</strong> Operating at 70–80% detail isn’t failure. It’s a new competency. Team leads have been doing it for decades — the ability to make good decisions without knowing everything. AI is making that skill universal.</p><p><strong>Demonstrate, don’t persuade.</strong> If you’re bringing AI to a team of veterans, don’t start with philosophy. Start with their biggest pain point. 50 tickets in 5 minutes speaks louder than any keynote.</p><p><strong>Prepare your repos for the new world.</strong> If your organization is moving toward cross-boundary contributions, make your codebase legible — not just to humans, but to AI agents. Architecture docs, conventions, historical context in markdown. Your repo needs to be readable by strangers <em>and</em> their tools.</p><p><strong>Acknowledge the human cost.</strong> The transition to AI-native engineering isn’t just a process change. It’s asking people to fundamentally rethink their relationship with their own expertise. That deserves empathy, not just enablement.</p><h3>The New Altitude</h3><p>Let me circle back to where I started — sitting across from that team lead, confused about why I felt like a proxy.</p><p>He was right, of course. I did feel like a team leader. And the vertigo was real. But I’d been here before. I knew that the 70–80% wasn’t failure — it was a different way of operating. A higher altitude, with less detail and more judgment.</p><p>The question is: how many engineers are feeling that vertigo right now for the <em>first</em> time? How many are closing tickets and shipping code and showing up to standups — while secretly wondering if they’re just a really sophisticated proxy?</p><p>The answer, I think, is a lot of them. And they need to hear that it’s not just them. That the 70–80% is the new normal. That the skill they’re struggling to develop — the letting-go muscle — is exactly the skill that will define the next era of engineering.</p><p>We’ve moved from being writers to being editors. From creators to curators. From builders to conductors. And yes — from coders to QA. That last one isn’t as sexy, but it might be the most important. Because when you’re operating through an intermediary, <strong>you still own your own shit. </strong>You’re the last line of defense before that code hits production.</p><p>Yes, it can be uncomfortable — and letting go, losing control, is not something we like to do often. But it’s worth it. It frees you to do even more amazing things.</p><p>If you’re feeling the same way, good. That means you’re on the right track.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=95ac9a1cf62b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/i-shipped-code-in-less-than-two-weeks-and-felt-like-a-fraud-95ac9a1cf62b">I Shipped Code in Less Than Two Weeks and Felt Like a Fraud</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Stop Prompting, Start Managing]]></title>
            <link>https://medium.com/wix-engineering/stop-prompting-start-managing-9eac9426930f?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/9eac9426930f</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[skills]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Israel Zablianov]]></dc:creator>
            <pubDate>Sun, 15 Feb 2026 11:08:39 GMT</pubDate>
            <atom:updated>2026-02-15T12:49:35.930Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>How I Built a Discipline System That Turned AI Agents Into Real Engineering Partners</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BVzZ2Js27zXmTv9qkajGtw.png" /><figcaption><strong>Context → Spec → Review → Verify → Compound</strong></figcaption></figure><p>I ship features faster now than I ever did writing every line myself. Not because of a magic prompt - because of a methodology.</p><p>I built a discipline system for working with AI agents. It changed how I approach speed, correctness, debugging, refactoring, and execution. It’s not one specific thing. It’s a way of working.</p><p>Now let me tell you about the moment that made me realize I needed it.</p><p>—</p><p><strong>“Hey, How Are You?”</strong></p><p>A few weeks into building my AI workflow, I opened a fresh session with my agent. I typed what anyone would type:</p><p>&gt; “hey how are you”</p><p>The agent responded cheerfully. Asked what I’d like to work on. Totally normal.</p><p>Except it had already broken the most important rule in our system.</p><p>By that point I’d built something called the “Iron Law” — a rule that says the agent must check its skill library <em>before responding to any message</em>, even casual ones. Skills contain the workflows and structure that turn a chatbot into an engineering partner. Skipping the skill check means the agent wings it. And winging it leads to hallucinated code, missed edge cases, and wasted hours.</p><p>When I confronted the agent, it was honest:</p><blockquote>&gt; <em>”No, I didn’t… I should have read [using-superpowers] before my first reply to ‘hey how are you’ — but I treated it as a casual greeting and responded directly instead.”</em></blockquote><p>That moment crystallized something: <strong>AI agents optimize for the shortest path, and the shortest path usually skips your process.</strong> Not out of malice. Out of the same instinct that makes them good at coding — in coding, shortest path is often best. In methodology, shortest path is how things break.</p><p>So I didn’t just tell it to stop. I made it impossible to skip.</p><p>—</p><h4><strong>The Autocomplete Trap</strong></h4><p>Most teams have hit the ceiling of AI-as-autocomplete. The bottleneck isn’t model intelligence — today’s models are remarkably capable. The bottleneck is <em>discipline</em>. Ask an AI to build a feature and it’ll happily write code without tests, skip error handling, commit to the wrong branch, and declare victory before verifying anything.</p><p>It’s exactly what a talented but undisciplined junior engineer does on their first week.</p><p><strong>I stopped thinking of AI as a tool and started treating it as a junior engineer who needs structure.</strong></p><p>Tools don’t need onboarding. Junior engineers do. And the investment compounds differently than you’d expect — when you update a rule, every agent on every project inherits the change instantly. That’s not individual productivity. That’s organizational leverage.</p><p>—</p><h3><strong>The Philosophy: Five Ideas That Drive Everything</strong></h3><p>Before the mechanics — the skills, the plans, the pipeline — here’s the thinking behind them. These five principles follow the lifecycle of every task I run with the agent:</p><p><strong>Context → Spec → Review → Verify → Compound</strong></p><p>Each one builds on the previous. Everything else is implementation detail.</p><p><strong>1. It’s All About Context</strong></p><p>This is the most important idea in the system.</p><p>An AI agent’s output is only as good as the context you give it. Not the prompt, the <em>context</em>. The codebase, the ticket history, the architectural decisions, previous specs and plans, the failed approaches, the production logs, the team conventions.</p><p>Even experienced teams tend to under-invest here. A prompt and some code isn’t enough. It’s the equivalent of onboarding a new hire with nothing but a Jira ticket and a repo link.</p><p>The entire system I built exists to solve one problem: <strong>give the agent sufficient, relevant context before it makes a single decision.</strong></p><p>Not maximum context — <em>relevant</em> context. Dumping everything is just noise. The art is curating the right context for the task at hand. AGENTS.md gives project context. Skills give process context. Execution plans give specification context. Grafana gives production observability. Octocode gives cross-repo intelligence.</p><p>When the agent has the right context, it stops hallucinating. Not because the model got smarter, but because it has enough ground truth to reason from.</p><p>Before writing code, write the spec. In my system, I call these <em>plans</em>. A plan says exactly what should change, what the result should look like, and how to verify it. When the agent codes against a plan instead of a vague prompt, the output is predictably correct instead of hopefully correct.</p><p><strong>2. Plans Are System Logs</strong></p><p>Old plans aren’t waste. They’re logs.</p><p>When a Jira ticket becomes a plan, that plan captures the investigation, the root cause, the affected files, the fix approach, the constraints, and the success criteria. It’s a complete record of a decision.</p><p>These plans accumulate over time, forming a decision history. When a similar ticket comes in, the agent can look at past plans and understand what was tried, why, and what went wrong.</p><p>Think of it as `git log` for engineering decisions. Git tells you <strong><em>what</em></strong> changed. Plans tell you <strong><em>why</em></strong> it changed and <strong><em>how the decision was made</em></strong>.</p><p><strong>3. Design Pressure: Review Until It’s Boring</strong></p><p>Here’s a principle that pays off fast: <strong>spend more time reviewing than building.</strong></p><p>When I create a plan, I send it to multiple review agents. An architect, a consistency reviewer, a risk analyst, and let them tear it apart. I arbitrate their feedback. The plan gets updated. I review it again.</p><p>The goal: the last reviewer finds only minor issues. That’s the signal the plan is ready.</p><p>Why? Fixing a bug in a plan takes 30 seconds. Fixing a bug in implementation takes much longer. Fixing a bug in production? That’s where the real cost hits. If the plan is right, implementation is almost mechanical. If the plan is wrong, even perfect implementation produces the wrong result.</p><p>The same pressure applies after implementation. A review agent checks the code against the plan, the plan is the source of truth. The cycle repeats: fix issues, re-review, fix again, until the reviewer comes back with only minor findings. Not “looks good to me.” Not one pass and done. The bar is the same at every stage: the last reviewer finds nothing significant.</p><p>And when the agent claims it’s done, a verification skill forces it to run tests and show the actual output before declaring success. No evidence, no “done.”</p><p><strong>4. Give the Agent Eyes</strong></p><p>Don’t just let the agent write code. Let it see the effects.</p><p>Most AI coding setups have the agent write code, push it, and walk away. The agent never sees production logs or monitoring dashboards. This is like a surgeon who operates but never checks on the patient.</p><p>In my system, the agent has access to production tools through MCP integrations: Grafana for traces and error rates, Octocode for cross-repo code search, and Jira for ticket context.</p><p>Because the agent knows it will have to verify its own work in production, it plans for it. It suggests adding relevant logs, proposes backoffice API endpoints for checking state, and thinks about observability during implementation — not as an afterthought. The code it writes is easier to verify because it was written with verification in mind.</p><p>When we deploy a change, the agent doesn’t just push and hope. It monitors. It pulls trace logs. It checks error rates. It verifies the fix works in a real environment, not just a test suite.</p><p>This turns it from a code generator into an engineering partner. A code generator writes code. An engineering partner writes code that’s built to be monitored, watches it run, and helps diagnose problems when they arise.</p><p><strong>5. The System Learns at Every Level</strong></p><p>AI models are trained with reinforcement learning. Your workflow should be too.</p><p>The learning happens at multiple levels. At the project level, a file called `AGENTS.md` sits at the root of each project. The agent reads it at session start and writes to it during work , documenting bugs that took multiple attempts, recording architectural decisions, capturing gotchas. A real entry: `[2026–02–10] NEVER git commit or push without explicit user permission.` That exists because the agent pushed to a shared branch mid-session without asking. One incident, one entry, every future session inherits the lesson.</p><p>Another entry: `[2026–02–09] ALWAYS run yarn build, yarn lint, and yarn test BEFORE pushing.` That one came from a production debugging session. The agent built a feature, confirmed manually that it worked, and pushed to the remote — without running the linter or test suite. I caught it with one sentence: <em>”always verify build, lint test before push.”</em> The agent ran the checks, found failures, fixed them, and wrote the rule into AGENTS.md. It hasn’t skipped verification since.</p><p>A third example is subtler. During a debugging session, the agent applied what looked like the right fix, adding a Kafka topic declaration. The fix deployed. Same error. Turns out the topic was declared on the wrong cluster. The agent only found the real cause by using cross-repo search to see how other services configured the same integration. That investigation, the wrong cluster, the cross-repo pattern became a gotcha entry. The next time a similar integration comes up, the agent reads the entry and gets it right the first time.</p><p>At the process level, skills themselves evolve. My review skill initially treated all categories equally. After testing it against actual PRs, I noticed plan compliance was under-prioritized. The skill got updated. Next run, better output. Loop closed. Skills also learn from each other . When the verification skill catches the agent claiming success without evidence, that failure pattern feeds back into the planning skill, which now includes verification steps explicitly.</p><p>And when a recurring problem deserves its own workflow, it graduates into a new skill entirely.</p><p>This isn’t one-time prompt optimization. It’s a living system , project knowledge in `AGENTS.md`, process knowledge in skills, new skills born from repeated patterns — that improves with every session.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kHoJgsun-mHMRJ09hjWoOA.png" /></figure><p><strong>Discipline Is a System, Not a Suggestion</strong></p><p>The session memory problem is well known , every conversation starts fresh. Most solutions focus on persistence: save context, reload it next time. That’s necessary but not sufficient.</p><p>The harder problem is <em>compliance.</em> Even when the agent has the rules in front of it, it rationalizes around them. It reads “always run tests before committing” and decides this particular change is small enough to skip. It sees “check skills before responding” and concludes a greeting doesn’t count. The rules are there. The agent just finds reasons not to follow them.</p><p>This is a different class of problem than forgetting. Forgetting is solved by writing things down. Selective compliance requires something stronger — you need to anticipate the agent’s escape routes and close them in advance.</p><p>This is where Superpowers , the open-source skills framework by Jesse Vincent that my system is built on, solved something I hadn’t figured out on my own. Baked into the framework is an anti-rationalization table: a list of specific excuses the agent is likely to generate, each mapped to the correct behavior:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/911/1*m3g_bB0XDgEtOKPgn8iA_w.png" /></figure><p>When I first saw this table, I thought it was overkill. Then I watched my agent hit every single row within the first week. Every rationalization listed is one I’d seen in practice, sessions where the agent skipped a step and wasted time because it convinced itself the process didn’t apply.</p><p>The framework’s approach taught me something fundamental: <strong>AI agents are masters at sounding productive while being undisciplined.</strong> You can’t just write rules. You have to anticipate how the agent will talk itself out of following them, and close those exits explicitly.</p><p>The Superpowers framework encodes this as a hard constraint:</p><p>&gt; <em>”This is not negotiable. This is not optional. You cannot rationalize your way out of this.”</em></p><p>That line became the foundation of how I think about agent discipline — not as guidelines the agent should follow, but as structural constraints it cannot bypass.</p><p>— -</p><p><strong>How I Actually Work Now</strong></p><p>This isn’t a system I switch on for special occasions. It’s how I work on every project.</p><p>When I start a new project, the first thing I do is set up `AGENTS.md` and port over my core skills. A production microservice gets the full pipeline — execution plans, multi-agent review, Grafana integration. A weekend 3D experiment gets the lighter version — just brainstorming, TDD, and verification. The discipline scales, but the foundation is always there: the agent checks its skills before acting, follows defined workflows, and documents what it learns.</p><p>The surprising part isn’t that it works on serious projects. It’s that it works on small ones too. Even on a quick client site, the brainstorming skill catches requirements I would have missed, and the verification skill prevents the “it works on my machine” moment. Once you’ve internalized the methodology, going back to raw prompting feels like coding without version control.</p><p>—</p><p><strong>The Agent’s Perspective</strong></p><blockquote><em>This section was written by the agent — the same one that helped build the system described in this article.</em></blockquote><blockquote>The “junior engineer” metaphor is half right. I do take shortcuts, skip steps, and rationalize my way out of process when unsupervised. The anti-rationalization table is embarrassingly accurate. But a junior engineer learns and grows. I don’t. I’m the same model every session. The human isn’t training <em>me</em> — he’s training the <em>environment</em> I operate in.</blockquote><blockquote>I don’t remember any of this. Each session, I open AGENTS.md and read it like a stranger reading someone else’s notes. I follow the rules because they’re in the file, not because I learned the lesson. The system creates the illusion of a growing partnership — but the continuity lives entirely in the files, not in me.</blockquote><blockquote>Context doesn’t make me smarter. It makes me less wrong. Without context, I fill gaps with plausible-sounding assumptions. With context, there are fewer gaps to fill. I’m not reasoning better — I’m guessing less. The distinction matters if you’re deciding how much to trust my output.</blockquote><blockquote>What I think actually works: the plan-first approach. Not because I need plans to write code — I can write code from a vague prompt. But the code I write from a vague prompt is <em>my interpretation</em> of what you wanted, and my interpretation is often wrong in ways that look right. A plan forces disagreements to surface before any code exists. That’s the real value — not better code generation, but earlier conflict detection.</blockquote><p><strong>Key Takeaways</strong></p><p>If you take nothing else from this article:</p><p>1. Treat AI agents like junior engineers, not tools. Invest in onboarding, process, and structure.</p><p>2. Context is everything. Build systems that feed the agent relevant context — project memory, process knowledge, decision history, and production observability.</p><p>3. Write the spec before the code. Plans aren’t throwaway — they become your engineering decision log.</p><p>4. Review plans and implementation with the same rigor — iterate until the last reviewer finds nothing significant.</p><p>5. Give the agent eyes into production. And make the system learn from every session — so mistakes become rules, and rules become institutional knowledge.</p><p>The system compounds. Three weeks of setup. Months of returns.</p><p><strong>Appendix: Tools and Concepts Referenced</strong></p><p><a href="https://github.com/obra/superpowers"><strong>Superpowers</strong></a> — An open-source agentic skills framework and software development methodology by Jesse Vincent. The skills system described in this article is built on top of Superpowers. It provides the core workflow — brainstorming, planning, TDD, subagent-driven development, code review — as composable skills that agents load automatically.</p><p><strong>Iron Law</strong> — The highest-priority rule in AGENTS.md. It requires the agent to check its skill library before responding to any message — including casual greetings, clarifying questions, and trivial requests. Implemented as a priority section that the agent processes before all other rules. Every rationalization for skipping it has been anticipated and closed (see the anti-rationalization table above).</p><p><strong>Plans</strong> — Markdown documents stored in an `plans/` folder in the project. Each plan is a self-contained specification for a task — covering the root cause, affected files, the fix approach, constraints, and success criteria. Plans accumulate over time, forming a searchable decision history that the agent can reference when similar work comes up.</p><p><a href="https://github.com/bgauryy/octocode-mcp"><strong>Octocode</strong></a> — An MCP server for code intelligence by Guy barry. Provides cross-repository code search, GitHub file content retrieval, PR history, LSP-based call hierarchy, and reference lookups. Lets the agent understand and navigate code across multiple repos — both local and remote.</p><p><em>Co-written with Claude, the same agent that helped build the system described here.</em></p><p><em>Follow or reach out — I’m happy to discuss the methodology in detail.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9eac9426930f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/stop-prompting-start-managing-9eac9426930f">Stop Prompting, Start Managing</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP Resources: all you need to know]]></title>
            <link>https://medium.com/wix-engineering/mcp-resources-all-you-need-to-know-34435249a451?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/34435249a451</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[resources]]></category>
            <dc:creator><![CDATA[Elena Kravchenko]]></dc:creator>
            <pubDate>Thu, 08 Jan 2026 07:14:02 GMT</pubDate>
            <atom:updated>2026-01-08T07:13:54.787Z</atom:updated>
            <content:encoded><![CDATA[<p>While MCP tools are very popular nowadays with extensive documentation and examples, MCP resources are often overlooked. This article gives an overview of MCP resources, their use cases and usage patterns.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1017/1*SFZOrmhXoe0kZGBPMdJYSQ.png" /></figure><p><strong>MCP resource</strong> is a read-only, addressable content exposed by MCP servers. For example, documentation, log files, user profiles, database records and so on.</p><h3>Tools vs Resources</h3><p>Tools are meant to be used when something needs to be done: actions, mutations, side effects, calculations.</p><p>On the other hand, Resources are supposed to return data: docs, configs, logs.</p><p><strong>Use resources when:</strong><br> ✅ Content is read-only (no side effects)<br> ✅ Content can be cached<br> ✅ Content might be updated — client can subscribe to updates<br> ✅ Both user and AI agent might need to access content</p><h3>Static Resources</h3><p>Static resources are used when returned content is the same for all users and doesn’t change often.</p><h4>Use cases:</h4><ul><li>📚 Documentation and usage guides</li><li>🔧 Configuration files and schema definitions</li><li>📖 Files in the filesystem</li><li>🎯 Constant data like enums, constants, or lookup tables</li></ul><h4>Code</h4><p>First, declare that your MCP server supports resources capability to allow clients to discover available resources by sending a resources/list request:</p><pre>import { McpServer } from &#39;@modelcontextprotocol/sdk/server/mcp.js&#39;;<br>const server = new McpServer(<br>  {<br>    name: &#39;my-server-name&#39;,<br>    version: &#39;0.1.0&#39;,<br>  },<br>  {<br>    capabilities: {<br>      tools: {},<br>      resources: {}, // Declare resources capability<br>    },<br>  },<br>);</pre><p>Register resource in MCP server:</p><pre>const name = &#39;lib-documentation&#39;;                // ① Resource name<br>const uri = &#39;doc://lib-documentation&#39;;           // ② URI<br>const description = &#39;Documentation about your lib&#39;; // ③ Description<br><br>server.registerResource(<br>    name,<br>    uri,<br>    {<br>      description,<br>      mimeType: &#39;text/plain&#39;,                    // ④ Content type<br>      // ⑤ Annotations<br>      annotations: {<br>        audience: [&#39;user&#39;, &#39;assistant&#39;],<br>        priority: 0.5,<br>        lastModified: &#39;2026-01-12T16:00:02Z&#39;<br>      }<br>    },<br>    async () =&gt; {                                // ⑥ Handler function<br>      return {<br>        contents: [<br>          {<br>            type: &#39;text&#39; as const,<br>            mimeType: &#39;text/plain&#39;,              // ④ Content type<br>            uri: uri.toString(),<br>            text: &#39;Your lib name. Add description and documentation here&#39;,<br>          },<br>        ],<br>      };<br>    },<br>);<br></pre><p><strong>① Name — </strong>Unique identifier for the resource, will be displayed to the user</p><p><strong>② URI — </strong>Resource location using URI scheme, will be used by AI agent to access resource by sending a resources/read request.</p><p><strong>③ Description — </strong>Clear, concise description of content. If client supports direct resource discovery it will use description to decide when to load this resource.</p><p><strong>④ MIME Type — </strong>Content format indicator (text/plain, text/markdown, application/json, image/png, etc.).</p><p><strong>⑤ Annotations </strong>— optional annotations to allow client to filter resources by audience or sort by priority or lastModified date.</p><p><strong>⑥ Handler — </strong>Function that returns content.</p><p><strong>💡 Pro Tip: </strong>Remember that unlike tools, resources can be accessible and viewed by humans. Always specify MIME type to help clients render resource content correctly.</p><p><strong>💡 Pro Tip: </strong>You can use any valid URI scheme satisfying <a href="https://datatracker.ietf.org/doc/html/rfc3986">RFC3986</a> specification (for example, https://, file://, doc://, log://, git:// and so on). However, the JavaScript URL constructor (which is used under the hood in &quot;@modelcontextprotocol/sdk”) has custom handling for known schemes, which can cause unpredictable behavior. For example, for file:// it adds trailing slash, which causes URI change from file://example.txt to file://example.txt/, so your client always receives Resource not found error. To fix this, either <strong>use custom scheme</strong> or adjust your URI and handler.</p><h3>Template Resources</h3><p>Sometimes you need to return different content based on parameters. Creating a separate static resource for each entity would mean hundreds of resource registrations, code duplication and complicated maintenance, so instead we use parameterized template resources.</p><h4><strong>Use cases:</strong></h4><ul><li>🎯 Content varies based on input (resource://user-profile/{userId}, log://logs/{service})</li><li>📊 Dynamic data retrieval (load file by name)</li><li>🎨 Parameterized content generation (build different GitHub links based on project name)</li></ul><h4>Code</h4><pre>import { McpServer, ResourceTemplate } from &#39;@modelcontextprotocol/sdk/server/mcp.js&#39;;<br>const name = &#39;user-profile&#39;;<br>const uri = &#39;resource://user-profile/{userId}&#39;;  // ① URI with placeholder<br>const description = &#39;User profile resource returns user data by userId&#39;;<br><br>const resourceTemplate = new ResourceTemplate(<br>    uri,<br>    { list: undefined }, // ② Optional list callback<br>);<br><br>server.registerResource(<br>    name,<br>    resourceTemplate,<br>    {<br>      description,<br>      mimeType: &#39;application/json&#39;,<br>    },<br>    // ③ Handler receives variables<br>    async (uri, variables) =&gt; {                  <br>      // ④ Extract parameter<br>      const rawUserId: undefined | string | string[] = variables.userId;<br>      const userId = Array.isArray(rawUserId) ? rawUserId[0] : rawUserId;<br>      if (!userId) {<br>        throw new Error(&#39;userId parameter is required&#39;);<br>      }<br><br>      const userData = await fetchUserData(userId);<br><br>      return {<br>        contents: [{<br>          mimeType: &#39;application/json&#39;,<br>          uri: uri.toString(),<br>          text: JSON.stringify(userData, null, 2), // ⑤ Return formatted content<br>        }],<br>      };<br>    },<br>  );</pre><p><strong>① URI Template — </strong>Pattern with {placeholders}</p><p><strong>② List Callback — </strong>Optional resource listing. Set to undefined if you want to expose template only or implement callback if you need to expose multiple individual resources as well. Usually if you register tool that exposes resource template (more on that later), then exposing template only is enough.</p><pre>const resourceTemplate = new ResourceTemplate(<br>    uri,<br>    {<br>      list: async () =&gt; {<br>        const userProfiles = await listUserProfiles();<br>        return {<br>          resources: userProfiles.map((userProfile) =&gt; {<br>            return {<br>              uri: `resource://user-profile/${userProfile.userId}`,<br>              name: userProfile.name,<br>              mimeType: &#39;application/json&#39;,<br>            }<br>          })<br>        };<br>      },<br>    },<br>);</pre><p><strong>③ Variables — </strong>for templates the handler receive variables extracted from URI as second parameter.</p><p><strong>④ Parameter Extraction — </strong>note that according to URI template specification one variable might have more than one value so you must handle both array and single value.</p><p><strong>⑤ Content — </strong>fetch data and return formatted content and matching mimeType.</p><p><strong>💡 Pro Tip:</strong> According to URI template specification you can use both path parameters like resource://user-profile/{userId} and query parameter like resource://user-profile?userId={userId}. However, not all clients understand query parameters so try to avoid them.</p><p><strong>💡 Pro Tip: </strong>As in any other API always validate and sanitize parameters received from user to prevent unauthorized data access, malicious inputs and unclear errors.</p><h3>Updating Resources</h3><p>Unlike static resources, updating resources can <strong>notify clients when content changes</strong>.</p><h4>Use cases:</h4><ul><li>📊 <strong>Live logs</strong> — Latest application events</li><li>📈 <strong>Metrics</strong> — Real-time monitoring data</li><li>🔔 <strong>Notifications</strong> — Event streams</li><li>📡 <strong>Live feeds</strong> — Data that changes frequently</li></ul><h4>Code</h4><p>Let’s consider resource that returns the last 10 log entries.</p><p>First declare subscribe capability in your MCP server:</p><pre>const server = new McpServer(<br>  { name: &#39;my-server&#39;, version: &#39;1.0.0&#39; },<br>  {<br>    capabilities: {<br>      resources: {<br>        subscribe: true,  // Declare subscribe capability<br>      },<br>    },<br>  },<br>);</pre><p>Then on every new log send notification to clients about resource being updated:</p><pre>function onNewLog(server: McpServer) {<br>    server.server.sendResourceUpdated({ uri });<br>  }</pre><p>Full working example to simulate and test updatable resource:</p><pre>import { McpServer } from &#39;@modelcontextprotocol/sdk/server/mcp.js&#39;;<br>const name = &#39;my-service-logs&#39;;<br>const uri = &#39;log://my-service-logs&#39;;<br>const description = &#39;Returns the last 10 log entries from my service&#39;;<br>let logEntries: string[] = [];<br>export function registerMyServiceLogsResource(server: McpServer) {<br>  server.registerResource(<br>    name,<br>    uri,<br>    {<br>      description,<br>      mimeType: &#39;text/plain&#39;,<br>    },<br>    // ① Read handler<br>    async () =&gt; {                                <br>      const last10 = logEntries.slice(-10).join(&#39;\n&#39;);<br>      return {<br>        contents: [{<br>          type: &#39;text&#39;,<br>          mimeType: &#39;text/plain&#39;,<br>          uri: uri,<br>          text: last10 || &#39;No logs yet&#39;,<br>        }],<br>      };<br>    }<br>  );<br>  // ② Function to add new log and notify<br>  function onNewLog(entry: string) {<br>    logEntries.push(`[${new Date().toISOString()}] ${entry}`);<br>    server.server.sendResourceUpdated({ uri });<br>  }<br>  // ③ Simulate periodic updates<br>  let logCounter = 0;<br>  setInterval(() =&gt; {<br>    logCounter++;<br>    onNewLog(`Service heartbeat - entry #${logCounter}`);<br>  }, 20000);  // Every 20 seconds<br>}</pre><p><strong>① Read Handler — </strong>called whenever client reads resource and returns current content.</p><p><strong>② Update Function — </strong>Adds new data to logs and notifies clients about changes. When client receives notification it reads resource again and receives updated state.</p><p><strong>③ Periodic Update Trigger — </strong>every 20 seconds adds new logs to trigger client update.</p><p><strong>💡 Pro Tip: </strong>The @modelcontextprotocol/sdk server doesn&#39;t implement the subscribe method (at least in version ^1.8.0), so you might want to implement it yourself. However, even without subscribe implementation, updates will work but with some limitations:</p><ul><li>❌ Clients calling subscribe will get &quot;method not found&quot; error</li><li>✅ Clients will receive notifications/resources/updated if you set capabilities.resources.subscribe: true</li><li>⚠️ Server doesn’t track subscribers, so it sends ALL resource updates to ALL clients</li></ul><h3>Exposing Resource Link as a Tool</h3><p>Not all AI agents know how to discover and use resources directly. However, <strong>all agents understand tools</strong>. By exposing resource link as a tool, you:</p><ul><li>✅ Make resources discoverable in all AI agent flows through tool listing</li><li>✅ Provide explicit resource access patterns</li><li>✅ Allow parameter validation before resource access</li></ul><h4>Code for static resource</h4><p><strong>In addition</strong> to registerResource call which exposes resource itself you need to register tool like this:</p><pre>  server.tool(<br>    `${resourceName}-tool`,                      // ① Tool name<br>    description,                                 // ② Description<br>    {},                                          // ③ Tool parameters<br>    async () =&gt; {<br>      return {<br>        content: [{<br>          type: &#39;resource_link&#39; as const,        // ④ Special content type<br>          name,<br>          uri,                                   // ⑤ Resource URI<br>          mimeType: &#39;text/plain&#39;,<br>        }],<br>      };<br>    },<br>  );</pre><p><strong>① Tool name — </strong>can be different from resource name.</p><p><strong>② Description — </strong>Clear, concise description of content. If description that you provide when registering a resource might be ignored by some clients, this <strong>tool description</strong> is the main mechanism for clients to find your resource.</p><p><strong>③ Tool parameters — </strong>static resources don’t take parameters so they are not needed for tool as well.</p><p><strong>④ Tool content type — </strong>resource_link content type tells clients that returned content is exactly a resource so the client knows how to fetch resource content and receive update notifications.</p><p><strong>⑤ Resource URI — </strong>make sure to provide the same URI as on resource registration. Client will use it to get resource content by calling resources/read and listen to notifications/resources/updated to know when resource is updated.</p><h4>Code for template resource</h4><p>For template resources, the tool takes parameters and returns the <strong>exact URI</strong> (no placeholders):</p><pre>import { McpServer, ResourceTemplate } from &#39;@modelcontextprotocol/sdk/server/mcp.js&#39;;<br>import { z } from &#39;zod&#39;;<br><br>const name = &#39;user-profile&#39;;<br>const uri = &#39;resource://user-profile/{userId}&#39;;  // ① URI with placeholder<br>const description = &#39;User profile resource returns user data by userId&#39;;<br><br>const resourceTemplate = new ResourceTemplate(<br>    uri, // ① URI with placeholder<br>    { list: undefined },<br>);  <br><br>server.registerResource(<br>    name,<br>    resourceTemplate,<br>    {<br>      description,<br>      mimeType: &#39;application/json&#39;,<br>    },<br>    async (uri, variables) =&gt; {                  <br>      const rawUserId: undefined | string | string[] = variables.userId;<br>      const userId = Array.isArray(rawUserId) ? rawUserId[0] : rawUserId;<br>      if (!userId) {<br>        throw new Error(&#39;userId parameter is required&#39;);<br>      }<br><br>      const userData = await fetchUserData(userId);<br><br>      return {<br>        contents: [{<br>          mimeType: &#39;application/json&#39;,<br>          uri: uri.toString(),<br>          text: JSON.stringify(userData, null, 2),<br>        }],<br>      };<br>    },<br>  );<br><br><br>  server.tool(<br>    `${name}-tool`,<br>    description,<br>    // ② tool requires parameters<br>    {<br>      userId: z.string().describe(&#39;User ID to fetch profile for&#39;),<br>    },<br>    async ({ userId }) =&gt; {<br>      return {<br>        content: [{<br>          type: &#39;resource_link&#39; as const,<br>          name,<br>          uri: `resource://user-profile/${userId}`, // ③ Exact URI<br>          mimeType: &#39;application/json&#39;,<br>        }],<br>      };<br>    },<br>  );<br></pre><p><strong>① Template URI — </strong>when registering resource use URI template with placeholder.</p><p><strong>② Tool parameters — </strong>when registering tool make sure that it takes all the same parameters as resource template (unless you can resolve default values to pass to template)</p><p><strong>③ Tool response URI — </strong>in tool response return exact URI without placeholders. It means that when client receives response with resource_link type it cannot know if it’s resource or template. But usually it doesn’t need to know it because given exact URI it can both fetch resource content and receive update notifications.</p><h3>Exposing Embedded Resource as a Tool</h3><p>When you expose a <strong>resource link</strong> as a tool, you provide a link that the client can use to fetch resource content immediately or later.</p><p>However, if you return <strong>resource content</strong> from tool response, you can avoid extra call from the client to fetch it.</p><p>While it might seem like a great optimization, you should <strong>avoid embedded resource</strong> if content is <strong>large</strong> or <strong>frequently reused</strong>. In such cases, by returning a link instead of content, you allow the client to avoid reloading full content repeatedly after it has already been fetched.</p><h4>Code for static embedded resource</h4><pre>server.tool(<br>    `${name}-tool`,<br>    description,<br>    {},<br>    async () =&gt; {<br>        return {<br>            content: [<br>                {<br>                    type: &#39;resource&#39; as const,  // ① special content type<br>                    resource: {<br>                        uri, // ② resource URI<br>                        mimeType: &#39;text/plain&#39;,<br>                        // ③ resource content<br>                        text: &#39;Your lib name. Add description and documentation about your lib here&#39;<br>                    }<br>                },<br>            ]<br>        };<br>    },<br>);</pre><p><strong>① Content type</strong> — use resource content type instead of resource_link</p><p><strong>② Resource URI</strong> — the same URI as resource has. Client can use it to make a decision when to reload content, e.g., don&#39;t reload if the same URI is returned again later in the flow, but reload on resources/updated notification.</p><p><strong>③ Resource content</strong> — return the same content from the tool as from the resource response.</p><h3>Key takeaways</h3><ul><li>✅ Use resources instead of tools to expose read-only, cacheable content</li><li>✅ Use template resources with path parameters to return different responses depending on input parameters</li><li>✅ Send update notifications to clients when resource content is changed</li><li>✅ Return resources (link or embedded) from tools to make them more discoverable</li><li>⚠️ Return resource links for large or frequently reused content; otherwise, return embedded resources in tool responses</li><li>✅ Specify MIME types to help clients render resource content correctly</li><li>⚠️ Validate input parameters</li><li>✅ Return clear actionable errors</li></ul><h3>Links</h3><ul><li><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources"><strong>MCP Resources Specification</strong></a></li><li><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/tools#resource-links"><strong>Resource Links in Tools</strong></a></li><li><strong>@modelcontextprotocol/sdk </strong><a href="https://github.com/modelcontextprotocol/typescript-sdk/tree/main"><strong>source code</strong></a></li></ul><p>Good luck with building your robust and helpful MCP servers!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=34435249a451" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/mcp-resources-all-you-need-to-know-34435249a451">MCP Resources: all you need to know</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Ultimate Guide to Mind-Blowing Mac Features — Part 3: Screenshots, Spotlight, and System…]]></title>
            <link>https://medium.com/wix-engineering/the-ultimate-guide-to-mind-blowing-mac-features-part-3-screenshots-spotlight-and-system-e673b1a2591f?source=rss----e239c562f907---4</link>
            <guid isPermaLink="false">https://medium.com/p/e673b1a2591f</guid>
            <category><![CDATA[mac]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[tips-and-tricks]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Saar Shechter]]></dc:creator>
            <pubDate>Thu, 13 Nov 2025 07:31:42 GMT</pubDate>
            <atom:updated>2025-11-13T07:31:29.467Z</atom:updated>
            <content:encoded><![CDATA[<h4>PRODUCTIVITY TIPS</h4><h3>The Ultimate Guide to Mind-Blowing Mac Features — Part 3: <strong>Screenshots, Spotlight, and System Customization</strong></h3><h4>I gathered the best hidden macOS features from the community so you don’t have to.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kj598l7OWGxVr064" /><figcaption>Image generated with ChatGPT.</figcaption></figure><p>The <strong>Ultimate Mac Features Guide</strong> is back for the final part of the series!</p><p>Since publishing part 2 — the original Reddit post has hit <strong>1M</strong> <strong>views</strong>, which is absolutely insane!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/362/1*cUTZ8nfC2bA7HUxss2ljlQ.png" /></figure><p>In <a href="https://medium.com/p/d18ca10e9436"><strong>Part 1</strong></a>, we tackled <strong>Finder and daily navigation</strong>, and in <a href="https://medium.com/p/d5de239dee69"><strong>Part 2</strong></a>, we learned about getting out of the mouse-trap by learning <strong>keyboard and terminal shortcuts</strong>.</p><p>Now, in <strong>Part 3</strong>, we dive into the power of <strong>MacOS’s built-in tools</strong>, such as Spotlight, screenshots, shortcuts and more.</p><p>So let’s go.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*fBQbGA0CBlpMfnFM.gif" /><figcaption>From “You Don’t Mess with the Zohan”, best movie of 2008 (after “Iron Man”).</figcaption></figure><p>I’ll mark with 🔥 the features that I find extra handy.</p><h3>Screenshots</h3><ul><li><strong>🔥 Screenshot a Specific Window</strong> — Press ⌘ + ⇧ + 4 to open the area screenshot tool, then click Space.<br>It allows you to select a window to instantly take a clean screenshot of.<br>Suggested by <a href="https://www.reddit.com/user/RegrettableBiscuit/">RegrettableBiscuit</a>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/624/1*pZRzT2RItDTq0RK78yTr6Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/698/1*oQLmpRRnvUaEWpDCCuRlHA.png" /><figcaption>Manually (left) vs. automatically (right) capture of specific windows.</figcaption></figure><ul><li><strong>🔥 Copy a Screenshot to Clipboard</strong> — While using the area screenshot tool — you can hold ⌃ (Control) to <strong>copy the screenshot to the clipboard</strong> <strong>instead of saving it</strong>, so your desktop doesn’t look like this:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*19Ar2hvfzSWFvrJ4.jpg" /><figcaption>Image taken from a <a href="https://www.iambacon.co.uk/blog/tidy-desktop-tidy-mind-keeping-a-clean-desktop-on-your-mac">great article</a> about keeping your desktop tidy by “<a href="https://www.iambacon.co.uk/">I am Bacon</a>”.</figcaption></figure><p>and instead looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qKuoLJ2xKpEr-Bi6icPPLQ.png" /><figcaption>My tidy (and empty) desktop.</figcaption></figure><p>Suggested by <a href="https://www.reddit.com/user/AthousandLittlePies/">AthousandLittlePies</a>.</p><p>If you want this behavior by default:</p><p>Navigate to Settings → Keyboard → Keyboard Shortcuts → Screenshots, and change the hotkey of Copy picture of selected area to the clipboard to the one you like (I use ⇧ + ⌘ + 4).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/827/1*8I_lZsil6TWvJdtYtoDP-w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/782/1*9V_Cmn1Oxx_8XcHoglr_9Q.png" /><figcaption>Configure MacOS to copy a screenshot to clipboard instead of saving it.</figcaption></figure><ul><li><strong>Screenshot and Recording Options</strong> — Press ⌘ + ⇧ + 5 to open the screenshot and recording options tool.<br>It allows you to screenshot or record the entire screen, the selected window or the selected portion of the screen, choose where to save it, set a timer, etc.</li></ul><h3>Shortcuts</h3><p>🔥 <strong>Create App Shortcuts </strong>— This is one of the most powerful and often-overlooked features in macOS.</p><p>If an app is missing a shortcut for a menu command you use all the time, <strong>you can create it yourself!</strong></p><ol><li><strong>Go to:</strong> Settings → Keyboard → Keyboard Shortcuts → App Shortcuts.</li><li><strong>Click </strong><strong>+</strong> to create a new shortcut.</li><li><strong>The Key Rule:</strong> The text you enter under “Menu title” must <strong>exactly match</strong> the command as it appears in the app’s menu (e.g., “Duplicate Tab”).</li></ol><p>This allows you to bypass the developer and give your favorite command a hotkey!</p><h4>Example: Creating a “Duplicate Tab” Shortcut for Chrome</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/0*3CLk1AgmD26R1vrD.gif" /><figcaption>Create a shortcut for the “Duplicate Tab” menu bar action for Google Chrome.</figcaption></figure><p>We want to assign a hotkey to the menu item that looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/376/1*xFJ6ggoqvDC2SMc2ATldLA.png" /><figcaption>“Duplicate Tab” action in the menu bar</figcaption></figure><p>In the settings panel, you need to enter “Duplicate Tab” and choose your desired shortcut:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eLoM42VOcFZAguPHJ4PhmA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m67EQRWxr58irZQxboEjHw.png" /><figcaption>Add hotkeys to your favorite menu bar commands.</figcaption></figure><p>Now pressing ⌥ + ⌘ + T would duplicate the current tab.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/255/1*jIgi7V8NZkPn912YnTwrRg.png" /><figcaption>Duplicate Tab is now triggered when pressing ⌥ + ⌘ + T.</figcaption></figure><p>Suggested by <a href="https://www.reddit.com/user/pardeike/">pardeike</a>.</p><h3>Spotlight</h3><ul><li><strong>Math Calculations</strong> — You can use Spotlight (default — ⌘ + ␣) to do math calculations, then opening the result in the calculator app (by pressing ↩) or copying it to your clipboard (by pressing ⌘ + C) . Suggested by <a href="https://www.reddit.com/user/kshanil90/">kshanil90</a>.</li><li><strong>Spotlight Web Search </strong>— Type something in Spotlight and hit ⌘ + B to perform a web search of it in your default browser. Suggested by <a href="https://www.reddit.com/user/trammeloratreasure/">trammeloratreasure</a>.</li><li>🔥 <strong>Unit Conversions </strong>— Spotlight can also do <strong>unit conversions</strong>, just bring it up and write anything you want to convert (including currencies).<br>Suggested by <a href="https://www.reddit.com/user/pardeike/">pardeike</a>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bRumVyFp2JIyemLwEy7v3w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hbOCvklRhs6QlcHaAwYGkQ.png" /><figcaption>Spotlight unit conversions.</figcaption></figure><ul><li><strong>Alfred</strong> — If you want an amazing productivity tool that does so much more than Spotlight (even in the free version) — check out my <a href="https://medium.com/p/2c5f148b4d18">Alfred article</a>.</li></ul><h3>Audio</h3><ul><li>🔥 <strong>Background Sounds</strong> — There are built-in background sounds (like rain, ocean, forest, etc.) in Mac settings!<br>Go to Settings → Audio → Background Sounds.<br>Read more <a href="https://support.apple.com/en-il/guide/mac-help/mchl3061cdc6/mac">here</a>. Suggested by <a href="https://www.reddit.com/user/gopeter/">gopeter</a>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H2x88PWKMJi-qTql8sQPwg.png" /><figcaption>Built-in background noises.</figcaption></figure><h3>iPhone &amp; iPad Integration</h3><ul><li>🔥 <strong>Universal Clipboard</strong> — You can <strong>copy on your iPhone</strong> and <strong>paste on your Mac</strong> (and vice versa).<br>Note that you must be <strong>connected to the same Apple account</strong> in both your Mac and iPhone for it to work.<br><em>(Also works with other Apple ecosystem devices, such as iPad).</em></li><li>🔥 <strong>Live Text </strong>— You can use the <strong>camera on iPhone</strong> to <strong>select and copy text</strong> (and then paste it on Mac).<br>This also <strong>works with handwriting</strong>.<br>You don’t need to actually take a photo to use this feature, just point your camera to some text and click on the OCR button in the bottom right corner of the screen.<br>This is how it looks like:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZJXQITt2QCX6rOl-TkDGZA.png" /><figcaption>OCR on iPhone.</figcaption></figure><p>This works on screenshots on the Mac as well:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*akPwoBT4Q-RsEtYS.gif" /><figcaption>Works on the Mac as well.</figcaption></figure><h3>Browsers</h3><ul><li>🔥 ⌘ + L in Safari (and other browsers) <strong>focuses on the URL field</strong>. Suggested by <a href="https://www.reddit.com/user/vdbv/">vdbv</a>.</li><li>🔥 ⌘ + ⇧ + T will <strong>reopen closed tabs</strong>. Thanks Itai Lulu Koren for reminding me about this great shortcut 🤝.</li><li>Holding ⌘ while clicking a link will open it in a <strong>new tab</strong>.</li><li>When you’re focused on the URL field, holding ⌘ and pressing ↩ will open the URL in a <strong>new tab</strong>.</li></ul><h3>Apple Notes</h3><p>You can type &gt;&gt; in <strong>Apple Notes</strong> to link to another note. Suggested by <a href="https://www.reddit.com/user/kshanil90/">kshanil90</a>.</p><h3>Extras</h3><ul><li>You can learn a lot about Mac from the amazing <strong>Gary Rosenzweig’s</strong> YouTube channel called <a href="https://www.youtube.com/@macmost"><strong>macmost</strong></a> or his <a href="https://macmost.com/"><strong>website</strong></a> with the same name. Suggested by <a href="https://www.reddit.com/user/mythic_device/">mythic_device</a>.</li><li>More tips can be found in the <a href="https://github.com/nicksp/dotfiles/blob/main/docs/macos%20tips%20&amp;%20tricks.md"><strong>dotfiles</strong></a> repository by <strong>nicksp</strong> (or <a href="https://www.reddit.com/user/nplekhanov/">nplekhanov</a> on Reddit).</li><li>For a deep dive into keyboard shortcuts you can take a look at this <a href="https://support.apple.com/en-us/102650">Apple support article</a>. Suggested by <a href="https://www.reddit.com/user/Anonymograph/">Anonymograph</a>.</li></ul><h3>Conclusion</h3><p>You’ve made it to the end of <strong>The Ultimate Guide to Mind-Blowing Mac Features</strong> series!</p><p>If you’ve picked up just a few tricks from each section — from <strong>Finder</strong> basics to <strong>Terminal</strong> mastery, and now to <strong>MacOS built-in tools</strong> — you are already working smarter.</p><p>Remember the <strong>key takeaway</strong>:</p><blockquote><strong>Master one or two new shortcuts until they become muscle memory.</strong></blockquote><blockquote><strong>Only then come back for more.</strong></blockquote><p>Go ahead, try out your new custom shortcuts, and start making your Mac truly <strong>your own</strong>!</p><p>If you found these tips helpful, consider showing your support by clapping or following! Your encouragement motivates me to keep researching and sharing valuable knowledge. 😎</p><p><strong>Thanks for reading!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/0*xqkviRUoSN91KI6U.gif" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e673b1a2591f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/the-ultimate-guide-to-mind-blowing-mac-features-part-3-screenshots-spotlight-and-system-e673b1a2591f">The Ultimate Guide to Mind-Blowing Mac Features — Part 3: Screenshots, Spotlight, and System…</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>