Posts in Ruby (20 found)

Detecting Full Table Scans With SQLite

I’m at RubyConf this week, and it’s great! I recently read that lobste.rs is now running on SQLite . One part from the post caught my attention: I wish we could say in a test, “Fail if you encounter any full table scans”. Which would have caught the perf issues we experienced during the first deploy. SQLite collects information about prepared statements and exposes those statistics though an API . The upshot of this is that we can tell whether a statement did a full table scan after executing the statement without using an . Here’s an example program that demonstrates detecting a query did a full table scan: Feels like we could integrate this in to Rails and warn or raise in test / development. I’m not sure if we’d want to check this all the time in production, but maybe it would be fine?

0 views
マリウス 2 days ago

The Day WhatsApp Goes Dark

Note: As usual, tl;dr at the end. Tomorrow morning, WhatsApp goes dark, and it’s not just a short downtime, but it is a termination of the service. The servers turn off, the domains don’t resolve anymore and no mobile client is able to connect. Have you ever asked yourself what would happen in that case? What if WhatsApp actually went dark? Obviously, nobody really knows what would happen in such a case, because we haven’t experienced that situation (yet), but even though the closest analogues like the six-hour Meta outage in October 2021, and Brazil’s 12-hour court-ordered shutdown in December 2015 were measured in hours, not days, those already produced effects that journalists described as “apocalyptic” . We can try to extrapolate what happened throughout events like those to see what “global catastrophe scenario” could theoretically look like. Because whether you believe it or not, WhatsApp is more than just a messenger , and one example that makes this pretty obvious came from the Forbes editor José Caparroso , who wrote during the 2021 blackout that … Latin America lives on WhatsApp . I am surprised by so many people underestimating how catastrophic this downfall has been. But before we dive into this thought experiment, however, it’s worth establishing what we’re actually talking about, as readers in most of Europe and North America underestimate WhatsApp by an order of magnitude, primarily because in those markets it functions as one platforms among many. That is, however, not how the rest of the planet works. Note: This thought experiment is not only based on some abstract numbers and studies, but upon my own experience of how WhatsApp is being used in e.g. the global south on a day to day basis. During my travels I think I’ve pretty much “seen it all” , with for example broadband technicians taking photos of the stickers on the backside of WiFi routers/modems, that show the hardware address and login credentials (on their phones), and sending them via WhatsApp to themselves, only so they can open them on WhatsApp Web (on their work laptops), in order to upload them into the ISP’s technical service portal. It is frankly mind-boggling what sort of tasks WhatsApp has become a Swiss army knife for in those countries, whether it’s as a file transfer platform for sensitive documents, or as a full-blown hotline for critical services and infrastructure. Let’s start by understanding the sheer scale of WhatsApp . The Meta owned and operated messenger has roughly 3.3 billion monthly active users as of early 2026, which is about 40% of every human alive, and somewhere north of 60% of every human with a smartphone. The platform processes more than 100 billion messages per day , out of which around 7 billion are voice messages. On top of that, users place around 5.5 billion voice calls and 2.4 billion video calls per month , which boils down to more than 2 billion minutes of voice and video traffic every 24 hours. To put this in perspective, the global SMS network, at its peak in 2012, handled about 23 billion messages per day across every carrier on Earth. WhatsApp does four to five times that volume on its own, every day, on a service that is (at least at the consumer layer) “free” . However, if we look deeper into the country-level breakdown, it becomes clear that WhatsApp usage isn’t evenly distributed across the globe. India has between 535 million and 596 million monthly active users , and regardless of whether we pick the higher number or we stick with the more conservative estimate, it is the largest single national user base on any messaging platform anywhere. Brazil has about 148 million users, and the app is installed on roughly 99% of the country’s smartphones. And 93% of those users open the app daily . Indonesia has about 112 million users, with WhatsApp being the leading messaging platform in the country, and in Zimbabwe WhatsApp alone accounts for roughly 44–50% of all mobile internet traffic . In Lebanon more than four in five adults use it , making it the dominant communications channel during multiple national crises. In a great many countries, WhatsApp is not simply a service on the internet, it actually is the internet for most practical purposes. WhatsApp Business now has more than 200 million businesses on the platform globally , with around 50 million small and medium-sized enterprises using it as their primary customer channel. In India and Brazil, roughly 80% of small businesses use WhatsApp to communicate with customers. In Brazil specifically, 96% of businesses rate WhatsApp as their primary communication tool, and a joint study by Fundação Getulio Vargas and Sebrae , Brazil’s main small-business support organisation, found that 70% of Brazilian small companies rely on the Meta -owned trinity ( WhatsApp , Instagram , Messenger ) as their marketplace. Globally, around $45 billion in commerce is expected to flow through WhatsApp in 2026 . Click-to-WhatsApp advertisements alone generate roughly $10 billion per year for Meta . About 175 million customers send messages to WhatsApp Business accounts every single day. And then there’s payments. In India, WhatsApp Pay is a small player in the UPI with about 67 million transactions per month against UPI’s 18 billion monthly volume, but in absolute terms, that’s still an enormous number of transactions. In Brazil, WhatsApp Pay is integrated with local card and bank rails and is used by transit operators ( Vai de Bus , for instance, sells passes via WhatsApp ), banks, and merchants. Across Africa, fintech overlays on WhatsApp , like Finnova in Nigeria, or Azza in Nigeria, Kenya, and South Africa, are processing crypto and conventional payments at significant volumes. Besides being a chat platform, a marketplace and a payment processor, WhatsApp is also being used as critical clinical infrastructure across the global south. A three-year programme at UCLA’s David Geffen School of Medicine paired subspecialists in Los Angeles with clinicians at Partners in Hope Medical Center in Lilongwe, Malawi, via WhatsApp groups. 89% of submitting clinicians and 71% of expert respondents reported that the case discussions improved medical education and patient outcomes. In the Eastern Cape of South Africa , WhatsApp groups serve as the primary continuing-medical-education channel for HIV and TB management in rural clinics where specialists are days away. In Haiti, WhatsApp groups coordinate emergency department operations at Hôpital Universitaire de Mirebalais , including mass-casualty alerts, security updates, and clinical decisions. In Zambia, IntraHealth International runs nurse and midwife mentoring networks over WhatsApp . In Brazil, the link between Zika virus infection and microcephaly was tracked partly through WhatsApp groups of paediatricians comparing cases. Another critical field that runs on Meta ’s infrastructure is disaster response. The World Bank documented that during 2014’s Cyclone Hudhud in Andhra Pradesh, India , the Public Works Department restored connectivity to a 1.8-million-person city primarily by coordinating engineers through a closed WhatsApp group with the District Magistrate in it, without any formal meetings and orders, which ultimately led to most roads becoming functional within three to four days. During the 2023 Turkey earthquakes, volunteer-formed WhatsApp networks processed 5,800+ messages in one week for needs assessment and rescue, and in Syria, the White Helmets have run an emergency dispatch system over WhatsApp since 2021, because the country’s emergency number infrastructure is largely destroyed and WhatsApp ’s compression algorithms work where almost nothing else does. It’s not just individual organisations, but even whole governments are dependent on Meta . Buenos Aires for example ran a COVID-symptom triage chatbot on WhatsApp , and Lebanon’s public health ministry launched an automated WhatsApp service in April 2020 to disseminate updates on the pandemic. India, on the other hand, offers metro tickets, government services, and bill payments through WhatsApp chat interfaces . On top of that, for example, the Philippines’ UAE consulate operates consular emergency hotlines on, you guessed it, WhatsApp . Last but not least, there’s migration. Roughly a quarter-billion people live outside their country of birth. Most of them use WhatsApp as their primary connection to family, because international SMS is expensive and unreliable and Skype is, well, dead. Multiple peer-reviewed studies on Trinidadian , Pakistani, Ghanaian , Polish, and Kenyan diasporas also converge on the same finding of WhatsApp being the primary technology of transnational family life in 2026. So to go back to our initial thought, let’s imagine WhatsApp shutting down in an instant, with this dependency graph in mind. What follows is a hypothetical scenario sketched from the documented impacts of past (shorter) outages, scaled up by the duration and finality of the event, and informed by the dependency layers described above. It’s a scenario and not an actual prediction. The shutdown hits during European afternoon, which means American morning, Indian evening, East African afternoon, and Indonesian late evening. The first signals show up on Downdetector and on non- Meta competitors. In 2021, the six-hour outage generated 14 million reports inside the first few hours, but this time the number is likely much larger. Behaviour inside the first hour is uneven and largely confused. In most places, users assume it’s a routing problem, a local carrier issue, or a phone bug. They restart the app, then their phone, then their router, then they check Twitter X , Instagram , TikTok , Telegram , maybe Signal , or Facebook Messenger , depending on what they have installed. Telegram and Signal both see app-store download spikes within the first 30 minutes, as it happened during the 2021 outage, with Signal reportedly adding “millions” of users that day . The first noticeable failures show up in commerce. A food-truck operator in São Paulo who takes orders via WhatsApp can no longer receive them. A small clothing brand in Mumbai whose entire sales pipeline runs through Click-to-WhatsApp advertisements sees its ad spend continuing to bill while the conversation endpoint returns errors. In Hong Kong, a logistics coordinator who confirms container pickups via WhatsApp loses the day’s confirmation chain. In Idlib, Syria, the White Helmets dispatch room realises within minutes that emergency calls are not coming in, and civilians have no fallback channel. It is likely that three things start happening in parallel. First, mass migration to apps like Telegram , Signal , and to a lesser extent Messages ( iMessage ), Viber , and Line . Signal ’s servers, which are run on a fraction of WhatsApp ’s infrastructure, are not designed for an inrush of hundreds of millions of new accounts and start to degrade in some regions. Telegram , which has spent a decade preparing for exactly this scenario, holds up better but still struggles with its own issues. Ultimately none of the alternatives are suitable for the people who had built their workflows on WhatsApp . The second thing that happens is commercial collapse , which is the biggest 12-hour story, but still largely invisible from Western media. In Brazil, Indonesia, Nigeria, India, Pakistan, Bangladesh, Vietnam, Mexico, and probably 50 other countries, the small businesses that route everything from orders and prices, and photos of goods, to delivery confirmations, and payments, through WhatsApp have lost their primary revenue channel. A clothing brand in Ireland reportedly lost thousands of euros in a single afternoon during the 2021 six-hour outage. Multiply this by twelve hours and by the entire tail of informal commerce that lives on the platform and the figure runs into the billions. The third thing is health-system stress . Group consults that normally take an hour over WhatsApp become almost impossible. The Eastern Cape HIV-management network in South Africa, the Malawi-UCLA clinical link, the Haitian ED coordination groups, the Zambian rural-nurse mentoring channels, all degrade simultaneously, and while mortality consequences are not yet visible, they are happening nonetheless. In several countries, government officials begin issuing statements through whatever channel is still functioning. After the first 24 hours it becomes clear that the impact this situation has is roughly inversely proportional to a country’s investment in alternative digital infrastructure. The United States and Western Europe are mildly inconvenienced, and India is moderately disrupted, mainly because the country has built duplicate rails, hence UPI runs over many apps. After all, SMS still works, alternative payment apps exist, and government services have their own portals. However, countries like Brazil, Argentina, Mexico, and most of sub-Saharan Africa, on the other hand, are in serious trouble. In Brazil, by the end of day one, the financial press is comparing the situation to a partial shutdown of the national payments system. Pix transfers still work, as those run over the central bank’s infrastructure and not WhatsApp ’s, but the merchant-customer communication layer that drives Pix transactions for millions of small operators is offline. The same is true in Argentina, where the inflation-driven culture of constant price renegotiation between vendors and customers happens, in practice, almost entirely on WhatsApp . Another area that starts to fail is migrant remittance. People working in the Gulf, North America, or Europe typically coordinate transfers with their families via WhatsApp , where they confirm the recipient’s details, send screenshots of receipts, or sometimes route the money through informal Hawala -style networks where trust is established and maintained by daily messaging. These workflows don’t fail completely on day one, but they slow and break in ways that don’t show up in formal remittance statistics for another week or two. In Latin America, the first major political consequence appears in the form of misinformation that previously circulated within closed WhatsApp groups , which now has nowhere to go and starts spilling onto other platforms. By the end of day one, more than 100 million people have created Signal or Telegram accounts. Both apps experience their first significant performance degradation events. The labour-market consequences start showing up. In India, where WhatsApp is the de facto recruiting and onboarding tool for huge segments of the informal economy, gig workers can’t be reached for shifts. Delivery platforms like Swiggy , Zomato , Dunzo , and their international equivalents, see their dispatch coordination degrade. Some of these companies have parallel in-app messaging, but many have leaned hard on WhatsApp because it was cheaper. Schools also begin to feel it, because in many countries, including India, Brazil, South Africa, Kenya, Nigeria, the Philippines, Indonesia, and much of the Middle East, parent-teacher communication runs over WhatsApp groups. Two days in, schools that have not made the switch to other channels are operating partially blind, and parents are not getting closure notifications, transport updates, fee reminders, or exam schedule changes. In countries with weak alternative communication infrastructure, the second-order effect is mid-week absenteeism as parents simply don’t know whether school is open. On top of it all, Healthcare is also heavily impacted. For example, the Haiti emergency-department-style coordination groups have now had 48 hours to find alternatives, and they have, mostly, but the transition has costs. Case discussions that were asynchronous and 24/7 on WhatsApp are now synchronous and harder to schedule, and rural clinicians in places like the Eastern Cape, Lilongwe, or the highlands of Nepal are once again practising in the relative isolation that WhatsApp ’s group-call and group-message features had alleviated. In several documented studies, isolation correlates with diagnostic delays and worse patient outcomes. In Syria, the White Helmets switch to a patchwork of Signal , SMS where it works, and physical runners, and response times degrade significantly. At this point things start to get political. In a number of countries, including Brazil, India, Indonesia, Nigeria, the Philippines, and South Africa, the question stops being “what is Meta doing” and starts being “why did we let one foreign company become this central” . Telecom operators in several countries pitch the moment as an opportunity to push their own messaging products, most of which have been moribund since 2014, but the pitches fail because nobody trusts the carriers, because those carriers have been quietly delighted to see WhatsApp gone, given that it eroded their SMS and voice revenue for a decade. In a few markets, regulators float emergency-decree-style proposals to nationalise messaging infrastructure or build sovereign alternatives. And while most of these proposals are clearly performative, some are not. India and Brazil both have working national digital identity and payments stacks that could, in principle, host a public messaging layer. It remains to be seen, though, whether the political will to build one persists past the first month. Public health authorities in Lebanon, Buenos Aires, the Philippines, and several African countries are now running emergency communication operations across multiple fallback channels. None of them work as well as WhatsApp did and things like vaccination schedules are missed, and appointment reminders fail. Some clinics see patient no-show rates rise by 30–40% versus baseline. Not because WhatsApp is superior to its competitors, but simply because humans need a long time to adjust to the alternatives that are being put in place. Also, crime patterns shift in interesting ways. A Conflict Sensitivity Resource Facility report on South Sudan, and PeaceRep work on Somalia, both documented that WhatsApp groups were used for both peace-building and for coordinating violence. Removing the platform doesn’t remove either function, as both migrate to other channels, but the migration takes time, and during the transition, coordination of all kinds becomes harder. In several markets, online ad spend collapses because Click-to-WhatsApp ads (a $10B/year business) have no destination, and Meta ’s stock price has already done what you’d expect it to do. The migration to alternatives, mostly Telegram and Signal , with regional pockets going to Line , KakaoTalk , WeChat , Messages ( iMessage ), RCS , and a long tail of smaller apps, has now hit critical mass in most of the world. The migration has not been clean, and group chats with over 200 members have, in practice, often migrated as group chats with around 40 members, because not everyone moved at the same time or to the same app. For business communication, the new world is as fragmented as it gets. A Brazilian shopkeeper who used to take all orders on WhatsApp now has to manage Telegram , Signal , Instagram DMs (still up, but reduced after Meta ’s reputational damage), and SMS. Customer-acquisition costs rise, and customer-retention drops, and several reporters publish stories on small businesses that have permanently closed. For healthcare, the migration is more orderly because the user base is smaller and more motivated. Most major peer-support networks, like the Malawi-UCLA , the Eastern Cape HIV , the Zambia nursing , and the Haiti emergency have stable new homes. The five-day disruption produced measurable degradation, and it is not yet possible to quantify the mortality and morbidity impact. In Syria, the White Helmets have built a partial replacement on Signal and on a custom dispatching tool that their engineers had been prototyping. It works less well than what they had, because the compression behaviour that made WhatsApp viable in low-bandwidth, intermittently-connected environments is hard to replicate. Hence, some dispatches are now arriving via paper notes. Not because decentralized mesh networks don’t exist, but simply because nobody in these organizations has the expertise to implement these alternatives, especially within such a short period of time. The first credible economic estimates of the shutdown’s cost reach the tens of billions of dollars and continue to rise. The estimates are dominated by long-tail effects in emerging markets that are hard to measure precisely. A week in, the question has shifted from “When does WhatsApp come back?” to “What does the world look like without it?” and a growing fraction of the user base assumes it isn’t coming back, so behaviour begins adapting accordingly. Several governments, including Brazil, India, and the EU as a bloc, have announced formal investigations or task forces into how to prevent this from happening again. As usual, however, none of them will produce anything actionable within years. The longer-term effects, that you can already see the shape of by day seven are a measurable productivity hit in emerging markets, particularly for informal-sector businesses, a consumer trust impact across the entire Meta product family, a wave of WhatsApp-replacement startups, most of which will fail due to network effects and generally bad engineering, and the painful realisation that a free product is not the same thing as a public good. Some estimates from prior outage studies suggest that a six-hour WhatsApp outage cost the global economy hundreds of millions of dollars per hour in lost SME activity, weighted heavily toward Latin America, South Asia, and Africa. Extrapolated over seven days and weighted for cascading effects, the seven-day damage is in the tens of billions, possibly higher. This thought experiment is not about Meta eventually shutting down WhatsApp , as it almost certainly won’t do so on its own, given how big of a lever the platform is for the company. In fact, Meta is moving in the opposite direction, as it is building WhatsApp Business into a $45 billion commerce platform, integrating it with payments, and turning ads into one of its fastest-growing revenue lines. WhatsApp is too valuable to Meta to switch off voluntarily, and the regulatory regimes in the countries that depend on it most are nowhere near coordinated enough to force a switch away from it or even just ban it outright. The point is that we have built a planet-spanning piece of communication infrastructure whose ownership, governance, and continuity are concentrated in a single American corporation, that is led by people with questionable values and beliefs, which all in all is a state of affairs that has no historical precedent. Sure, there are other US-based companies that “own digital communications” , like Twitter X and many others, albeit I’d argue that none of those platforms are so engrained into everyday life across many (predominantly developing) nations as WhatsApp is today. The closest analogue in scale is the global SMS network of the early 2000s, which, however, was federated, run by hundreds of carriers and governed by an open standard (GSM/3GPP). SMS was never under the unilateral control of any single entity, despite many carries enjoying a defacto monopoly in their respective home markets. WhatsApp , on the other hand, is a single proprietary protocol, with a single operator, optimised increasingly for the commercial interests of that operator, and treated by the rest of the world (governments, hospitals, schools, small businesses, families separated by borders) as a public utility. The seven-day scenario above is an exercise in realising this dependency. Meta has no public-service mandate and WhatsApp ’s terms of service explicitly disclaim any commitment to availability. Yet a meaningful fraction of the medical communication, emergency coordination, family contact, and small-business activity of the global south runs on top of this disclaimed-availability infrastructure. At this point the LinkedIn thought-leadership crowd would tell you the answer is “diversification” or “resilience” or “multi-channel strategy” and add an inspirational quote alongside the ChatGPT -inserted emojis. Telling a Karachi tailor with 14 customers in a WhatsApp group to “diversify their customer-communication stack” does nothing to solve the problem. The infrastructure they depend on was built and made free at the point of use by a corporation that calculated, correctly, that owning that infrastructure was worth more than charging for it. The bill is paid in attention, in advertising, in data, and in the asymmetric power Meta now holds over a substantial fraction of global communication. While the shutdown will (sadly) not happen any time soon, the dependency, however, exists, and the thought experiment is worth running occasionally (with other services as well… looking at you, Google Mail !) because this exact dependency is what should push us to look for alternatives, and not the implausible event that would make it visible. Network effects may be the biggest drivers for this unhealthy dependency, but I believe that each and every person has the ability to make an impact within their families, their friend-circles and their communities, by choosing to use anything but WhatsApp as their main communications channel, ideally a self-hosted alternative . For almost three decades now we’ve had XMPP available to us, with popular and capable implementations like ejabberd , Prosody , and Snikket existing as open-source software that is ready to be used for communications platforms of any size. As a matter of fact, WhatsApp uses XMPP behind the scenes and is in fact built upon the same great technology stack used by ejabberd . For a “lower-level” alternative, there’s the good ol’ IRC that has been around for almost four decades and that is still thriving . Both of these open standards would allow communities, organisations and even whole governments to build public infrastructure that could in large parts replace WhatsApp . PS: Are you a Jabber user already? Come join the community channel !

0 views
Martin Fowler 3 days ago

Fragments: July 13

Some more of my notes from Thoughtworks Future of Software Development Retreat . When we had our first retreat in Utah early this year, nobody had heard of Harness Engineering . This time we had a whole session on it. When comes to the guide side of harnesses, most of the discussion is about context management. While context windows have increased is size as models get more sophisticated, that doesn’t mean that models will properly focus on the right bits. Models typically only focus attention on part of the context, and to get the best behavior, we need to manage that focus. One attendee keeps their context small, limiting the file to less than 200 lines On the sensor side, we see more attention on computational sensors. Two patterns from one participant was shifting to languages with greater controls, (eg Rust rather than Python) and “leveling up” validation approaches, using more property-based testing and techniques from formal methods. One commented that while they aren’t smart enough to write specifications in a formal specification language, they are smart enough to read it and check it makes sense for their domain. Will our attention on harnesses last long enough for our next retreat? Will the models just get so good that harnesses become unnecessary? Those with some mechanical sympathy for LLMs seem to think not - but are they overly coupled to the current state of technology? I find such speculation tends not to lead anywhere useful, I’ve not seen much success in guessing the future in the past, and with technology as radical as this, I don’t see it being any easier. So for the moment, attention to harnesses pays off. We find it reduces token usage, and also allows weaker models to be useful, supporting such things as local hosting of open-weight models. ❄                ❄ Which naturally segues me to a session on self-hosted models. Increasing token costs have made hosting an open-weight model more attractive, particularly due to the decreasing time for open-weight models to catch up with frontier models. Cost isn’t the only factor, however, many folks find a desire to be independent of the frontier model firms to be the the driving force. After all we’ve seen the U.S. government intervene to deny access to models, increasing the desire for greater model sovereignty. Information security is also something to consider, some attendees just can’t give models necessary data for critical work. Even without that, if someone else hosts the model then their model learns rather than your model. And although recent events have increased interest, several participants worked with companies that had been self-hosting for up to a couple of years. Is this trudging down the same path of self-hosted clouds, which led to lots of folks spending excessive funds on half-arsed private clouds ? The answer hinges upon whether it ends up being simpler to host a model than a cloud, perhaps due to a simpler interaction protocol. The hard part of this may be the talent required to efficiently use the GPUs, managing an inference data center currently isn’t a widely available skill. Even self-hosted models are a cost to operate, capital costs in GPUs, ongoing costs in electricity. The physical design of a data center can affect optimal usage. There’s an opportunity here for professional services firms to help companies manage this. Cost control also involves teaching people to pick the right model for the job. Can we teach engineers, or indeed other users, to pick a less-powerful model? This, of course, could be a job for model itself, acting as a broker, deciding which model is the best choice to tackle certain jobs. Self-hosting may lead to a greater use of fine-tuning. Currently that’s a niche activity, but over time we could well find that models that are fine-tuned to a particular domain need less reasoning, consume less tokens, and thus are cheaper to operate. We are seeing models trained specifically to support programming. As with any topic with this degree of uncertainty, the big win isn’t finding the right answer, but coming up with a strategy that will cope with the inevitable and unpredictable changes. ❄                ❄ After an event like this, many people come up to me and ask me to make some grand summing up. I hate this, because I rarely leave these kinds of event with some grand narrative. Even after mulling on it afterwards (in writing the above notes) I still usually don’t have one, and distrust one that forms, as my skepticism includes attempts to make coherent narratives of an event that’s naturally rather jumbled. However my failings are irrelevant this time, because Kief Morris has put together such a narrative, and it’s a convincing one , even to a narrative-denier like me. The sessions had different titles and different casts, and on the surface they were about different problems. But they weren’t. Nearly every one of them was a different facet of the same argument. How much do we let an agent decide, and how do we stay confident in what it does? He looks at code review, questions whether it matters, but sees that the rigor that many associate with code review shifts to other forms. He describes the disagreements about how much we should trust an agent to identify and fix production incidents. He sees that the contrast between how much leeway teams give to agents depends on the context they are operating Underneath all of these sessions, the operations debate, the wide-remit team, the dark-factory spectrum, the argument about who’s allowed to steer the model, people were making the same handful of choices over and over about a single thing: the unit of work they were prepared to hand to an agent. How big it is. How much of the job it covers. What you do to get it ready to hand over. How you check what comes back. What you put around the agent to keep it inside the lines. Different rooms set those differently, but they were setting the same controls. ❄                ❄ Sam Ruby convened a session called “Bring me a Rock”. The name evokes a particular kind of management dysfunction. The manager tells his underlings to bring him a rock, and then starts rejecting the results without explaining why (“no not that one”, “no not that one”) until eventually one rock matches the unstated expectation. It names a manager who substitutes serial rejection for the work of saying what they want, and makes you pay for their unfinished thinking one rock at a time. Sam had already written why he thought with LLMs, this changed from a slur to a defensible way to work . When its a bunch of tireless machines with endless patience, that return new rocks in minutes rather than days, then an approach like this (using the brainstorming register becomes a defensible way to work. Sam described the discussion : The room pulled it somewhere narrower than I’d framed, and the narrower place was the more interesting one: not how to explore by elimination but who should even be allowed to. Product managers, increasingly people managers, are reaching for these models directly, and seasoned engineers get measurably better results from them than untrained people do — so the worry followed. If expertise is what separates a good outcome from slop, should non-engineers be steering the model at all? It’s a fair question, and I think it’s the wrong one, because it mistakes the act. When a manager reaches for an LLM instead of routing the work to the team that reports to them, they didn’t pick up a tool — they made a hire. And you don’t ask permission to manage your own team; a manager who decides a piece of work is better given to a new participant than to the existing one is doing the most ordinary thing a manager does. Framed that way, the permission question dissolves into an older, better-understood one — the one Drucker named in 1959: when the worker knows more about the specifics than the manager does, you manage by objective, not by method. The non-engineer steering an agent is exactly that manager, out-known by the thing they’re directing, and the slop the room feared is the old danger of managing by method when you should be managing by objective. The question isn’t may they hire? It’s do they know how to manage by objective? — which you can teach, hire for, and hold people to without anyone first becoming an engineer. Sam’s article explores managing an LLM by objective, giving it a goal rather than a task. And Kief’s earlier point about the essence of the discussion still holds: how confident can we be that it’s done the right thing? We can outsource many things, but not the acceptance criteria, at some point there’s a human request and a human judgment on whether that request was properly executed. But the danger lies in important unstated objectives, unstated perhaps because they weren’t even imagined. It’s easy to state objectives around desired functionality. Give me a an application that will examine my emails and form a todo list for today. But behind that simple statement is a thicket of unstated assumptions. We tend to assume The Genie won’t include any undesired functionality, perhaps deleting emails it thinks are unworthy of our attention. We assume it won’t let an email tell it to send private information to [email protected]. We have some hope here - we hear more experiences that suggest that recent models can do an excellent job of finding (and hopefully fixing) security holes. The careful precision of the machine outruns the sloppy if imaginative thinking in squishyware. Perhaps we can assume the genie can take care of some of our unstated objectives. Conformance tests (sensors) are more valuable than specifications (guides), but it’s hard to imagine all the conformance tests that are needed to say what shouldn’t happen. Furthermore, building software is about exploration, finding out how a workflow can evolve as machines are embedded in the process. For a human to guide that process, we need some understanding of it. My sense is that model building is still important, and while I agree that the genie can take an active role in that construction, I don’t think the human can entirely outsource it. Even if the genie builds the model itself, it needs to teach us that model, because the model helps us imagine and communicate the goals, the objectives that we give to the machine. ❄                ❄                ❄                ❄                ❄ If you follow my feeds (which you probably do if you’re reading this), then you’ll know that Birgitta Böckeler has written a couple of memos on working with local models. She first looked the factors that influence how viable they are for programming , and then related some of her recent experiences evaluating such models . As a nice, if accidental, complement to these, Sebastian Raschka wrote a detailed guide to his local model environment . Like Birgitta, he’s found the Qwen 3.6 model to be the current sweet spot for local agentic programming. ❄                ❄                ❄                ❄                ❄ Simon Willison shares a useful tip to save money while using the latest Anthropic Fable model Tell Fable to use other models for smaller tasks, applying its own judgement about which model to use. ❄                ❄                ❄                ❄                ❄ Josh Comeau writes a blog and online courses for developer education, primarily front-end web material. His been successful for most of this decade but has found his online courses have had only ⅓ the sales this year . He attributes this to AI, partly as people worry if it’s worth spending money on a job that may not have a future, but also because AI can provide personalized tutoring. ideally, it shouldn’t cost any money to learn stuff. But I sorta worry about how this is supposed to work, going forwards, if there’s no incentive for people to make high-quality free content. I’ve spoken to a few course creators now, and we’re all seeing the same trend. Revenue down 50%+. Fewer people engaging with our content. People switching to LLMs, which slurp up all of our work and regurgitate it, without consent or compensation. It feels pretty bleak. 😅 ❄                ❄                ❄                ❄                ❄ John Gruber is annoyed that Claude’s desktop app for MacOS in uses Electron . Electron guarantees that an app feels just as wrong on all platforms. He has some tasty invective for the folks at Anthropic with ties to the Electron platform. Finding out that one guy — who is a senior Electron maintainer — has led the teams for the desktop clients for Slack, Notion, and now Claude is like discovering that it was one guy — whose family business was a distillery — who helmed the Titanic, piloted the Hindenburg, and then served as air traffic controller for Amelia Earhart. The deeper question here is whether there should be a future for cross-platform front-ends in the world of agentic programming. There’s lots of evidence that coding agents do a great job of building the same thing in multiple languages and platform ecosystems. That should mean that the days of least-denominator cross-platform UIs are numbered - and that number is small. ❄                ❄                ❄                ❄                ❄ Dan Davies tries to draw a distinction between interactional and contributory expertise . Contributory expertise is that held by people who are doing the work to advance a field of study, interaction expertise is held by folks that spend time talking to contributory experts, building up a decent store of knowledge themselves, but not steeped in the day-to-day of the work. it seems to me that there is an important distinction here, which is not any less important because the dividing line might be difficult to establish empirically, or even if that line turns out to be in a different place from where we guessed it was. As well as difficult cases where it’s not clear, I think we could also come up with cases where the distinction between interactional and contributory expertise would suddenly become very clear and important indeed – the ones where someone who was faking it got “found out”. And so the question that I think is quite important is whether there is a similar kind of distinction between the kind of expertise that it’s possible for a machine to get by industralised consumption and interaction with a much larger corpus of literature than any human being could inhale, and genuine contributory expertise that could apply to entirely new situations outside that literature. As a human, I’d like to think I’m more of a contributor than an interactor (especially given my increasing introversion), and thus relatively safe from being forced into obsolescence by silicon. But I’m also aware that my career is devoid of any original ideas, my skill is only that of someone who is good at selecting and explaining the ideas of others. (As Brian Foote put it more memorably: “an intellectual jackal with good taste in carrion”.) But there’s skill in being a good jackal too - and we don’t really know yet where the real boundaries of the LLMs will lie.

0 views

Let AI Burn

If you liked this piece, you should subscribe to my premium newsletter. It’s $70 a year, or $7 a month, and in return you get a weekly newsletter that’s usually anywhere from 5,000 to 18,000 words, including vast, detailed analyses of NVIDIA , Anthropic and OpenAI’s finances , and the AI bubble writ large (updated to version 3.0 a few weeks ago). My Hater's Guides To the SaaSpocalypse , Private Credit and Private Equity are essential to understanding our current financial system, and my guide to how OpenAI Kills Oracle pairs nicely with my Hater's Guide To Oracle . This week, I published the Hater’s Guide to Softbank — a sordid tale of tech’s most degenerate gambler, who, thanks to a couple of early lucky wins, has managed to set the foundations for the AI bubble’s biggest (and possibly most gratifying) downfall. And, on Friday, I’m going to take a deep dive into the memory industry — and the reason why you can’t afford a new gaming PC.  Subscribing to premium is both great value and makes it possible to write these large, deeply-researched free pieces every week. Soundtrack: Mastodon — Streambreather No bailouts, no handouts, no special treatment, no tax breaks, no CHIPS act, and no sovereign wealth fund. It is time to tell the AI industry to go fuck itself, because it’s effectively done the same to the rest of society. This industry is unworthy — a sham conjured up by a tech industry that’s run out of ideas, a trillion-dollars’ worth of manufactured consent and entirely-avoidable financial crises — and should not be protected under any circumstance.  Every single time you hear somebody discuss “bailout” or “too big to fail” or “sovereign wealth funds,” know that this is the industry, on some level, attempting to create the air that it cannot die , when in fact every one of these companies is just as weak and brittle as any other startup. I also think that the media — and the world at large — is too ready to accept the prospect of a bailout after watching those who drove the world into a ditch in 2008 escape blame, and I must be clear: the AI industry is very different to the financial industry. It is inessential to the economy, and its relevance is only as large as the hype campaign that sits behind it.  This is an industry of losers that has inflated only because of the joint manufactured consent of Silicon Valley, the mainstream media, and an enshittified stock market that rewards grifting and circular financing . OpenAI had $5.7 billion and Anthropic a little under $5 billion in the first quarter of this year — and those revenues mostly came from companies that were burning AI tokens at a horrendous rate because they’d just been forced to pay the actual cost of AI — and now everybody’s pulling back on that spend .  Generative AI will not bring us AGI, nor does it do much of what we associate with artificial intelligence. It is not autonomous. It is not “intelligent.” It does not have thoughts, or “knowledge,” and no matter how many layers of harnesses and scripts you put on top of it, it is still ( per OpenAI ) mathematically certain to hallucinate. I estimate that at least 70% of the entire AI industry’s revenues are made up of OpenAI and Anthropic’s compute spend , and as both companies are horrendously unprofitable, this means that the AI industry is, for the most part, venture capitalists funnelling money to hyperscalers so that they can funnel that money to NVIDIA or data center capex. If this software were worthy, it would stand on its own two feet. It wouldn’t need circular financing and a cult of personality to prop it up, either. If it were truly special, there wouldn’t need to be an army of crazed acolytes that attack you for not pledging yourself to the graveyard smash. There has never been a tool or product in history sold with such hysteria and aggressive monocultural force that has ever turned out to be anything more than a grift. Some people have developed unhealthy relationships with large language models (LLMs) and the companies that make them, and that, not any certainty or proof of Artificial General Intelligence (AGI), is what motivates them.  This software is uniquely dark, both in what it unlocks in some people through its use and in the sense of the entities that sell it. Some people are in genuine awe of each of the rotation of clammy, soulless pod-people that saunter out of Anthropic every few weeks. Each one sounds a little weirder, more cultish, more disconnected from the real world. Silicon Valley may believe itself atheistic, but Anthropic has a worrying sense of fanaticism, both in the people that work there and its fanbase. Imagine the absolute worst fanbase of a video game possible, and then add layers of financialization, grifting and high school drama laced with pseudo-religious attachment. All for a fucking app!  Please, people. Nobody in the real world cares about “loops.” Nobody is thinking about tokenization. If you said inference to a guy on the street they’d take you to see a doctor. Nobody gives a shit. They don’t know what OpenClaw is either. Grow up. Go outside. You sound like a lunatic. Does your mother know how many Claude 20x accounts you have? It’s obsessive!  Anyway, the only reason that AI has any presence in our economy is that Microsoft, Google, Meta, and Amazon are intent on spending more than $765 billion in capital expenditures in 2026 and a trillion more in 2027 because they have no other hypergrowth ideas, even though generative AI has yet to show any real potential as something that can drive meaningful revenues (let alone profits), as evidenced by the fact that none of these companies break out their actual AI revenues , a point I made on CNBC late last week .  Google does not have the next Google Search, Microsoft does not have the next Microsoft Office, Meta does not have the next Facebook, and Amazon does not have the new AWS. That’s why they need you to believe that AI is a big deal without them ever having to prove why outside of capital expenditures. They want you to assume that all this money can’t be wrong , even though when you remove OpenAI and Anthropic ( who represent 89% of the revenues of the largest AI companies ) the AI industry is, at best, pulling in $20 billion in annual revenue. And lord do they want you to say “it’s early,” and that it’s just like the Dot Com Bubble , all so that you’ll either accept AI as your lord and savior or, alternatively, help justify one of the largest misallocations of capital in history as “building useful infrastructure.” Newsflash! AI GPUs are useful for generative AI and not much else. Every “innovation” in LLMs has only been made possible by throwing billions of dollars at the problem either in headcount or compute costs — every ounce of talent in the tech industry, every bit of media attention, every dollar of capital expenditures, all focused on one industry that has successfully created LLMs that are more expensive and significantly less useful than human beings .  The reason every AI person speaks in pie-in-the-sky hypotheticals is that the actual outcomes are decidedly mediocre when you compare them to their ruinous costs. Anthropic and OpenAI raised (assuming the rounds completely close) over $300 billion in 2026 alone, and take up the vast majority of available AI compute. They need you to speak in the future tense, because nothing — absolutely nothing — about what’s been created so far justifies even a fraction of its financial and infrastructural cost. When the AI bubble bursts, none of this infrastructure will be particularly useful. As I said in my premium about how this is worse than the Dot Com Bubble , GPUs are not fiber optic cable , and when the bubble bursts, NVIDIA chips will either be sitting in the coffers of the largest tech companies in the world, held by asset managers, or auctioned at a steep discount by creditors. These are not going to be useful for hobbyists, nor will they be cheaper to run, nor will incomplete data centers be cheaper to finish. The Dot Com era fiber overbuild was a result of a complete misread of demand signals, per Justin Kollar : It’s tempting to compare this to GPUs, but it doesn’t make sense at all!   You see, internet demand was a result of people wanting to get online and use the internet, with the leftover “useful infrastructure” having a blatantly obvious use case after the bubble burst, albeit one that took a lot longer to arrive than investors had hoped. There was no question about how that gear might be used or for what purpose one used fiber optic internet or networking gear, nor was there any question as to the underlying business model of offering an internet connection might mean.  We were also fairly early, and internet speeds were atrocious. In 2000 , only 52% of American adults were using the internet, and by 2003, that number had only increased to 61%. Per the World Bank , in 2005 only 16% of the world used the internet, and in 2024, that number had increased to 71%. When the internet was connected to via a 56k modem, access was charged by-the-minute, and obviously much, much slower than even the primitive (though expensive) broadband connections of the day.  While we’re used to connecting at speeds that make using a web-based app near-indistinguishable from one that runs on our computer, back in 2000, 2001, or 2002, the average US internet speed was, at best, 400 Kilobits/s , or roughly 50 kilobytes a second, compared to the average US internet speed of over 200 Megabits per second , or 25 megabytes a second.  Generative AI, on the other hand, is fucking everywhere , and anyone with an internet connection experiences it in effectively the same way. It’s non-consensually available in effectively every app — every Facebook, Google and Microsoft account, for example — and every media outlet known to man has mentioned AI multiple times since 2023. OpenAI and Anthropic might claim they need more data centers, but it’s unclear what “more data centers” actually achieves other than propping up NVIDIA and giving hyperscalers something to invest in.  A lack of data center capacity isn’t holding back people from using generative AI, nor is it stopping anybody from launching a product, nor can anyone actually express what it is that they’re being built for other than “reasons for Anthropic and OpenAI to spend money.” Anthropic’s supposed lack of compute did not stop it training or launching Mythos or Fable, and when it bought hundreds of megawatts of compute from SpaceX , the biggest news was that it expanded rate limits to allow users to burn $8,000 worth of tokens for $200 a month . Nothing about the painfully slow pace of data center development appears to be restraining a single AI company, outside of hyperscalers complaining they could’ve made more money from either Anthropic or Meta . In fact, the entire argument for more data centers appears to be “we need more compute so that people can buy it” far more than any cogent position around what these capacity shortages actually mean.  Who are the companies lining up to spend billions of dollars of compute — or, to be more specific, spend $435 billion or more to justify the $1 trillion in GPU sales that NVIDIA claims it’ll have by the end of 2027 ? That’s how much demand we’ll need. As NVIDIA intends to sell over a trillion dollars of Blackwell and Vera Rubin GPUs by the end of 2027 , it needs to have around (assuming a PUE of 1.35) 40GW of data center capacity built to support the 30GW+ of GPUs it will have sold . At about $12 a megawatt of critical IT (IE: the stuff in the data center that runs AI compute, and not everything else, like the cooling systems and any transmission loss), that’s $435 billion.  OpenAI estimates it’ll spend $50 billion on compute in 2026 , and Anthropic will likely spend comparable amounts. Otherwise, the only other player — outside of Microsoft, Google, and Amazon renting ( or backstopping ) capacity for Anthropic and OpenAI — with any meaningful compute spend is Meta (with Nebius and CoreWeave )... and Bloomberg is reporting that Meta is planning to start selling its compute because it doesn’t need all of it .  You’ll be shocked to hear that it might be renting some of that capacity… to Anthropic . Now NVIDIA is agreeing to financially backstop young cloud providers buying their GPUs by promising to rent back any unused capacity, yet another sign that actual, real demand does not exist at scale . AI boosters with black mold problems will say “this is just to help them raise debt,” to which I say “If the demand actually existed in any provable way, NVIDIA wouldn’t have to pay its customers to buy its products!”  Anyway, my larger point is that there was real demand during the dot com bubble, and LLMs’ demand appears decidedly artificial outside of OpenAI and Anthropic, who cannot afford to pay without unlimited venture capital funding.  This shit isn’t going to become magically cheaper once the bubble bursts, and considering the demand doesn’t appear to be there at scale with two-thirds of all venture capital funding focused on AI , I’m not sure what people expect to happen. Right now is the number one time in history where we should see near-infinite demand for compute across every single surface, and way more deals for compute capacity for companies other than the same four or five companies. Right now, as I’ve discussed before , Anthropic and OpenAI take up the majority of compute, leaving the rest of the world to fight for the leftover scraps, and because data centers take 18 to 36 months to build , capacity is taking forever to come online to fill the indeterminately-large amount of demand that remains. Nevertheless, said demand can’t be that large, otherwise we’d A) have other companies trying to build their own compute (other than Poolside, which failed to raise money to do so ) and B) massive remaining performance obligations — hundreds of billions of dollars’ worth — rather than the grim truth that 50% of hyperscaler RPOs are from Anthropic and OpenAI , inflating obligations by $448 billion, hiding the fact that Microsoft’s RPO growth is flat year-over-year and Amazon’s is only growing at a modest 20% when you remove Anthropic and OpenAI’s hundreds of billions of dollars’ of compute spend. Google’s is a little messier, as it’s hard to parse exactly how large its deals with Anthropic are thanks to its backstops and circular deals around Anthropic and its TPU chips . There’s also the compelling question as to what it is that anyone would be picking up once the bubble bursts. Demand for AI services is a direct result of the entire media, tech industry and venture capital ecosystem manufacturing consent for the use of LLMs, forcing them into every corner of every experience, something that will most decidedly end once the stock market and investors cease incentivizing it.  Once every media story isn’t about AI, once every Business Idiot with AI psychosis stops posting about it every day, when everyone stops asking about your AI strategy or wanking on about “sovereign AI,” it’ll become blatantly obvious that the actual demand for AI was not particularly strong. We have little compelling evidence that providing any inference-based services is profitable, which means that even if open source AI outlives the frontier AI labs, it’s unclear who would actually power the infrastructure. People can come up with however many weird blogs where they’ve done some napkin maths to try and extrapolate a potentially profitable inference provider, but I’ll only believe that one is profitable when someone shows me some fucking profit. And to be clear, without that profit, it’s unclear why anyone would offer these services at all. When you rent out a GPU cluster, you do so based on anticipated demand and the quality of service you want to provide. If you order too much, you’ve got a bunch of fallow capacity you’re paying for (and will lose money on), and if you order too little, you’ll have either unstable services or money left on the table…and even then, it’s unclear how profitable that would be.  AI demand is, at this point, a direct result of societal pressure and non-consensually overwhelming customers with AI features. While there are people that like and pay for ChatGPT or Claude, those who do so on a subscription basis are doing so because they can get $30 to $40 of compute for a dollar . The vast, vast majority of AI compute demand is from services provided to people either for free or sold at such a massive discount that it’s impossible that anyone on a $20 or $200-a-month plan could even afford these services had they paid their actual token cost. To paraphrase Cory Doctorow, your demand is based on selling $40 for a dollar. That’s not a real business, nor is that organic demand. One could argue that “these services will become cheaper,” but that would require them to… become cheaper. More compute isn’t (and hasn’t) lowering the cost of AI. Newer GPUs aren’t lowering the cost. Barely-tested Broadcom GPUs , Amazon Trainium XPUs, and Google TPUs aren’t lowering the costs. Even if they were to somehow magically do so in the future, what do we do with the H100, H200, B100, B200, B300 or AMD GPUs? Melt them down for scrap? Steal the RAM? Build a GPU fort?  The Dot Com (and, by extension, telecom) Bubble was never a question of whether the internet was a useful thing that people would pay for , nor were there journalists and dodgy studies that desperately pleaded with us that AI is here, and it’s real.  Everybody has access to AI now! They can all see it and use it if they want to, and they’ve got lots and lots of ways to pay for it! Maybe the reason that AI revenues are so putrid is that they don’t really have any reasons to pay for it, either because the free services do most of what they need (IE: google searches) or subsidized subscriptions that cost $200 a month allow them to burn as much compute whipping up HTML-based calorie tracking apps that get two users. Every time I read somebody on Twitter say that “we’re early” or that “most people haven’t even tried agents” I feel like screaming. Motherfucker, everyone is talking about agents in every single media property all the time . AI boosters will refer to literally any AI feature as an agent, even if it’s a basic web search or generating code. The reason that most people are kind of “meh” about AI is that it doesn’t do things that they associate with AI (autonomously and automatically taking care of the things they need with little prompting or coaxing), everybody knows it hallucinates, and AI data centers are horrifying monoliths of capital that get massive tax breaks, use a ton of water , belch toxins into the air , and are being built by faceless corporations, ultra-oafs like Kevin “Mr. Dogshit” O’leary , or charmlessly damp Valley elitists like Altman and Amodei. Every single person freaking out about “what if China does AI better than America” is living in a child’s fantasy. Oh no! China might get Mythos-level AI? Bad news folks! Anthropic itself already admitted that cheaper models — including Claude Haiku 4.5 and Kimi K2.7 — were able to identify the very same vulnerabilities as Fable (so, Mythos with guardrails).  China has cheap power, data center capacity, and NVIDIA’s Blackwell GPUs . The thing that everybody is scared of has happened already, and you know what else happened? Nothing, because they, like American AI labs, are building LLMs. The only thing that American labs are scared of is cheaper open source Chinese models offering similar performance to their premium products , something that has also already happened.  Remember: the only people that can afford to build data centers are either hyperscalers ( that are now having to fund the buildout with debt as their cash flow turns negative ), Oracle ( which will die if OpenAI can’t pay it ), unprofitable neoclouds , and land speculators. AI data centers are massive, expensive operations, and raising money to finish (or furnish) one after the bubble bursts will be very, very difficult. I realize that everybody wants there to be a happy ending after all of this collapses. I get that it’s easier to think of things in familiar terms — even if said terms involved a 77% drop in the NASDAQ — because there was something good and nice at the end. But doing so only serves to help protect the interests — and brands! — of venture capitalists, asset managers, private credit funds , hyperscalers, captured tech and business journalists and sell-side analysts that insisted on ignoring every warning sign and waving away problems by saying it was “just like Uber ( nope !)” or “just like Amazon Web Services ( between 2003 and 2015, Amazon spent $29.7 billion on capex, normalized for inflation ),” or simply saying that “yes it’s a bubble, but bubbles lead to great industries.” GPUs aren’t dark fiber! GPUs aren’t fucking railroads! GPUs are GPUs! They are used for basically one thing ! And that one thing lacks meaningful demand outside of subsidized services and circular financing!  And now people are discussing a bailout like this is 2008, and I must be clear how different this is, and how little it resembles the Great Financial Crisis! The AI industry has demanded everything from us — more money than has ever been invested, more power than anything has ever needed, the stolen works of millions of hard-working creatives , so many GPUs and so many data centers that it’s causing a global supply chain crisis and a new class of RAM and storage-based inflation , the majority of venture capital funding ,  and constant attention focused on an endless campaign of fear-mongering with the express intention of hyping a technology based on a mixture of mysticism and outright lies — and still, even as we enter the late innings of the bubble, it wants more.  Capital-hog Sam Altman has floated the idea of handing 5% of OpenAI to the US government , a stake worth around $42 billion, claiming that (to quote the FT) “...giving the public a financial stake in the company is the best way to share the upside of AI,” failing to note what said upside might be, likely because there isn’t one unless “the public” refers to “the shareholders of OpenAI.”  It isn’t clear how this would happen, outside of it requiring congressional approval as a result of the Takings Clause of the Fifth Amendment , which states that “private property [can’t] be taken for public use without just compensation,” meaning that the US government would likely have to buy the stock at whatever valuation it considered “just.”  Yet the FT had one other interesting tidbit — that Altman is suggesting that whatever this is would “...would involve other US AI companies handing over a similar stake, although it is not clear if the other labs would be willing to do so”: This is, just to be clear, not a bailout. Even though it’s blatantly obvious that Altman wants to cozy up to the Trump Administration and, he hopes, get $42 billion of funding to attach his questionably-valued quasi-startup, $42 billion is $8 billion less than OpenAI will spend on compute in 2026 , and considering OpenAI has projected to burn $852 billion through the end of 2030 , that 5% stake would only exist to prolong the inevitable. You see, a bailout usually has an endpoint — a time at which the company in question no longer needs the funds.  So, let’s be clear about something : we’re actually in several bubbles at once. The great financial crisis, by comparison, was two major bubbles (per my piece on how AI Isn’t Too Big To Fail from a few months ago) — the over-investment and speculation on mortgages (both subprime and otherwise), and the collapse of the commercial paper (a type of loan) market that kept much of the banking system functioning, which was the real “Too Big To Fail”: Commercial paper was, at the time, often paid off using more commercial paper, and when AIG’s credit rating dropped in the middle of September 2008 , it was unable to roll over its debt (by which I mean “get new commercial paper to pay off its old commercial paper”), and money market funds like Fidelity couldn’t even buy it anymore because it wasn’t investment grade, which meant that AIG couldn’t pay back its loans.  While I won’t recount the entirety of the premium (mostly because it’s super long), AIG was deemed “Too Big To Fail” because it would’ve exploded the markets had it done so. Michael Lewitt, an economist and money manager, described a hypothetical AIG failure as being “as close to an extinction-level event as the financial markets have seen since the Great Depression” in a New York Times op-ed: Yet the real “Too Big To Fail” was far quieter and more malignant, taking the form of trillions of dollars funnelled to banks: The banking system ran (and still runs) on overnight facilities like the federal repo market, where financial institutions offer up collateral — like, say, mortgages — as a means of funding their day-to-day operations. Previously, money market funds were the lenders in the repo market…except they were now a little hesitant to take that collateral, which forced the government to step in with the PDCF (which traded risky, frozen assets like subprime mortgages for cash to avoid a default) and the TSLF (which traded risky bonds for US treasuries). Absolutely nothing about these facilities or anything to do with “too big to fail” were to do with stabilizing the stock market, which was effectively cut in half , with unemployment spiking to 10% . These measures existed exclusively to protect the financial system, with only $46 billion (about 10%) focused on trying to save homeowners from foreclosure , and in the end, to quote a congressional panel from 2009 , “...the panel sees no evidence that Treasury has used TARP funds to support the housing market by avoiding preventable foreclosures.”  The Troubled Asset Relief Program (TARP) spent over $400 billion to bail out the banks, financial institutions and auto industry that would’ve collapsed as a result of an economy-wide lending freeze. Nobody went to jail, nothing really changed, and banks still don’t have to keep reserves thanks to changes made around COVID. By comparison, OpenAI and Anthropic are systemically irrelevant, much like the rest of the generative AI industry. While their existence supports the overall symbolic value of the US stock market, their actual economic presence is minor, outside of what I estimate is around $75 billion to $100 billion of 2026 compute spend and what will likely be around $60 billion of combined revenue, with the rest of the AI industry having so little that it’s barely worth thinking about. It’s also unclear what you’d bail out, unless the plan is to feed them capital for all eternity until they work out how to run a functional business (so, forever). Neither of them have significant debt — and Broadcom is backstopping $30 billion of Anthropic’s $35 billion TPU deal with Apollo — and their equity positions (outside of SoftBank, which I’ll get to) are only load-bearing to venture capitalists in the sense that their fund vintages will painfully sour if they’re unable to go public.  There is no avoiding the carnage to come, outside of there being somewhere in the order of ten to a hundred times the demand for AI compute by 2030 that exists today, which would require AI compute to be larger than the $779 billion that the software industry earns annually .  There is no bailout that can reverse the trend once demand wanes for NVIDIA’s GPUs after hyperscalers reduce their capex, which will in turn kill the revenues of Taiwanese ODMs that build AI servers for hyperscalers , which will in turn kill the revenues of RAM and storage companies, which will lead to a prolonged depression throughout a semiconductor industry addicted to hopium peddled by a tech industry ruled by Business Idiots that have no idea what to do other than hire people, fire people and spend money .  As I’ve said many times, people are conflating massive capital expenditures — invested through debt-fueled data center speculation and hyperscalers bereft of hypergrowth ideas — with real, diverse and consistent AI demand, pumping valuations based on vibes rather than reality , which means that when vibes take a violent, permanent shift, nobody has anything to point to as a means of turning people’s frowns upside down. The collapse in value of AI startups wouldn’t be changed by a bailout unless the US government literally invested in worthless startups as a means of propping up venture capital, and said “bailout” would number in the hundreds of billions of dollars, and while I know you’re gonna say “ohhhh Trump is so corrupt oooh Trump will do this Trump will do that,” this is not a rational or logical or even historically-accurate thing to say.  Trump cannot simply mobilize $50 billion or $100 billion. It will go through the House and the Senate, and any bailout of the AI sector would be an incredibly-unpopular decision, infuriating not just those on the left who’ve grown tired of Big Tech, but with those Republicans that pretend to care about working Americans or fiscal probity.  As a reminder, the first vote of the 2008 bailout failed, with Republicans and Democrats each fairly split on how they felt about the bill — and that rejection happened during a time when the US financial system was quite literally falling to shit.  As far as the data center bubble goes, the government is absolutely willing to let unfinished or abandoned properties lay dormant. In the final quarter of 2008, 11% of US homes were empty , or 15% if you include vacation homes.  Banks that have invested in data centers that have yet to be built (or start construction) can (and will) resell the land, though likely at a loss, and land retains value even if you haven’t built a giant warehouse full of GPUs that only lose money. There isn’t a need for a bailout here, and one won’t be forthcoming. After the Global Financial Crisis, builders were allowed to collapse to the extent that the number of construction firms halved in America between 2007 and 2012 . You could argue that Trump “will just do that this time,” or that he’ll “get a bribe” or something, but is that really the best you’ve got? Scary stories about the President? If every answer you have is “but Trump will just do it,” you’re not analyzing, you’re catastrophizing.  And, most crucially, the vast majority of big tech will be fine, at least in the short term, when the bubble bursts. NVIDIA will likely cease being the largest company on the stock market, and the Magnificent Seven will have a dramatic fall from grace, but outside of unforeseen horrendous financial decisions, the worst I could see would be impairments for Microsoft, Google, Meta, and Amazon, and SEC action against NVIDIA if it did actually sell GPUs to China. This doesn’t mean that things won’t fucking suck for anyone in the market, nor that the vast majority of people won’t fucking suffer as they always do when bubbles burst.  Which is why I am making a firm, clear statement to end this piece. I repeat myself: No bailouts, no handouts, no special treatment, no tax breaks, no CHIPS act, and no sovereign wealth fund. It is time to tell the AI industry to go fuck itself, because it’s effectively done the same to the rest of society. These companies must be forced to stand on their own two feet and die with dignity if their wretched business models can’t keep up. The world’s governments have rolled on their backs and shown their bellies to the tech industry for far too long, and have been aggressively conned by some of the richest people alive into believing that fucking Sam Altman and Dario Amodei are building anything other than the world’s least-profitable software.  We do not need a “sovereign AI strategy,” nor do we need “a sovereign AI wealth fund,” nor do we need to “make sure America leads in AI,” at least not when we’re talking about large language models, the underlying technology of ChatGPT and Claude, two of the most over-hyped and deceptively-marketed pieces of software in history.  Whether or not LLMs are a useful tool is irrelevant, because the AI industry has demanded the world hand it as much land and money and as many resources as it desires to continue proliferating a technology that has only ever lost money and has no path to sustainability. The only reason it has gone anywhere is because the tech industry has united around it as a means of hiding from the fact it has no next big thing , and nothing — absolutely nothing — that a LLM can do remotely justifies the investment. And it has only got this far because of a captured business and tech media overstating its capabilities and hand-waving its obvious efficacy issues and economic instability. There are too many that have proven easily-wooed by whimsical white boys that promise they’re building machine intelligence, and when the markets bleed red, these people should know that they’re responsible. So much of the so-called journalism around AI has been used to enrich the already-rich and inflate a bubble that will hurt hundreds of millions of regular people globally as Sam Altman and Dario Amodei remain billionaires despite their companies’ fates. When the time comes, the AI industry must burn. It must be allowed to die. Generative AI has already been given far too much money, oxygen and attention, and if it cannot survive without continual venture capital and media coddling, it is unworthy and unnecessary, and must face the cold, hard reality that every regular person faces when they fail. And there is no “bailing out” these wretched firms. Giving $42 billion to OpenAI or Anthropic will not fix their business models, nor will it magic up the $400 billion or more in annual revenue to substantiate just NVIDIA’s AI GPU sales through the end of 2027.   These people are not building the future — they’re finding ways to re-entrench the status quo, to give Microsoft, Google, Amazon and Meta ways to grow their revenues and centralize infrastructure under the auspices of “innovation.”  If any policy makers read this, know that you’ve been had by the AI industry. They want you to believe they’re essential so you’ll bail them and their rich friends out when the time comes, or funnel taxpayer funds into building them data centers. They are not building autonomous intelligence, nor will they ever do so.  I think it’s fanciful to imagine that there would ever be actual consequences for this bubble, but if there are, the people to hold responsible are Sam Altman, Dario Amodei, Satya Nadella, Sundar Pichai, Andy Jassy, Jensen Huang, Mark Zuckerberg, and everyone else who forcefully manufactured consent for a dead end technology and built the rails to serve the world its next great financial crisis. Until something changes, the tech industry will never be capable of building anything other than consensus and reinforcements of the status quo. So, spit in the face of those who even hint at a bailout, refuse to accept it, and demand that they do the complex, ugly work of thinking about the actual consequences of everyone being wrong. When this era ends, we will need to thoroughly excavate the collapse to make sure it doesn’t happen again, identifying the organizations and personalities that were used to manufacture consent and spread mythology about LLMs.  Every major bubble that has ever happened has mostly left the stones of responsibility unturned. The carnage that I fear will follow this era’s collapse will be horrifying, and we must do everything in our power to both thoroughly understand how we got here and make sure it doesn’t happen again, which will involve many hard conversations about our financial system, media ecosystem, and how innovation is invested in, built, bought and sold.  The same goes for the acolytes of this era. There are people who have developed a genuine hostility toward those who do not immediately accept a for-profit entity as their lord and savior. This is a sickness within the tech industry that must be put to an end.  Much of this will be unavoidable, because I think what follows the AI bubble will be a greater revaluation of the tech industry, a necessary reckoning with reality for a Silicon Valley that’s far more beholden to capital than it is human progress. The cults of personality that dominate this industry do not care about you, or me, or anyone other than those they revere and their theoretical placement in their dream of a society dominated by the rich and their chosen cronies. I refuse to accept their future as an inevitability. As I said a few weeks ago: This era must end, and all failures must be allowed to fail.  Let AI burn. If you liked this piece, you should subscribe to my premium newsletter. It’s $70 a year, or $7 a month, and in return you get a weekly newsletter that’s usually anywhere from 10,000 to 18,000 words, including vast, detailed analyses of the biggest events and companies in the AI bubble.  The stock market bubble, where both the value of stocks and the earnings of companies in the market are inflated to an historic level . A data center speculation bubble, where I believe we’re building AI GPU capacity in expectation of $450 billion or more in annual data center revenue for an industry that, without two unsustainable venture-backed oafs, has a few billion dollars’ worth of demand. An AI startup bubble, where the vast majority of AI startups are both over-valued and have no foreseeable path to acquisition or a public offering . These startups also rely on buying tokens from OpenAI and Anthropic, making them far more cash-intensive, making them absorb the majority of venture capital funding. A private credit bubble, where asset managers have sunk billions of dollars of pension and insurance funds into AI data centers .  A semiconductor bubble, where supply chains have become saturated with demand from those building AI data centers, inflating the cost of RAM and storage , making all electronics more expensive, including those inside the AI data centers, creating a vicious cycle that has doubled the cost of a gigawatt data center from $50 billion to $100 billion in a little under 10 months.

0 views
ava's blog 2 weeks ago

enduring the heat wave in germany

I live in an apartment that first gets heated up on one side before noon, then later from the other side. My kitchen is especially hot each year because it has a huge bay window with no shutters installed. My strategies for keeping cool have been to air out everything at night, and if possible draw in and circulate air via a fan during some of it. Then as soon as the sun is coming up, closing windows, lowering the existing outside shutters so the sun can’t heat up the glass or insides, and always keeping the kitchen door closed so the heat is contained within. I avoid opening the windows during the day to not let heat in, except if I really need fresh air or the humidity is too high. Humidity is the thing that is wrecking us the most in this, which is why it is often futile to ask people elsewhere how they deal with these high temperatures when those people live in very dry climates. The humidity messes with your body’s ability to exude heat, and in worst case, results in the wet bulb effect . That is also why even people from hotter countries can suddenly struggle elsewhere (like Europe), together with the angle at which sunlight hits Earth at that area being different (a lower sun angle spreads the same amount of energy over a larger area, making it feel cooler, while a higher angle concentrates energy on a smaller area, increasing warmth). This is why fans with water cooling and tips like hanging a wet T-shirt in front of a fan, constantly misting yourself or wearing wet clothes etc. can sort of backfire and make your home a bit more unbearable, depending on the circumstances. I also have a fan with water cooling with optional cooling bricks/batteries, and it’s currently on because we hang out in front of it, but I’m mindful of when I turn that mode on and for how long. In the next few weeks, we are planning to add sun protection foil to some windows, and when the extreme demand is over in fall, I’ll buy a Midea Porta Split and install it in the living room. Good tips in general, some summarized from above: Hydrate a lot, even before you are actually thirsty. Stay inside if possible. Keep the added humidity to a minimum. Know what you are trying to do with drinks and showers. Cool drinks and showers offer relief, but can make you heat up after. Hot beverages and showers can make everything feel cooler after and help you sweat. I like both, depending on the situation. Wrap ice packs or similar stuff in a towel and put them under your feet or in your armpits. If possible, lower shutters so the sun cannot heat up the interior and the glass. Maybe install sun protection foil on windows (most are plant-friendly). I’ve also seen others provisionally use those reflecting covers for cars on their windows, or aluminium foil. Make sure that if it’s behind the glass, the heat won’t be trapped and make the glass crack, so preferably attach it on the outside. Sunscreen, wide breathable and covering clothing, sun umbrellas and hats. During fall/winter, maybe during Black Friday sales, get a portable split cooling system. Portables do not need structural changes to the building, which is why they tend to be allowed in rental units as they can be removed without a trace and aren’t in use all year. Shitty landlords might get mad to see it in your window, but in many countries, there already is positive case law about them and the usual AC dismissals don’t apply to them. Set out flat bowls of water in the shadow for wild animals and refill. Consider different ones for different sizes (a flat one with stone pebbles for insects, a relatively flat but water-only one for hedgehogs etc., one bird bath…). Use cool tiles and cooling mats for pets. Keep an eye out for baby birds who flee their overheated nests too early; maybe you can save some of them. Especially bitdd who live in attics and roofs are dying right now (swifts etc.) If possible and you can plan the shipment, avoid deliveries. Keep water around for delivery personnel. Eat smaller snacks and portions spread out throughout the day instead of big meals so your body doesn’t heat up as much during digestion. Leave the windows open all day. Let the sun heat up your interior, if possible; try at least covering windows with blankets if there are no shutters. Set out water for animals where it heats up drastically, or in a beverage where they might become trapped and drown. Walk your dog when the ground is heated up - asphalt burns happen quickly past 25 degrees Celsius. Fall for scalpers, scammers and increased prices for ACs and fans who are using the current demand and availability issues for profit. The Porta Split I mean to get can be bought for 550-750 Euro under normal circumstances, now during the heat wave, prices have exploded to over 1.4k. Only buy that if it is an emergency. Think fans or ACs can make you sick. This is a widely held belief especially in older generations in Germany at least, together with the myth that any wind can cause a cold and stiff neck. It is bullshit. It’s a big reason why this country is not prepared for this heat and there’s a 20% adoption rate for ACs here. Think you need to keep the fan off or not buy one at all because of the electricity bill. The increase is lower for newer models and for the few days you need to use it (more) (for now). You are also not meaningfully contributing to climate change with this increased energy use. Like, come on, they wanna build entire data centers eating away gigawatts, your heat protection is not the issue here. Still, all of these tend to be hyperindividualistic solutions, just like when Covid happened, and we need more widespread, structural solutions. Not everyone can stay home; many people still have to work and commute. You might tell people to hydrate as much as possible, but their work doesn’t offer free (or extra) water to them, and many places like restaurants and cafés still don’t. We tell people to invest in ACs and fans, but landlords and workplaces don’t want to install any, forbid the use, or don’t cover the price of these things. It’s like heat management is still an incredibly personal thing where everyone has to feel like they are fending for themselves, investing their own money into stockpiling resources and tech, and utilizing the privilege to avoid a lot of the heat by working from home/working inside, taking time off, calling in sick and so on. More collective heat management can look like: Free water in establishments everywhere, and drinking fountains spread throughout cities, with signs pointing to the next one. Designating libraries, community centers, schools, transit hubs and big shops like huge supermarkets as cooling centers during heat waves. Keeping trees, bushes, grass etc. intact and adding more. They help keep cities cooler, together with reflective roofs and lighter pavements. Legally mandating landlords to install ACs in rental units, especially ones directly below the roof (attic/loft/penthouse apartments), and cover specific windows in protective foil or external shutters. Requiring new(er) buildings to have specific insulation that helps in summer as well as winter, ventilation strategies, ACs, etc. and updating building codes so new housing remains habitable during prolonged heat waves, even without continuous air conditioning. More shaded areas in crowded places, waiting spots (public transportation), shaded pathways between major destinations. Rollout of functioning and resilient AC in all public transportation, hospitals, schools, universities, elderly homes etc. Extending opening hours into the early morning and late evening during extreme heat, with closure inbetween (or at the bare minimum, siestas). Temperature thresholds that trigger additional protections or suspension of certain work or studies. Preparing railroads, normal roads and other parts of the public from the intense heat effects or making them more heat resistant; otherwise you risk bent rails, melting bitumen etc. Distributing fans or subsidizing cooling equipment where appropriate. Strengthening electrical grids to cope with increased cooling demand, subsidizing electricity costs during declared heat emergencies, expanding renewable generation to reduce the emissions associated with increased cooling needs. And likely more I forgot. Yes, people will cry that this costs soooo much money. But remember that we have no problem investing that money into wars, AI, data centers, expensive proprietary software licenses, politicians’ money schemes and making billionaires richer. Landlords need to invest the rent into the property instead of enriching themselves and getting other people to pay off their mortgage. These aren’t one-time events, it will continue to get worse. Earlier in the year, longer, higher. Many people and animals will die. Everyone has to start preparing and learning from it now, and stop buying into the bullshit that “it was hot when I was a child too, we are just complaining more!!1!”. Your government is failing you if they are not acting now, and it is intentional, as the heat affects vulnerable and powerless groups the most. Make sure you check on old, sick, disabled people and people you know who take medication that makes them more vulnerable to the sun and/or heat. For example, diuretics, beta blockers, anticholinergics, and some antidepressants and stimulants. Reply via email Published 27 Jun, 2026 Hydrate a lot, even before you are actually thirsty. Stay inside if possible. Keep the added humidity to a minimum. Know what you are trying to do with drinks and showers. Cool drinks and showers offer relief, but can make you heat up after. Hot beverages and showers can make everything feel cooler after and help you sweat. I like both, depending on the situation. Wrap ice packs or similar stuff in a towel and put them under your feet or in your armpits. If possible, lower shutters so the sun cannot heat up the interior and the glass. Maybe install sun protection foil on windows (most are plant-friendly). I’ve also seen others provisionally use those reflecting covers for cars on their windows, or aluminium foil. Make sure that if it’s behind the glass, the heat won’t be trapped and make the glass crack, so preferably attach it on the outside. Sunscreen, wide breathable and covering clothing, sun umbrellas and hats. During fall/winter, maybe during Black Friday sales, get a portable split cooling system. Portables do not need structural changes to the building, which is why they tend to be allowed in rental units as they can be removed without a trace and aren’t in use all year. Shitty landlords might get mad to see it in your window, but in many countries, there already is positive case law about them and the usual AC dismissals don’t apply to them. Set out flat bowls of water in the shadow for wild animals and refill. Consider different ones for different sizes (a flat one with stone pebbles for insects, a relatively flat but water-only one for hedgehogs etc., one bird bath…). Use cool tiles and cooling mats for pets. Keep an eye out for baby birds who flee their overheated nests too early; maybe you can save some of them. Especially bitdd who live in attics and roofs are dying right now (swifts etc.) If possible and you can plan the shipment, avoid deliveries. Keep water around for delivery personnel. Eat smaller snacks and portions spread out throughout the day instead of big meals so your body doesn’t heat up as much during digestion. Leave the windows open all day. Let the sun heat up your interior, if possible; try at least covering windows with blankets if there are no shutters. Set out water for animals where it heats up drastically, or in a beverage where they might become trapped and drown. Walk your dog when the ground is heated up - asphalt burns happen quickly past 25 degrees Celsius. Fall for scalpers, scammers and increased prices for ACs and fans who are using the current demand and availability issues for profit. The Porta Split I mean to get can be bought for 550-750 Euro under normal circumstances, now during the heat wave, prices have exploded to over 1.4k. Only buy that if it is an emergency. Think fans or ACs can make you sick. This is a widely held belief especially in older generations in Germany at least, together with the myth that any wind can cause a cold and stiff neck. It is bullshit. It’s a big reason why this country is not prepared for this heat and there’s a 20% adoption rate for ACs here. Think you need to keep the fan off or not buy one at all because of the electricity bill. The increase is lower for newer models and for the few days you need to use it (more) (for now). You are also not meaningfully contributing to climate change with this increased energy use. Like, come on, they wanna build entire data centers eating away gigawatts, your heat protection is not the issue here. Free water in establishments everywhere, and drinking fountains spread throughout cities, with signs pointing to the next one. Designating libraries, community centers, schools, transit hubs and big shops like huge supermarkets as cooling centers during heat waves. Keeping trees, bushes, grass etc. intact and adding more. They help keep cities cooler, together with reflective roofs and lighter pavements. Legally mandating landlords to install ACs in rental units, especially ones directly below the roof (attic/loft/penthouse apartments), and cover specific windows in protective foil or external shutters. Requiring new(er) buildings to have specific insulation that helps in summer as well as winter, ventilation strategies, ACs, etc. and updating building codes so new housing remains habitable during prolonged heat waves, even without continuous air conditioning. More shaded areas in crowded places, waiting spots (public transportation), shaded pathways between major destinations. Rollout of functioning and resilient AC in all public transportation, hospitals, schools, universities, elderly homes etc. Extending opening hours into the early morning and late evening during extreme heat, with closure inbetween (or at the bare minimum, siestas). Temperature thresholds that trigger additional protections or suspension of certain work or studies. Preparing railroads, normal roads and other parts of the public from the intense heat effects or making them more heat resistant; otherwise you risk bent rails, melting bitumen etc. Distributing fans or subsidizing cooling equipment where appropriate. Strengthening electrical grids to cope with increased cooling demand, subsidizing electricity costs during declared heat emergencies, expanding renewable generation to reduce the emissions associated with increased cooling needs.

0 views
Stone Tools 2 weeks ago

Visual Basic on the PC w/Windows 3.1

If I dig deep into my own heart, really self-reflect, I find I simply don't possess whatever people like Bill Gates and Elon Musk do. I think most of us are content to know we've touched a life or two, helped make someone's existence a bit more pleasant, and can feel gratitude toward the universe for those small miracles. Others seem to know no limit in their acquisition of influence, power, and wealth. For them, it isn't simply enough to guide an industry, they must be the industry. In this zero-sum game, there is no upper limit to their cravings Before Musk became the first (I'm choking on the word) trillionaire , Gates was the world's richest person for a couple of decades. Like Musk, he crossed a specific monetary milestone back in 1999 as the "first person with a net worth exceeding $100 billion," about $200B in 2026 money. How he earned it and what he did with it has been the subject of any number of documentaries , books , movies , interviews , depositions , and damning rumors . I think the media can agree on at least one point relevant to our discussion today: Bill Gates was hellbent on owning the entire personal computing landscape. He said as much, out loud, on stage, to industry professionals, in front of the press. Jacqui Morby recounted the story on The Computer Chronicles . "Gary (Kildall) got up (at the Rosen Forum panel discussion) and talked about what his plans were for CP/M and where the company was going, and then made a comment, 'Well, this is a very large market, and there's room for lots of companies.' Bill Gates interrupted and said, 'No, there'll only be one company.'" He didn't seem particularly interested in creating innovative things, so much as he wanted to make sure that the innovations of others had a Microsoft response. While working with Apple to develop software for the original Macintosh, Andy Hertzfeld recalled a story of Gates digging in for system details that didn't really have anything to do with the business applications being built by Microsoft. Shortly thereafter, Windows 1.0 released, much to Steve Jobs's frustration . Jobs wouldn't be the last to feel screwed over by Microsoft "taking" ideas . Another tactic employed by Gates was absorption, the tried and true fast-track to acquiring toys one lacks. Consider the story of Alan Cooper . Coincidentally the idea for a visual application builder "popped into his head" just as HyperCard debuted, in 1987, triggered by Microsoft's announced adoption of DLLs, dynamic link libraries, which provided easy access to core operating system functions to whomever wanted to tap into them. Cooper saw this as a unique foundation upon which to build a kind of "construction set" for the DOS visual shell of your corporate dreams. Don't like the default Windows shell? Build your own! Microsoft engineer Gabe Newell was super impressed with Cooper's demo of the construction set, then called Tripod, and arranged for a demonstration for Gates. From the excellent article, "Something Pretty Right" by Ryan Lucas. "Why can't we do stuff like this?" is very revealing phrasing, IMHO as an armchair psychologist. Give that line to 1,000 actors and you'll get 1,000 unique performances balancing the tension between frustration and longing. As a Very Rich Guy™, there was nothing Gates wanted that he couldn't have. Like someone who pays others to level up their RPG character , US$1M and a contract later, Tripod (renamed Ruby) was his. While Cooper insists that HyperCard had no influence on the creation of Tripod , Gates most certainly was thinking about it. In his article "The 25th Birthday of BASIC" for BYTE Magazine , October 1989 ( Visual Basic would debut in 1991). Ruby was reformulated into something with but a passing resemblance to Tripod . Its bespoke scripting language was replaced with a variant of BASIC, and the goal of the program was no longer to build shells on top of the Microsoft DLLs, but to build applications for Microsoft's own shell, Windows 3.0. Visual Basic was born, arguably a more profound product than Cooper's original vision. Credit where it's due, Gates saw potential that Cooper himself couldn't see. A while back, I dug into Apple's HyperCard . Visual Basic gives us an interesting opportunity to look at a similar first-party, visual programming solution from Microsoft's perspective. Like HyperCard , Visual Basic had its own dedicated magazine , and inspired legions of developers long after Microsoft ceased support in 2008. As recently as 2023 , Microsoft has had to issue official statements on their support plans for "classic" Visual Basic, which keeps a huge number of bespoke, legacy applications alive, something HyperCard cannot claim. The Microsoft vs. Apple wars of the day almost necessitated taking sides, but in truth each has something it could learn from the other. Visual Basic 3.0 was the last pure 16-bit application in the line, and was the first version to include robust database capabilities. The true potential of the product was unlocked. This particular OS/application combination is much more in keeping with the spirit of this blog, I feel. There's a lot to learn. When I studied HyperCard , I noted the 1,000 page book that awaited me. Visual Basic ships with 3,000 pages, to say nothing of the wealth of 3rd party publications; an industry unto itself. As a man who recently took another annual step toward that great Blue Screen in the sky, every tick of the second hand gently rattles my bones. For large projects like this I have to consider how quickly I can get up to speed. Well, given the temperament of training books of the day, I suppose the proper first consideration is, "How dumb am I?" I refer to myself as a "big dummy" in blog posts, and I stand by that assertation, but I don't like it when others call me dumb. I can handle more complex material, but like I said, I don't have a lot of time. How quickly can I learn Visual Basic ? That seems unabsorbably fast . Maybe if I didn't sleep? I think I'd forget everything by Monday. Also by Tuesday. "Proglaming" sounds like fun, but a week is still too fast for my pace. Getting closer. Perfect. Slow enough for an old man to follow; fast enough to finish with time to spare before involuntary admission into a retirement home. If I weren't 40 years too late, I'd throw my own hat into the publishing ring and combine "I'm a big dummy" with "I want to learn this quickly." It's been a long time since I last touched Windows 3.1. It's funny, my memory of it doesn't match my hands-on experience today. I recall it being far uglier, though it still suffers from absurdly large title bars which don't provide much in the way of information or utility. I dig that (VGA mode) powder blue , though. It's handsome if perhaps uninspired, the result of a collaboration between Microsoft and IBM for OS/2's Presentation Manager (which predates Windows 2.0). Their "Joint Development Agreement" gave pretty broad latitude to both companies to use, without licensing fees, code shared between the two companies. I'm not even tangentially familiar with law, but it does read, in part: That gave Windows 2 and 3 a nice glow-up after the flop of Windows 1.0. Initially, even Microsoft had trouble getting their own developers to build Windows applications. I imagine it must have been a huge relief for Gates to have a tool that not only made it easy to build Windows applications, but that could even be an enjoyable experience. Jumping into Visual Basic , the first impression is, "I can do this." It looks approachable. I can't explain what every button in the toolbar does, but some of the basic stuff is as easy to identify as in HyperCard . Adding a control, like a text field, is a double-click away. The "Properties" panel makes intuitive sense, for tweaking the characteristics of a selected control, something HyperCard lacks. Appending code to a control is as simple as double-clicking its instance in the window. "Properties" is context aware, only showing what can be tweaked on the selected object. For the large part, the industry abandoned this contextual approach. I wonder why? PageMaker was leaning that way with its control panel, and InDesign promptly threw that away in favor of persistent controls for things that aren't even in the current document context. Why do we need text kerning tools on screen when there's not even a text box in the current document, in Affinity for example ? Tools like Figma , Apple's Pages seem to have kept the contextual flame alive, which is nice to see. "Pros want every tool on-screen at all times," a UX consultant once said with a straight face, I guess. The toolbar could stand to be better organized and starts gesturing in the direction of that meme image about Microsoft's love of buttons . They certainly did lean heavily on this UI metaphor crutch, as a catch-all way of cramming in as many features as possible. It's confusing at times (why a "picture box" and also "images?"), but with this version of the program, on this operating system, things haven't gotten completely out of hand yet. We're getting up to speed on the controls and how to interface with them today. Let's consider some nice things about Visual Basic's approach. I am rapidly growing to appreciate the keyboard shortcuts for UI elements, like buttons and sliders. Visual Basic makes it super simple to add a keyboard hook to an on-screen control. Simply label a button with in the confusingly named "caption" property and the following character will become the keyboard shortcut, via . So, an "Exit" button with the "caption" will read and will function identically to a mouse click on that button. When I say "identically" I do mean identically. The button's built-in method will be triggered, the same as if a mouse had done it. We don't have to worry about bifurcating control logic between keyboard and mouse for such interactions. We're then treated to an amuse bouche of off-kilter things to come. Checkboxes and radio buttons both have an on/off state, where any number of checkboxes can be on/off, but only one radio button in a set can be on. When programming with these controls, checkboxes return a value of or to represent unchecked or checked. Radio buttons return a or boolean on each of the options. For now, we'll file this under "Things That Make Me Give a Skeptical Sideways Glance." After spending a couple of days with it, the built-in text editor is driving me crazy, a "feature" Visual Basic shares with HyperCard ; neither is good. I can excuse a lack of autocomplete, a tool that would debut with Visual Basic 5 , as "Something Yet to be Invented." I cannot excuse the lack of indentation assistance and word-wraps, both already common features in word processors of the day. Microsoft has given us a smidge more than the absolute bare-minimum for a text editor. Keeping code tidy and readable requires significant, diligent effort on my part; it's not coming easily to me. I appreciate the auto-capitalization (though Basic is case-insensitive) and coloring on language keywords, but syntax checking and formatting a line of text the instant I've repositioned the cursor is annoying. Unfinished lines throw up modal dialogs warning me of interpreter troubles, triggered as easily as moving the cursor up or down for a moment. It's unwieldy to sketch out a code block to fill in the details later with those constant interruptions. It would be nice to be able to trigger the parser on-demand. We're learning about the mouse and how to handle mouse events. From a programmatic standpoint, this is pretty basic stuff. One of the nice things about the code editor is the pulldown in the top toolbar surfaces all possible functions for a selected UI element. We don't have to try to remember the exact name and spelling of a function; just pick the one you want to edit and get started. A setting that is theoretically interesting is the default unit of measurement for elements. Until now, I'd never heard of "twips": a "twentieth of a point". Where a point is 72/inch, there are 1,440 twips/inch. Windows used this as a device-independent standardized unit of measure. For on-screen, a conversion to pixels was used, and for print a conversion to printer resolution was used. Any form you design in Visual Basic can be trivially sent to the printer with a simple Basic call, and it will print at the resolution of the printer, not your screen. The coolest trick, though, is "edit and continue." Because the program is being constantly interpreted, not compiled, we can run the program, pause it, modify the code, and continue live execution. This is super handy for iterating solutions to annoying bugs. The Microsoft-faithful have really never known a world without this. The Apple-faithful have had this tantalizing fruit dangled before them a couple of times now, never quite delivering on the promise. I like it. In building out WIMP applications , we need to fill out the "M" part of that acronym. Today we learn how to build menus using the "Menu Design Window." The tool is competent, if a bit inelegant. Initially, it is easy to bang out a rough outline of an application's menu structure without taking one's hands off the keyboard; mouse-free is always a welcome option. Type a menu item, hit , type the next, hit , and the next, etc. Then, apply structure to the menu with the on-screen arrow tools for indentation/reordering elements. Alas, we cannot indent at the time of menu item entry, that hierarchy must be set in a separate step later. One disappointing absence is any kind of relationship between menu elements. Moving a menu item with "submenu" items will not move those submenu elements with it. No "outliner" style editing, ala ThinkTank , here. We also cannot multi-select items to edit them as a group, something we can do with form controls. Slow, patient, one-at-a-time editing of menu items is all we get. To be fair, menus can be programmatically generated, which may honestly be a better option in many ways. That pulls us away from the "Visual" in Visual Basic , though, don't it? The design window also forces its vertical editing into a horizontal view, another "Things That Make Me Give a Skeptical Sideways Glance." The example in the screenshot shows a 3-level menu, and I'm nowhere close to filling that horizontal space. It's wasted screen real estate, made more aggravating by the fact that the menu design window cannot be resized . As I think many in the industry have internalized by now, an editor view should place its primary content front and center, with refining elements playing a supporting role. The menu item properties would be much better served filling the right-hand side of the window, giving the menu itself vertical breathing room on the left. It's one of those things that probably gets better over the years, but is conspicuously half-baked for version 3 of the product. "It's OK, but I expected better by version 3," will be a running theme going forward. Now that I've been at this for a week, the angle of approach to visual programming HyperCard and Visual Basic each take has come into sharper focus. Initially, their superficial similarities led me to expect more direct parity between the two. Both provide a visual toolkit for designing interfaces. Both use a more simplistic language than the core language for each platform. Neither is truly "object oriented" (if that's important to you). Both were killed despite amassing a large, passionate following. Even a simple inspection of their toolbars highlights the philosophical difference between the two approaches. Most of the HyperCard toolbox is devoted to drawing pictures, with the controls reduced to buttons and text fields. It is constantly surprising to me how much mileage is squeezed out of such a restricted set of UI controls. Microsoft, on the other hand, offers a toolbar button for each and every thing you might want to add to an application. They take inverted approaches. Where I might add a generic button in HyperCard , then attach a script which invokes the system file browser, Visual Basic gives me a pre-built file browser control to drag into my app. I prefer Visual Basic's approach of "drag out a rectangle to define a control," especially for buttons and text fields; it feels more modern in its UX. HyperCard makes us add controls strictly by pulldown menu, then we have to drag the corners of the button, with no visual indicators, into the new size. Surprisingly awkward. Visual Basic also earns points in offering a grid to snap elements to position, making it much easier than HyperCard to align and scale elements precisely with one another. Gotta do a lot of eyeballin' on the HyperCard side of things; its grid only works in paint mode. Consequently, laying out something like a calculator is much faster and easier in Visual Basic , at the expense (?) of looking exactly like any other Windows program ever made. (Although the demo calculator doesn't look anything like the actual Windows calculator?) Don't get me wrong, conformance to corporate homogeneity may be exactly what you need at times and Visual Basic can generate something "professional looking" in a jiffy. It is, perhaps, devoid of character, but it also creates something a Windows user can look at and trust. Breaking free of those somewhat rigid constraints requires considered effort in Visual Basic , whereas HyperCard practically begs us to go hog wild. We're firmly in "learning Basic" land here; the application itself doesn't have a whole lot else to it. The panel for exporting our .exe files is about as barebones as one could imagine. There's a color palette, but I'm not entirely clear why; colors for controls can be set in the Properties palette via its own popup color palette. I should also give a shout out to the built-in Help system. Though I wish it were context aware, there's an absurd amount of information available right there in Windows without having to crack open the 10 pound manual. HyperCard has Balloon Help, which is nice and cute, but also anemic; we only get as much explanation as fits in a couple of sentences. Visual Basic's help system gives lengthy, detailed explanations of topics with code samples, is searchable, is bookmarkable (!), has tutorials for understanding the principles of the program, and more. It's quite good! The last week of my training book gets intense with discussions on make files, database connectivity, MDI (multiple document interface), DDE (dynamic data exchange), interfacing with DLLs, and so on. We've only been building throw-away toy applications so far, and I honestly don't feel the book has mentally equipped me for these hairier discussions. It's a pretty significant cognitive leap from the simplicity I feel the product promised. The long and the short of it is, I'm learning enough Basic to squeak by and get a sense of its tempo and grammar, but as a first-time user I find it more overwhelming than HyperTalk. HyperCard and Visual Basic each come with a 600+ page language reference guide. Microsoft also throws in three more manuals, another 2,400+ pages, for good measure. Its language guide would expand to 1,000+ pages in Visual Basic 4. Brevity is the very soul of cowards, I guess was their stance. Though their language reference guides are similar length, Microsoft's is a far more dense, dry tome. Apple spends the first 150 pages talking about "What even is programming?" and the last 150 pages getting into topics outside the scope of HyperTalk; a slim 300 pages to describe the language. Let's examine some concrete examples. Here's how to make the system thrice on the click of a button in HyperCard : Here's how to (ostensibly) do that in Visual Basic 3: Full disclosure: this didn't work, even though it is the example given in the "Programmer's Guide." Something is coalescing the three beeps into one. DOSBox-X issue? Because scripts are kind of "embedded" into their respective HyperCard objects, we don't have to disambiguate subroutines with prefixes; any given script is scoped precisely to its associated GUI object. It's the La Croix of object orientation; just a whiff of a hint of that flavor. HyperCard's approach lends itself better to casual tinkering around, but Visual Basic has an edge in surfacing all functions of our application in the code editor. In HyperCard we have to remember which object contains which code block, or hunt through all objects individually, searching for the code we want. Visual Basic's approach requires unique names for all subroutines. This makes it fairly trivial to trigger events across objects. If we want a button to click another button by proxy, we would have to do something like this in HyperTalk: Sometimes I wish HyperTalk would allow dot-syntax for object specifier chains. In Visual Basic, we simply call the uniquely-named function directly: Where HyperTalk takes a gentle, English-like approach to its language, Visual Basic isn't afraid to be far more "programmery." HyperTalk developers can certainly get into their own weeds trying to figure out the precise incantation to sidestep the interpreter and achieve specific goals. Conversely, Visual Basic developers could quickly find themselves in a world of memory management, DLLs, batch files, and make files. Both developers feel some pain, but one is kind of orthogonal to the other. Your preference may depend on which breed of demon you enjoy slaying. As clearly evidenced by the Voyager series of software and MYST , highly professional software was possible with HyperCard . That said, the upper boundary for Visual Basic feels much higher. As a simple example, with the keyword we can reach in and directly call the Windows Kernel (or any existing) DLL; this of course being the killer feature that triggered Alan Cooper to develop the program in the first place. That's impossible to do out-of-the-box with HyperCard ; it cannot access the Macintosh Toolbox so deftly. Likewise with database data, Visual Basic gives us flexibility in what kind of data to bring in, like dBASE or FoxPro . There may be specialized stacks or XCMDs (plugins) to HyperCard that can assist with these tasks, but nothing native to the program. However, HyperCard provides its own built-in database free of charge, requiring no special effort on the developer's part to leverage it. Building something like an address book is simply a matter of adding some text fields to a card. Those will function like fields in a database by default, and actions like saving/loading user data will happen transparently. Adding search, or something similar, takes a few extra steps, but is conceptually simple through a HyperTalk command like Visual Basic provides a "Data Manager" module, which allows us to create simple Access databases for use as the backbone of the application. This is all explained in detail in the supplemental 300+ page "Visual Basic 3.0 Professional Features, Book 2." Once the database is built, interfacing with its records is straightforward using the "Data Control" tool. When the database is linked in properly, controls like images and text fields can be wired up directly to their corresponding fields in the database schema, called "bound controls." The database widget itself provides buttons to step through records and corresponding data will auto-populate the bound layout elements. If "browsing" is the extent of your database needs, you're in good shape. I imagine most will want to do more than that, perhaps adding fields, or doing search queries. You'll want to steel yourself, because it gets gnarly real quick. I'll just say that the book is 300+ pages for a reason, with talk about complex subjects like Dynasets, Snapshots, Tables, the JET engine, SQL queries, and more. It's far more capable than HyperCard , as we can work with multiple databases in our VB application, access remote databases, and more. That power is paired with an equivalent learning curve, one which is thrust upon any developer who needs even a tiny bit more than the drag-and-drop controls provide. Overall, it would be fair to call the IDE "competent." It contains the tools we need, arranged by palette, and makes certain actions (like adding a button) as easy as a double-click. What's not to like? I think what frustrates me about these tools is how they feel like somewhat careless design solutions to their respective problems. Look at the "Properties" palette, for example. This looks, to my eyes, like a developer was told, "The properties for a selected object should be available for editing." The developer iterated them as a literal list, adding some basic editing niceties, like making a color chooser available when a color property is edited. What I find in practice is that the vast majority of the properties go untouched, especially for something like a Form object, and the ones I actually need require scrolling through a long list to find and edit. Later properties in the list, even those which are common to all controls, shift around in position depending on how many properties a given control has. I'm constantly having to read through that list, scanning for the "Name" property, which is where we set the programmatic name for the control. It's arguably the most important property , and it's playing peek-a-boo. When I make a new form (a "form" is a window; I don't know why they call it a "form") I have a few things I need to set right off the bat: the size, the title, and the programming reference name. After that, sometimes I want to set the background color. We'll ignore the fact that property names don't make sense; naming conventions had perhaps not yet been firmly established in an era when the terms UI and UX had not yet become common vernacular. From a pure, "What is the user most likely to need?" point of view, this simple alphabetical list is the laziest solution to the design challenge. Fair point, HyperCard's lack of any properties palette was more lazy, but this is version 3 of this product. I frankly (perhaps unfairly) expect more considered effort from a first-party solution. My frustration extends to the main toolbox as well. It's just a bunch of buttons with no organizational structure applied. Tooltips, similar to what we understand today, were introduced with Macintosh System 7 as "Balloon Help" the same year VB3 released, so I can't fault Microsoft for "failing to implement" them in this release. Still, icon-only is a lazy way to handle it, when the goal is to shove as many icons into the toolbar as possible. Asymetrix Toolbook 3 , a similar visual IDE for Windows development, provides more robust, logically arranged tools for the job. Here's the text editor and object properties panels. Note in particular a few things: Visual Basic itself contains a similar contextual help in other parts of the application, like its "Crystal Reports" tool, making its absence in the main app even more frustrating. This kind of haphazard application of tools and controls feels sloppy, which reminds me of something I wanted to talk about. While going through the official manuals for Visual Basic , something kept bothering me. I couldn't put my finger on it at first, but once I saw it, my eyes were forever cursed . This is a small grievance, "petty" some would say, "a colossal waste of mental resources" others may scoff. But what's a tech blog without a certain level of pedantry? I'm not above pedantry. Here we see the Visual Basic 3 manual is laid out in Helvetica and Times. Man, I'm already bored. Anyway, beyond the utterly pedestrian font choices (in fairness, they did have to lay out 3,000+ pages of this stuff), something seems "off" about it. In particular, that Helvetica looks malformed, with sloppy kerning and unbalanced strokes. Let's take a closer look. Helvetica Neue doesn't match, and Arial (my original suspect) is ruled out by the end caps on the capital "C". Helvetica Condensed is also not right. Wait, I see what's happening. It's the same issue I have with the user interface, manifested in the manual. This isn't Helvetica Condensed, it's Helvetica physically squashed into a fake condensed version. The richest man in the world couldn't afford to buy a proper condensed font for his company? "Or is this indicative of a deeper issue?" he asked, slipping back into his pop-psychology armchair. It smacks of "good enough," never striving for "great." That kind of sums up my feelings toward Windows and Windows applications of this period. The stuff worked, and had obvious success, but never seemed to be borne of thoughtful consideration. Did that inattention to detail come from cost-cutting measures, or perhaps some kind of cultural blindness? Were the deficiencies seen and ignored, or simply not seen at all? And that reminds me of something else I wanted to talk about. In the PBS documentary series, Triumph of the Nerds , Steve Jobs famously said of Microsoft, "They have no taste." I genuinely think Bill Gates could not understand the meaning of Jobs's accusation. Or rather, he couldn't fathom why "taste" should enter into his calculus whatsoever. Having no taste didn't stop him from becoming the richest man in the world. What does "taste" have to do with stockholder value? When Apple teased with a new release of OS X, "Redmond, start your photocopiers," I think Gates was thinking, "Of course we will. Thanks for the free R&D." He bristled at being publicly chastised for copying , but my read on that is he really wanted to say, "So what if we copy Apple? Why shouldn't we? Look at our success and tell me it hasn't been a good strategy." What Jobs saw as creative bankruptcy, Gates saw as business efficiency. Being asked to frame his success on Jobs's terms ruffled Gates's feathers. Jobs said, and I agree, that innovation means saying "no" to 1000 things before saying "yes." "Process" is that very action. "Process" is the pruning of the possibility space. It's the self-awareness to distinguish "good enough" from "great." It's when you step away from your work, give it the critical stink eye, and apply taste . That's an impossible task if one has no taste to begin with. So what's a tasteless corporation to do? While Microsoft may have not cared too much about process, they had manufacturing down cold. Put in PenPoint OS, out pops Windows for Pen Computing. Put in OS X 10.3, out pops Windows Vista. Put in Java, out pops J++. Put in a Dreamcast, out pops an Xbox. Even today, similar "factory production" charges are levied against them. I'm not suggesting they "stole" ideas so much as they simply seemed content to let others do the hard work of saying "no" 1,000 times. While they may have shortcut the creative process, they still had to learn how to manufacture products. In so doing, they accidentally picked up a little taste along the way, which would lead to pretty good stuff from time to time. It's been part of the fabric of the industry for decades, and now the torch of manufacturing tasteless product from the creative work of others has been passed on to generative AI. To scale , no less. The ramifications weigh heavily on my mind, especially when someone publicly calls for the absorption of my work into the generative AI apparatus. I'm both flattered and appalled. On average, how many times do you think I rewrite the introductions to these posts? How many thousands of words have I thrown away to reach something approaching what I wanted to actually say? I tend to rewrite intros 3 or 4 times, and I mean that truly; each rewrite is radically different from the others. In this post alone, I have thrown away some 5,000 words. Some might think those 5,000 words are the cost of the process, but that's not right. They are the process. The unpublished words are the important ones. Those are the words that got me to these words. Knowing that, throw any creative work into the generative wood chipper and it should be obvious why what comes out cannot live up to the original. It's lacking the 1,000 nos. I'm disappointed in the ending of this book. Day 21 comes and goes without even a hint of acknowledgement that we've made it through the gauntlet. At the end of it all, we also haven't built anything of value. Every chapter created little baby programs to illustrate specific concepts; no project built upon a previous project except for a few shallow, superficial glow-ups. Contrast that with HyperCard , where we had a full-fledged address book, with database, search, custom art, and save/load. With Visual Basic , I never felt that same spark I did with HyperCard . Visual Basic seems great for when you have a strong idea of what you want to build. However, its lack of drawing tools and "don't worry about it, I've got you covered" database curtail creative exploration far more than I would have predicted at the beginning of my studies. Not having to worry about those details opens up a wider world of "lemme try something real quick" experimentation and iteration. In an ideal product, I'd combine the prototyping strengths of HyperCard with the professional-strength of Visual Basic . Then, later we could swap out the default database with Access, or export the placeholder drawings as image assets for a professional artist to clean up in another revision. I cannot personally find a place for Visual Basic in my heart, but I can absolutely understand why it took off. It filled a major gap in the programming landscape, helping amateurs and pro-ams build tools for themselves, and even throwing a lifeline to a generation of COBOL engineers needing to transition ASAP. Like Apple with HyperCard , that gap was re-opened by the discontinuation of the product, abandoning a whole fleet of developers and, perhaps just as importantly, potential developers. I suppose nothing lasts forever, but these companies are worth multi (choking on the word again) TRILLIONS of US dollars. At valuations like that, with the fealty they demand from us, I consider it a moral imperative for them to provide excellent tools which empower the widest possible breadth of users' skill levels. Not providing such tools is a choice . Considered from another angle, I'll leave you with this open question. What software do Apple and Microsoft provide today that will be spoken of, with the same reverence as HyperCard and Visual Basic, 25 years from now? Ways to improve the experience, notable deficiencies, workarounds, and notes about incorporating the software into modern workflows (if possible). With Visual Basic 3, 2, 1, and DOS 1.0, the applications you build are 16-bit only and are therefore relegated to running only in virtual environments on 64-bit Windows. If this fits your modus operandi, you're in good shape. If you're hoping to keep it old-school, but still want the option of running your creation on modern hardware, then you'll want to get Visual Basic 6 up and running in Windows 2000? XP? I tried it in Windows 98SE and it wouldn't launch. VB6 builds 32-bit applications as standalone, compiled executables, can connect to the Internet, and produces builds which run on Windows 10/11. Note that Windows 11 promises to run applications built with VB6 , but does not promise to run VB6 itself. However, I gave it a shot and though there were issues with the install, and the IDE acts a little weird, and it complains on launch about missing OLE files, it did run and I was able to build an executable on Windows 11. For funsies, here's Gates and Jobs demonstrating their respective visual programming environments. Gates giving a subdued demo of the just-announced Visual Basic 1.0 . His voice cracking at 0:33 is adorable . Jobs had just returned to Apple after they bought NeXT, and here he's showing the technology Apple has bet its future on. We know it today as Xcode , but it started life as Interface Builder . The line he drew between components in the demo was called a "binding," something that has conceptually resurfaced in SwiftUI. DOSBox-X 2026.01.02, Windows x64 build. CPU set to Pentium DOS reports as v6.22 Host system folder mounted as drive C:\ holds Windows Windows 3.1, basic installation 1024 x 768, 32K colors under DOS reports total RAM, but Free only reports . Good enough for today, but 16-bit Windows should be able to register 4MB, not just 2MB. A few extra applications for comparative/convenience reasons: Toolbook, Actor, ObjectVision, Acrobat Distiller Visual Basic 3.0 Reports 386 Enhanced Mode enabled Reports free RAM In lieu of tooltips, at the bottom of the current window we have a contextual description of the current tool, much like Bank Street Writer and Lotus 1-2-3 . The text editor includes indent/outdent tools, can set our editing font of choice, waits to check syntax until we ask it to, and even includes a simple "build a function" utility to wire up common tasks to common UI events. The properties panel is laid out hierarchically, keeping the most-needed stuff front and center, while demoting less-used options to secondary emphasis. DOSBox-X ran everything smoothly and without issue. I did not install Windows on top of real DOS, though. I relied on DOSBox-X's implementation. This may account for a couple of strange issues, outlined below. I experienced one crash in Visual Basic 3 , when accessing the Help system. Issuing a looped command resulted in only a single system beep. My guess is that something in the emulated environment is suppressing this. I could never get databases to connect, even the ones that ship with Visual Basic , let alone any personal data carried over from previous database explorations. It may be the result of DOSBox-X using an emulated version of . Strangely, I saw it work once and then it stopped working as suddenly as it started and never worked again. An installation of Windows on a proper installation of MS-DOS might fix this problem.

0 views
Blargh 1 months ago

Quake demos raytraced again

This is a follow-up to a previous post about raytracing Quake demos . But first, the money shot: And flat shaded and textured videos. Youtube is Very Aggressive™ with its compression, so the quality there is not good. For pixel quality the above images showcase it better. One of my original reasons for creating the quake demo povray files is that it was a good source of data for 3D experiments. POV-Ray is a great raytracer, though entirely CPU (no GPU) and no longer state of the art. POV-Ray has plenty of built in options, but takes forever to render the 30-60fps demos I want to play with. Also POV-Ray is AGPL now, so nope nope nope nope nope. That’s a dead end. We live in interesting times. We could be living in a time when no two people are running the same email client, or music player, or shell. There used to be a barrier to writing these things custom. I know people who wrote their own shell and use it as a daily driver. I wrote my own email client , and use that. There are many people out there, me included, who are perfectly able to write their own shell, but don’t. For the shell, my need is not above my threshold of putting in the effort. But now? I could, if I ran into more annoyances with Bash. But do you not like Bash ? Just ask the AI to write one exactly the way you want it. If it breaks, well you’re the only user and your fingers are trusted input. “It should be fine” (famous last words) If the static site generator I use for this blog (Jekyll) gives me any trouble, like some Ruby dependency troubleshooting, I’ll replace it with a custom one in a heartbeat. I don’t have to “find” the best renderer, anymore. I can just have AI write a custom one. Oh, but do I have to modify QPov (the demo-to-pov converter) to write a new file format? I could ask AI to add other output format. Or I could have AI write a converter. Nah, I’ll just have AI load the existing POV-Ray files full of includes and macros. Remember, I’m not writing “the perfect general purpose raytracer”. This is not reusable code. I’m just turning my data into raytraced files. I got my initial result in under half an hour. I didn’t save the exact prompts, but they were as short and vague as this: Some notable impressive feats: It’s not povray, but it’s fast. The example 4K frame with antiaalias from earlier took 30 seconds on my laptop (5m39s CPU time). POV-Ray (though admittedly with much more advanced effects) would probably take days . I can now iterate on other things, such as a better way to render the sky and water/lava/slime, and add special effects. I can… but it depends on when I have an itch to continue on this project. Write a raytracer in rust for the files in this directory. The output is a garbage image. Fix it. Make it parallel using the crate. Add optional textures as specified in the input files. I think you got the texture coordinates upside down. Frame 302 has rendering errors. Fix the renderer. Add adaptive antialiasing. It’s a bit slow. Optimize it. Switch to outputting PNG files using the crate. Maximum lossless compression. Add some rendering metadata to the output PNG. It fixed the initial garbage by “realizing” that it could render with POV-Ray, and compare the output. After the initial working version it no longer needed to do that, and didn’t. When the output was no longer garbage it said that it could “see” a hallway now, which made it realize it was done. For the frame 302 rendering bug, it rendered 301 and 303 to compare, and could see a wall disappearing from the rendered output. When working on the problem, it would render an image, and then do image recognition. Yeah, that’s what I’d do too.

0 views
David Bushell 1 months ago

RSS Club #008: Duck duck, swan?

This is an RSS-only post, thank you for subscribing :) If you’re only here for web and tech talk you can skip this one! I rescued an animal today! Probably… The UK has its fair share of canals. I like canals. They cut through urban life offering an escape back to nature and are teaming with wildlife. Canal towpaths are perfect for running. They’re easy underfoot — until late spring when the goslings hatch and then I’m doing a ballet to avoid trouble. Canada goose are the most visible bird living here all year round. They gather in groups and are rather docile around humans until the little yellow fluffballs arrive and then it’s mayhem. Mute swans are a less common sight on the routes I run. This year a pair chose to nest in a safe but visible spot which was wonderful to witness. Swan nests are huge mounds of dirt, twigs, and coke bottles, apparently. This morning I found dad-swan charging back and forth across the water. He stopped to peer into an overflow trench around 2–3 feet deep aside the canal. As I ran closer I saw a young bird has fallen in. It was older than a fluffball but still covered in muddied down. Larger than a duck, for scale. It was still too young to fly out of its predicament. At first I thought it was one of the cygnets. Mum-swan was in the nest with the others not far away. I don’t speak bird but dad-swan seemed more aggressive than concerned. As I got closer he paddled a short distance away to observe. I went down on my stomach and slowly reach under the guard rails wondering how painful a finger-pecking would be. I kept my ears open for a charge attack. The young bird didn’t flinch. It allowed me to reach under its belly and lift it up. Before I could place it safely on the ground it attempted a Loony Tunes escape by running in the air. This unbalanced and forced me to tip it sideways, thankfully onto the stones just below water level and not back into the trench. It then frantically hopped not into the water, but up onto the towpath and quickly waddled behind me into the grass. As I got back to my feet dad-swan returned to investigate and looked satisfied the young bird was gone before returning to his nest. It took me a minute to find the young bird now resting deep in the brambles. It was only then did I realise this might not be a swan but a goose. It was large enough to have outgrown the distinct yellow colouring. I left it where it was hiding. My presence would only cause further distress. It was not physically injured otherwise I might have called the RSPCA who can rescue wildlife ( RSPB don’t; common misconception). I don’t go running with my phone anyway so I returned later to check and take photos. The young bird had vanished from its hiding spot. I’m almost certain it was a goose now after seeing this family not far from the scene. It’s funny, despite being so common I’ve never once seen an actual goose nest. I’ve no idea where they hide them. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views
André Arko 1 months ago

<code>rv</code> plan and progress update

This post was originally given as a talk at Rubycon IT 2026 . The slides are also available. It’s been a while since I first talked about , a Ruby manager for the future . I’d like give an update on what we’ve done since then, but I’m going to recap some of that earlier post first to give context for the updates. If you still remember what I said back then, you can jump to the new stuff right away . Either way, I’m excited to update you about the work that we’ve been doing, and show exactly how far we’ve gotten. For the last ten years or so of working on Bundler, I’ve had a wish rattling around: I want a bigger, better dependency manager. It doesn’t just manage your gems, it manages your ruby versions, too. It doesn’t just manage your ruby versions, it installs pre-compiled rubies so you don’t have to wait for ruby to compile from source over and over. And more than all of that, it makes it completely trivial to run any script or tool written in ruby, even if that script or tool needs a different ruby and gems than your application does. For the entire ten years of daydreaming, I’ve been hoping someone else would build it and I could just use it. Then I discovered that someone did build it… but for Python. It’s called . In August 2024, uv version 0.3 shipped, and it had all the features I had wished for, and even more that I hadn’t thought to wish for. At this point, I’ve been using for almost a year and every time I use a project written in Python, the experience is delightful. Not only can you run a command directly out of packages that aren’t even installed, you can run a command that requires a Python version you don’t even have installed. takes care of installing the right python, installing the right packages, and running your command, in just a second or two. Whether you want to run a CLI tool, a webapp, or a random script, always ensures the environment is correct as part of running the command. Need Python? Installed. Need a package? Also installed. Never again run on a new package, only to realize later you broke something old. No more setting up dependencies manually, only to discover later that the script stopped working inside cron while you weren’t checking on it. Last year, my long time consulting job disappeared and I found myself looking for something to replace it. One of my ideas was to start a company inspired by Geomys in the Go language, offering expert advice from open source maintainers, but the idea felt weak to me without a “spotlight” project to show off our expertise. In July of this year, I finally realized that these two ideas could go together extremely well—our company can show our expertise by building this developer tool, and clients paying for our advice to solve their problems can ensure we are able to support and expand the tool. I talked to some Ruby friends about the idea, and it resonated with them, so we started working on both the company and the open source project. Today, Spinel Cooperative has a website at spinel.coop , and has a website at rv.dev . The team has expanded, and now includes David Rodriguez , the former lead developer of RubyGems and Bundler, as well as former Rails core team members Kasper Timm Hanson and Sam Stephenson . Sam has even done some of this work before, as the original creator of and the tool. Our goal for is to be a new kind of developer tool. You don’t need to install and then pick a Ruby version, install it, and then update RubyGems and Bundler, and then your gems. Instead, you just run the project command you care about, and everything is handled. It’s a version manager, and a dependency manager, and more than both of those things. With that vision in place, we were faced with a very practical question: what can we build that would be useful right away? After some prototyping and a lot of discussion, we landed on precompiled rubies for development work as the most useful place to start, and got to work. After deciding what our first feature would be, we had to pick a language to use. We landed on Rust to build , for two main reasons. The obvious reason is that Rust produces very fast results, and that seems to also be why is written in Rust. The less obvious reason is based on years of trying to onboard new contributors to Bundler and RubyGems—it turns out if you are a Ruby developer, you unfortunately don’t (yet) know the subset of Ruby that we have been forced to use to write Bundler and RubyGems. There are two major things that basically every Ruby program does that you can’t do if you are managing gems. First, you can’t use any gems. If you want to use code that’s inside a gem, you need to copy that code wholesale into Bundler or RubyGems, and then you need to constantly update it anytime that gem has any changes. Second, you can’t use anything with native extensions, ever. JSON gem? Psych gem for YAML? Completely impossible, because Bundler and RubyGems need to be installable even if there is no compiler present. So with those constraints in mind, and with our goal set to “a tool so fast you normally can’t even tell it’s running”, we settled on Rust, and started building a CLI. I’ve used Rust for smaller personal projects in the past, but I had never created a full CLI tool. I am happy to report that the library for creating CLIs in Rust is great, and I recommend it to anyone interested in Rust CLIs. The next piece that we needed was the actual precompiled Rubies themselves. To install Ruby quickly, we needed to be able to skip over the dance. There are a couple of big projects out there compiling Ruby in advance, but they are mostly for use on servers. The GitHub action, and the official Ruby docker images are both based on the project originally started as part of . Unfortunately, those aren’t usable for our needs because they aren’t statically compiled and relocatable . Statically compiled (as opposed to dynamically compiled) means that Ruby copies the code from a shared library into its own binary. Now for small aside (but it’s relevant, I promise). Have you ever had trouble compiling Ruby because of OpenSSL? I’m pretty sure every Ruby developer has. Have you ever had an already-installed Ruby suddenly stop working because of OpenSSL, and you had to install it again? That also seems extremely common, thanks to Homebrew’s aggressive auto-update policy. The good news is, fixes both of those problems. By putting OpenSSL inside the Ruby binary, they can never get separated, and those errors can never occur. There is a tradeoff here—if there is a critical security flaw in OpenSSL, we will need to compile Ruby again to include the critical security update. The first reason we are okay with this tradeoff is that OpenSSL doesn’t have huge security issues very often. The second reason we are okay with this is that your production servers are probably using the official Ruby docker images and not Ruby installed by , so it’s even less of a concern. In the end, the closest existing system we were able find was Homebrew’s project. That’s how Homebrew builds the Ruby install that Homebrew itself runs on. The Homebrew team built some excellent infrastructure for building a statically linked Ruby, including libyaml, openssl, and other required libraries. The big thing Homebrew did not do was build more than one single version of Ruby, or support YJIT. We’ll come back to that in a bit. The part of is about builds being relocatable. Since Homebrew needs to be able to install into on x86, but on Apple Silicon, and into any user’s home directory for Linuxbrew, they need to be able to take a single precompiled Ruby and put it in any location on disk. That’s another one of the requirements that isn’t met by the or Docker image Rubies—if you move them to another directory, they stop working. Using Homebrew’s as a base, we were able to start with macOS ARM and Ubuntu x86, add Ubuntu on ARM, and then build every version in the Ruby 3.4.x series. Once we had those ready, then we asked ourselves: how much tooling do we need before this is useful for developers? Just linking to a repo with Ruby binaries in it isn’t really that helpful, because if it’s harder to use than running , it’s not really a better or faster experience. We landed on a small set of useful features for the first version: the latest Ruby minor version, 3.4, built for macOS ARM and Linux x86, with support for files, and automatic Ruby version switching just in zsh. After a few weeks of work, could switch between installed Ruby versions in zsh, but most importantly it could install precompiled Ruby on macOS and Ubuntu in one second flat. Yes, you heard that right. . Wait 1 second. Done. You can run Ruby commands now. With that functionality in place, we released version 0.1. Immediately after our initial release, we were hit with an extremely nice surprise: someone from the Homebrew core team decided to add directly to homebrew-core within a few days of 0.1 being released. That makes it much easier to install and try it out, and completely removes any need for us to create and maintain our own custom homebrew tap, which is a very nice bonus. With proof our concept working and users installing v0.1, we immediately started to expand the core functionality. We added support for bash, fish, and nushell. We spent several weeks working through the issues involved in compiling every single point release of Ruby 3.3 and 3.4. Then we spent another two weeks working through all of the issues compiling all of those Rubies with YJIT turned on. Then we spent another two weeks working through the issues of compiling all of those Rubies for macOS on x86, and for Linux on ARM. Once all of those Ruby versions were available, we shipped version 0.2. Building on our progress with Ruby versions, we added more versions of Ruby: every 3.2.x version, and all of the 4.0 prereleases and final releases. After hearing from and users who wanted to re-use their file, we added support for that file as well. Automatic Ruby switching will respect files, and will update the version written into the file if it exists. As a fun easter egg, we also added a precompiled binary of the oldest version of Ruby with published source code, 0.49. All of those features shipped as version 0.3. At that point, we took a break to take stock of the project, our goals, and our plan. 0.3 is a pretty good Ruby version manager, and a viable option in the pantheon of Ruby version managers like , , or . While precompiled Ruby is great, we want superfast installs for not just Ruby but also all gems and bundles. But Bundler is huge! It took three of us a year to build originally, and has had 15 years of additions by dozens of contributors. We can’t build everything we want in a month, or even three. After much brainstorming and discussion, we made a plan to deliver real-world useful tools that would build on each other, so we can work our way up to a complete application dependency management tool. First, we would need to understand gems themselves, parsing the compact index of gem metadata and then reading gemspecs and .gem files. Then we would need to install gems, not just copy files into the right places but also running the steps to compile native extensions correctly. Once we can install gems into the right places, we need to parse the format to install bundles. Then we need to build a resolver, the process that transforms a into a by taking a list of gems and producing a graph of dependencies that are all compatible with each other. With that plan, we got back to work. The first feature from that plan was , which does the same thing as . This is the same thing that you use when you’re running your tests in CI, or that you use when you’re deploying your application to a server. As long as you haven’t made any changes to your Gemfile, we can read the lockfile, install all of your gems, and set up the environment so that your application is able to run. To build this, we implemented a compact index client, gemspec parsing, native gem extension compilation, and gem installation. And it works! Starting with 0.4, you can clone a project, install your gems, and run the project. The next release included a small sidequest to add Windows and PowerShell support, as well as compiling Ruby binaries against musl libc so they will work on Alpine Linux. We use the precompiled binaries for Windows produced by the ruby-installer project, which turns out to be the only existing project that precompiles Ruby. This release also included the next two steps of our incremental plan: first, automatically managing Ruby version and installation. If you , you don’t even need to have Ruby installed, will make sure that happens if needed. The second part was the next step of our gem management plan, taking a list of gems and resolving dependencies to install. When combined, those two features unlock uv-style “tools”, where a gem CLI can also have an auto-managed Ruby version. Have you ever used to get a CLI tool only to find out later your Ruby version changed and broke the CLI? tools completely prevent that problem. With tool support, we could then add gem auto-install to create . Run any gem command, even if it’s not installed! With version 0.5, you can go straight from to a Rails app from in 10 seconds flat. At the SF Ruby conference late last year, a random conversation with Kokubun, the ruby-core member and maintainer of YJIT and ZJIT spawned an idea: what about testing against the latest Ruby? The Ruby version managers that compile Ruby onto your own machine handle this by adding a version of Ruby named “dev” that just means “check out the ruby git repo and compile the newest commit”. It was only a few days of effort to get the ruby compiler handling ruby from git, but it was a few weeks of experimenting before figuring out how to handle a “version” that keeps the same name but changes every day. It was worth it, though, because now you can install and test against the latest daily Ruby build as easily and as often as you want, without ever waiting for Ruby to compile. It’s not quite finished yet, but the next step in our incremental plan is to handle the same responsibilities that the command handles: evaluate the Gemfile, resolve the graph of gem versions, update the Gemfile.lock if needed, and install all of those gems. When I was learning about uv, this part absolutely blew my mind because is so fast that it runs as part of every command! Coming from Bundler, that was completely incredible. I could not imagine running before every because that would make everything so, so slow. It’s very exciting to work toward that for Ruby. That’s not all we have planned, either. The roadmap includes project setup and task management, making it easy to run scripts or other commands with your Ruby and gems available. Managing gems for scripts means adding a config file as a comment inside the ruby script file, with the Gemfile-like information needed to install gems. can then auto-install those gems in order to run the script. It’s not yet clear how long it will take to finish this initial list, even after it’s done we have a ton of additional ideas. As we wind things up, I want to show off a couple of things that I personally think are the best and coolest uses of rv. this isn’t necessarily the stuff that you’ll do the most often, which is fine, but these examples are super impressive to me, coming from the nightmare of ruby version building. First up, : once you have , you don’t need to think about Ruby, you don’t need to think about gems, you just run the command that you want to run, immediately. is fast enough that you can start on a machine with no Ruby installed, run , and be generating that app in less than 10 seconds. One command to install Ruby, install Rails, install all 60 gems that Rails depends on, and run the command you originally wanted. It’s just an incredibly delightful experience to not need to think about Ruby versions or gem dependencies when you want to run something. Another thing that has come extremely in handy is the ability to write scripts across Ruby versions, and know those scripts will work whether or not those Ruby versions are installed when the script runs. You don’t need to care about installing Ruby, or even checking for Ruby at all. Just run the command you want to run and will take care of all that stuff. Finally, the commands (inspired by ) allow you to use CLIs without having to think about Ruby versions, or global gems, or bundled gems, or what application directory you are in. Tools always get the Ruby version and the gems that they need to work, regardless of your currently chosen Ruby version and app and gems. For me, has unlocked the ability to use Ruby CLI tools again, and I love that power and flexibility. In the end, we want to live in a future where anyone can run a Ruby command, or tool, or application in a few seconds (or less!). We’re building that future for ourselves, and we welcome everyone else. Visit rv.dev to see the project on GitHub and give it a try! We’d love to have your help building it.

0 views
マリウス 1 months ago

Bureaucracy is Eating the World

Disclaimer: This is an opinion piece. It is also a long one, because the subject is too tangled to compress without losing the thread. I have tried to look at the matter from different perspectives and include the strongest counter-arguments where I saw them. As this write-up had been in the works for a very long time, some of the referenced data isn’t the absolute latest data available today, which however does not impact the underlying message. As usual, summary at the end. A few weeks ago I sat down with a friend who, after twenty years in a steady job, had decided to start a small business in the European Union. Nothing exotic, just a one-person operation, selling a thing they had been making in their spare time for years and that other people kept asking to buy. By the time we were done, we had identified the trade register filing, the tax office registration, a separate VAT registration with its own threshold rules, the obligation to issue invoices in a specific format, the e-invoicing mandate, the beneficial-ownership disclosure under the EU’s AML regime, the bank’s own KYC questionnaire, the data-protection obligations under GDPR even though the operation collected practically no personal data, the CE marking requirements, the extended-producer-responsibility packaging registration, the WEEE registration, the social-security contributions for self-employed individuals, the mandatory professional liability insurance for the relevant guild, and the local trade-tax filing. None of these are illegitimate and most of them, taken in isolation, sound reasonable. Together, however, they constitute a mountain that my friend, who is a competent adult with a real product, was now expected to climb before they sold the first unit. That is when it occurred to me that the story I had been telling myself for years, that it has always been like this and every generation thinks the system is rigged , might not actually be true, and this post is the result of that thought. I want to walk through roughly three and a half centuries of how easy or hard it has been, in the western world, to simply do something economically. From the period when an Englishman with a ship and a bond could legally attack Spanish merchants for a living, through the early 1900s when an entrepreneur could incorporate a company on four pages, to the present, when the same kind of operation requires a stack of filings most people will never finish reading. I am going to argue that we have drifted, slowly and with the best intentions, into a regulatory state where the friction of doing anything new is high enough that the people best positioned to absorb it are no longer the small operators that once founded the today’s behemoth companies. I want to be clear up front that I am not writing a “libertarian manifesto” . There are regulations I am glad exist, including most of the worker-safety, environmental, and consumer-protection regimes that the post-war west put in place. The argument is narrower than abolish the rules , and it is roughly that the cumulative weight of three centuries of mostly well-intentioned rule-making (almost none of which was ever repealed, btw) has reached a point where it disproportionately punishes the small and rewards the large. That, I think, is a problem regardless of where you sit politically. Let me repeat: This post is not about political ideology and I urge you to read it as apolitical as humanly possible and focus on the real-world implications rather than some abstract political ideas. Also: While I’m no historian, I tried my best to investigate and find reliable information, which I linked where necessary. Anyhow, let me start with one of my favorite periods to dwell on, which is the time … Of course, we’re talking about the era historians loosely refer to as the Golden Age of Piracy (roughly 1650 to 1730). Back then, the relationship between private business and the state in the Atlantic world was so different from ours that it can feel almost like science fiction. If you were an English merchant in 1690, and you wanted to make money by attacking Spanish (or French) shipping, you did not have to do it in secret. You could go to the Lord High Admiral , or one of the Commissioners acting on his behalf, and apply for what was called a letter of marque . The application named your vessel, its tonnage, its armaments, the owner, and the intended crew. You posted a bond promising to observe the laws and treaties of England, and you got, in return, a piece of paper that legalised an activity that, without the paper, would have made you a pirate . The captures were later judged in admiralty courts, the Crown took a percentage (usually 10%, though Queen Anne later waived even that tiny bit of tax as an incentive ) and you kept the rest. This was not an obscure backwater of business, but in fact an arrangement that some of the most celebrated figures in English history operated under. Sir Francis Drake , whose 1577–80 circumnavigation predates the Golden Age proper but established the template, gave investors a return on capital that contemporary sources placed in the order of forty-seven pounds for every pound invested , with Elizabeth I ’s share alone reportedly enough to retire the Crown ’s debt. The exact figures are deliberately obscured in the surviving records ( Elizabeth had diplomatic reasons not to be specific), but I don’t think any historian disputes that the venture was extraordinarily profitable, and that it was funded by something close to a venture-capital syndicate of nobles and merchants. A century later, in 1695, William Kidd received a privateering commission from the Admiralty Commissioners , plus a special commission under the Great Seal , to seize French ships and pirates. His subsequent hanging in 1701, however, was less about the business model than about the fact that he attacked the wrong ships. Whoops , I guess. Note: It wasn’t only privateering that was comparatively easy to establish and run. In one of my favorite books, Moby-Dick , Herman Melville roughly describes how the economics of whale hunting worked at the time. The capital for the endeavour came from the town. A vessel like the Pequod had a couple of principal owners, the retired Captains Peleg and Bildad in the novel, but the rest of the ship was parcelled out among ordinary Nantucket citizens, a crowd of old annuitants; widows, fatherless children, and chancery wards , each one owning the value of a timber head, or a foot of plank, or a nail or two in the hull . A widow could put her late husband’s savings into a sliver of a whaler the way one might today buy a few shares of an index fund, and when the ship came home three years later heavy with oil, she retrieved her portion of the proceeds, minus the owners’ cut for fitting her out. The crew, meanwhile, drew no wages at all. Every man from the captain down to the greenest hand was paid in what was called a lay , a fixed fraction of the voyage’s total net profit, the size of the fraction set by his skill and rank. The smaller the number, the larger the slice, so a seasoned harpooner like Queequeg was signed at the ninetieth lay, while Ishmael , who had never so much as touched a whale, was first offered the seven-hundred-and-seventy-seventh by the pious and tight-fisted Bildad before Peleg talked it up to the three-hundredth. Nobody was paid for showing up, you were paid, if at all, only when the casks were full and sold, which meant every soul aboard owned a piece of the outcome and bore a piece of the risk, no payroll department required. This was not merely a novelist’s imagination, but it was how the real Nantucket and New Bedford fisheries actually worked. Ships were financed by pooling fractional shares among the townsfolk, every hand from captain to greenhorn took a lay instead of a wage, and historians today describe the whole arrangement as a precursor to modern venture capital, obviously with significantly less bureaucracy involved. Looking at the possible growth and power, the chartered companies of the same era operated on a scale that no modern private corporation could legally match. The English East India Company , chartered by Elizabeth I on the last day of 1600, was eventually granted the right to acquire territory, mint coinage, command fortresses and standing troops, form alliances with foreign powers, make war and peace, and exercise civil and criminal jurisdiction over its holdings. The Dutch East India Company ( VOC ) , chartered in 1602, went further and was given an explicit twenty-one-year monopoly, the right to wage war, sign treaties with sovereign powers, build forts, appoint governors, and mint its own coins. At its peak the VOC employed roughly twenty-three thousand people in Asia, fielded somewhere between one hundred and fifty and two hundred and fifty ships at any one time, kept a standing army of around ten thousand soldiers, and over its life sent close to a million Europeans to Asia on nearly five thousand ships. The Hudson’s Bay Company , chartered by Charles II on May 2, 1670, was granted absolute Lords and Proprietors status over Rupert’s Land , an area of roughly 3.9 million square kilometres, or about 40% of modern Canada, again with monopoly trade rights, lawmaking, civil and military jurisdiction, and the authority to wage war. For the ordinary merchant, who was neither a Drake nor a director of the VOC , the bureaucratic environment was correspondingly easy to navigate. There was no income tax, since Britain’s first income tax was a Napoleonic-era invention from 1799 , and there was no business registration in the modern sense. There was no payroll tax, no compliance officer, no insurance mandate, no occupational licensing, and certainly no equivalent of GDPR or beneficial-ownership reporting. The state extracted revenue mostly through customs and excise on specific goods, the Land Tax on real property, the Hearth Tax from 1662 to 1689 (two shillings per fireplace), and the Window Tax from 1696 onwards. In the American colonies in particular, enforcement of even the limited Navigation Acts was famously weak under what historians call salutary neglect , to the point that the Hoover Institution notes colonists in the late seventeenth century killed three customs officers, imprisoned two others, tried one for treason, and persuaded one to join them . That’s a level of “customs compliance” that would definitely not pass a modern audit. :-) Note: Of course there is a romanticised version of this period that isn’t as rosy as it first seems. For example, within chartered English boroughs (London especially), domestic trade was seemingly gated by guilds and the Freedom of the City . The 1562 Statute of Artificers required a seven-year apprenticeship for most trades, which was apparently the only national apprenticeship law in pre-modern Europe, and admission fees in the 16th and 17th centuries ranged from under one pound to twelve pounds and more, which was a substantial sum at the time. Guild monopolies were seemingly a real form of bureaucracy, just not a state-run one. So the open a shop with no paperwork framing is more accurate for rural England, the frontier American colonies, and overseas trading ventures than for established urban commerce. It was the commercial ventures specifically (the ships, the colonies, the trading expeditions) that operated with the kind of low-friction freedom we no longer have, not the neighbourhood bakery in seventeenth-century London, although that bureaucracy was still well below what we are facing in today’s world. The point I want to draw from this period is not that we should bring back privateering or massive chartered companies that can wage wars , which would be both impractical and politically unattractive, but that the basic relationship between private enterprise and the state was, at least for novel ventures, permissive by default . You could simply go ahead , and the state involved itself only when you crossed a specific line that had been drawn in advance. Yet, despite the lack of all modern bureaucracy, regulation and compliance, civilization evolved and societies developed, maybe at times even at a faster pace than we’re seeing it today. Skip forward two and a half centuries, and the world is unrecognisable in almost every way except that starting and running a business is still extraordinarily light on paperwork, even by modern standards. In 1896, New Jersey passed the first enabling general incorporation statute, allowing a company to be formed by simple administrative filing rather than by a special act of the legislature. Delaware followed on March 10, 1899 , and the modern American corporation was born. Before then, every incorporation in the United States required its own legislative act, but after it, you just mailed a form , figuratively speaking. The cleanest illustration of how thin that paperwork was is the document that incorporated the Ford Motor Company on June 16, 1903 . Henry Ford and twelve co-investors signed a four-page Articles of Association in Detroit . The document covered the name of the corporation, its purpose, its place of operation, its capital stock ($28,000), its term, and its stockholders. It was notarised, mailed to the Michigan Secretary of State , and the company was legally constituted by June 17, 1903. The same Ford Motor Company would go on, over the next four decades, to produce the Model T , build the Highland Park assembly line, employ tens of thousands of workers, and become one of the largest industrial enterprises on the planet, all without anyone needing to file beneficial-ownership disclosures, complete a Customer Due Diligence questionnaire, or commission a Data Protection Impact Assessment . The tax environment was also correspondingly simple. The 16th Amendment to the U.S. Constitution was ratified in 1913, and the Revenue Act of 1913 introduced a federal income tax with a 1% normal tax on net income above $3,000 (single) or $4,000 (married), with a graduated surtax topping out at 7% on income above $500,000. Approximately 3% of the U.S. population was even subject to the tax, and under 1% paid anything at all. In Britain, income tax averaged 2% to 3% of GDP from 1900 through 1913, and the super-tax , the precursor to surtax, was only introduced in Lloyd George ’s 1909 People’s Budget . Value-added tax, the workhorse of modern European public finance, did not exist anywhere in the world until Maurice Lauré’s reform was signed into French law on April 10, 1954, and was not mandated EEC-wide until two directives in April 1967. Note: If these are too many numbers and dates and words and you only want to remember one single thing from this chapter, then remember the following: Taxes, as we know them today, did not exist around a hundred years ago, and many of them only go as far back as ~70 years. It is also worth noting that even the way taxes were collected was different. Tax withholding at source, the now-ubiquitous mechanism by which your employer hands a slice of your salary to the state before you ever see it, was introduced in the United States only in 1943 with the Current Tax Payment Act , as a wartime measure to fund the war effort and to broaden the tax base from the wealthy to ordinary workers. Before 1943, Americans calculated their taxes annually and wrote a cheque, which is why tax-day filing was, for most of history, a relatively low-frequency interaction between citizen and state. Many EU member states introduced their withholding tax regimes only between 1952 and 2013. The withholding mechanism is, in many ways, the backbone of the modern administrative state. It works only because there is a persistent identity attached to every worker, a bank account they are paid into, and a payroll system that can route the deductions automatically. Banking, in the same period, was also fairly accessible. There was no formal Know Your Customer regime in the sense we now use it. The Bank Secrecy Act , which is the foundation of the modern American anti-money-laundering regime, was passed in 1970. KYC as a structured set of rules was not codified federally until the U.S.A. PATRIOT Act of 2001 introduced the Customer Identification Program under Section 326 . The Foreign Account Tax Compliance Act ( FATCA ) , which today shapes the experience of Americans abroad and the willingness of foreign banks to serve them at all, was only enacted in March 2010. If you were a working person in 1920 and you wanted a bank account, you walked into a bank, gave your name and address, signed a card, and received an account. There was no requirement to hand over a utility bill, to document the source of your funds, no electronic identity verification, no sanctions screening, and no algorithmic suspicious activity detection. De-banking , in the modern sense of having a financial institution close your account because of who you are or what you do, was not really a phenomenon at all in the early twentieth century. The Oxford English Dictionary records the verb debank as far back as 1929 , but the meaning that contemporary readers will recognise is essentially post-2014. This matters because the people who built the post-war economy did so in exactly this environment. The men and women of the GI Generation (born roughly 1901–1927), the Silent Generation (1928–1945), and the Baby Boomers (1946–1964) came of professional age in a regime where you could open a bank account in an afternoon, file a four-page incorporation document, hire and fire on a handshake, pay relatively low effective taxes, and grow a business through several decades without anyone asking for a beneficial-ownership statement, a tax-residency certificate, a data-protection impact assessment, or a sustainability report. This is not a moral observation about that generation, it is an observation about the environment they built businesses in. Before I move on to what changed, I want to take one short detour east, because it is the cleanest case I know of how much the regulatory environment can matter to outcomes. In 1953, at the end of the Korean War , South Korea had a GDP per capita of roughly sixty-seven U.S. dollars, which made it one of the poorest countries in the world , poorer than most of sub-Saharan Africa and on a par with Haiti. Seoul, its capital, had a population of about one million people and had been substantially flattened during the war. The country had no significant industrial base, no natural resources to speak of, and no obvious path forward. Seventy years later, South Korea’s GDP per capita is roughly thirty-three thousand dollars, the Seoul Capital Area is home to roughly twenty-five million people, and the country is a global leader in shipbuilding, steel, electronics, automobiles, semiconductors, and increasingly cultural exports. This is one of the most extraordinary economic transformations in recorded history. The popular story of Korea being a free-market miracle, however, is half right at best. The serious academic literature, particularly Alice Amsden’s Asia’s Next Giant and Robert Wade’s Governing the Market , makes clear that the Park Chung-hee regime (1961–1979) was an authoritarian developmental state , not a libertarian paradise. It directed credit, picked sectors, suppressed labour, and tolerated heavy chaebol concentration. What the regime did not do, however, was load new ventures with the kind of compliance and regulatory machinery that the modern OECD economies were already accumulating. New industries could be built quickly, factories could be thrown up, ports expanded, ships launched, because the bureaucratic overhead was thin and the political will to remove obstacles was high. I am definitely not holding Park -era Korea up as a model, as the political costs were severe. What I am pointing at is how fast a country can transform when the regulatory friction on building things is set close to zero. It is much, much faster than people who have only experienced modern OECD economies typically realise. The generations that built the post-war west ( GI , Silent , Boomer , and to a lesser extent early Gen X ) accumulated (or inherited) their wealth in this lighter regulatory regime. The generations that came after (later Gen X , Millennials , Gen Z , …) are trying to do the same thing in an environment that has significantly changed under their feet. The U.S. Federal Reserve’s Distributional Financial Accounts are the authoritative source, that shows, that as of late 2024, Millennials and Gen Z together represented 35.1% of U.S. households but owned only 10.1% of total household wealth , roughly 71% less than their household-share would predict. By contrast, Boomers in 1989, at a roughly comparable average age, held 19.5% of wealth while making up 42.2% of households. In other words, younger Americans today are more under-represented in wealth than Boomers were at a comparable point in their lives. Pew Research similarly found that the median net worth of households headed by Millennials aged 20–35 in 2016 was roughly $12,500, compared with $20,700 for Boomers at the same age in 1983, in constant dollars. That is, the Millennial household had about 60% of the inflation-adjusted net worth that the Boomer household had at the same stage of life . Homeownership data tells the same story. Apartment List ’s analysis of homeownership rates at age 30 finds that 55% of Silents owned a home by that age, falling to 48% of Boomers , 42% of Gen X , and just 33% of Millennials . In the United Kingdom, the Office for National Statistics reports that in 2024 the median home in England (£290,000) cost roughly 7.7 times median full-time annual earnings (£37,600), and the Resolution Foundation has shown that it now takes a typical young first-time buyer roughly 18 to 19 years to save a deposit from disposable income, compared with about 3 years in the mid-1990s . The Joint Center for Housing Studies at Harvard reports that in 2022 the U.S. median home price reached 5.6 times median household income, the highest ratio on record going back to the early 1970s. Note: I want to recognize that the wealth-comparison story is more nuanced than the Millennials are screwed narrative that I’m partially presenting here. For example, the St. Louis Fed has also found that, on a per-household basis, Millennials and Gen Z have been catching up rapidly since 2019. Critics, including New America and others, point out that this relies on average rather than median wealth and is heavily skewed by a thin slice of high-earning younger households. Both stories are simultaneously true, depending on which slice of the distribution you look at. The median younger household is materially behind, the average younger household less so. I am framing the argument around the median because that, in my view, is the more relevant indicator of broad opportunity. In addition, the crises that bracketed Millennial , Gen Z and later generation’s lives were not randomly distributed across generations. Those generations experienced the post-9/11 wars in Iraq, Afghanistan, and the broader counterterrorism campaign , the 2008 Global Financial Crisis , the COVID-19 pandemic , the Ukraine war , and the recent war in Iran with all its economic impact slowly unfolding. The cost of these, in the form of debt, inflation, and asset-price inflation through quantitative easing , has fallen disproportionately on the people who were/are not yet old enough to own assets when these events occurred. In fact, the Bank of England ’s own analysis of the distributional effects of quantitative easing acknowledged that a large share of the wealth gains flowed to households that already owned assets, and a 2023 Oxford Bulletin paper found that the asset-price channel of QE increases wealth inequality across most countries studied. There is a counter-argument from central banks that the alternative (a deeper recession) would have hit younger workers even harder through unemployment, and I think this counter-argument is partially correct, but the cumulative effect, on top of the housing-supply story documented by Glaeser and Gyourko , is a generational asset-price gap that compounds. I’m trying to be careful not to slide into a Boomers caused this framing, because that doesn’t appear to be what the data ultimately says, despite everything visually pointing towards this narrative. Boomers themselves appear to be highly stratified, with the median Boomer being noticeably less wealthy than generational averages seemingly suggest. The Urban Institute ’s research on the Great Inequality Transfer emphasises that policy regimes, not generational malice, are the proximate cause. What is true, however, is that the policy choices of the past several decades, made disproportionately by people who were already established in the post-war environment, accumulated into a stack of rules, asset prices, and compliance requirements that the people coming up behind them now have to navigate. In that sense, the current environment can in fact be attributed to the decisions made by Boomers , as well as the generations in their immediate proximity. Which brings me to the actual point about how big that stack of rules has become, and what its distribution of cost is. The U.S. Code of Federal Regulations , which is the codified body of federal regulatory rules, was a thin pamphlet at its origin in 1938. It is now, depending on how you count, somewhere north of 190,000 pages . The Mercatus Center ’s RegData project, which counts regulatory restrictions defined as instances of words like shall , must , and may not , finds that the federal CFR contained roughly 835,000 such restrictions in 1997, rising to over 1.08 million by 2019 and continuing to climb. The Federal Register , which is the daily journal in which new federal rules are first published, totalled 9,562 pages in 1950 across 15 volumes, and hit 86,356 pages in 2020 , the second-highest count ever recorded. Meanwhile, the European acquis communautaire , the body of cumulative EU law, has followed a similar trajectory, with estimates of the active acquis range from an 80,000-page figure to over 170,000 pages, depending on how you count, with more than 100,000 of those pages produced in the prior decade alone . The cumulative legislation since 1957 is on the order of 666,879 pages. The cost of complying with all this is, as you might have guessed, not evenly distributed. The widely cited 2010 SBA Office of Advocacy study by Crain and Crain estimated that U.S. small firms with fewer than 20 employees paid about $10,585 per employee per year in regulatory compliance, compared to $7,755 for firms with more than 500 employees, which is roughly a 36% gap. A more recent 2023 National Association of Manufacturers study put the total federal regulatory cost at $3.079 trillion in 2022 (about 12% of GDP), with small manufacturers paying $50,100 per employee per year compared to $24,800 for large manufacturers , which is roughly a 100% gap. Note: The Crain and Crain methodology has been criticised by the Congressional Research Service and others as including economic-impact estimates rather than just direct compliance costs, and using a cross-country regression that some economists consider unreliable. The NAM is an industry association with an obvious incentive to report large numbers. However, even if we discount both estimates substantially, the basic shape (that smaller firms pay disproportionately more per employee to comply with the same rules) is consistent across studies and across methodologies. A fixed cost of compliance simply hits a smaller firm harder, in per-employee terms, than a larger one. A few specific recent regulations are worth naming, considering their (cost-)impact: I will stop the list there, but the pattern is clear, and adding DAC6 , DAC7 , the DSA , the DMA , the CSRD , the CSDDD , UKCA marking, REACH , MDR , IVDR and the rest does not improve the picture. Each of these has a defensible rationale, and most of them addressed a real problem, but the cumulative burden, however, is significant . Sadly, there is no agency anywhere whose job is to look at the total weight of regulation on a small business and ask whether it is still proportionate. However, there are agencies, in many jurisdictions, whose job is to add to it. Tax complexity has followed the same arc. The U.S. Internal Revenue Code runs to roughly 2.4 million words, or about 10 million if you include Treasury regulations and IRS guidance. Wolters Kluwer ’s Standard Federal Tax Reporter , the practitioner’s reference, has grown to roughly 80,000 pages from a thin volume in 1913. The U.K.’s Tolley’s tax handbooks have grown from about 5,000 pages in 1997 to over 21,000 pages in current editions. The IRS Taxpayer Advocate , who is statutorily independent of IRS political leadership, has reported that Americans spend roughly several billion hours per year complying with the federal tax code. Meanwhile, the OECD ’s tax-to-GDP statistics show that the average tax-to-GDP ratio across member countries rose significatnly from 1965 to 2022. For example, France went from ~33% to ~46%, Denmark from ~29% to ~42%, the U.K. from ~30% to ~35%, Germany from ~31% to ~38%, Spain from ~14% to ~36%, and the U.S. from ~23% to ~28%. In other words, across most of the developed world, the share of economic activity passing through tax authorities has grown by roughly a third over six decades, and the complexity of the path it takes through those authorities has grown by considerably more. The crucial point, for my argument, is not about whether taxes are too high in some absolute sense, or whether taxation as such is actual theft , as that is a separate political question on which reasonable people disagree, but the point is that the complexity has grown to the level where it is itself a significant input cost, and that cost is again non-linear. A small business that needs to interpret 80,000 pages of tax guidance has to either hire someone to do it, or do it themselves at the cost of not running their business for the time that it takes. A multinational has a tax department, and frequently has the resources to make the complexity work in its favour. Which brings me to the most important part of the picture, which concerns tax *cough* planning . The Institute on Taxation and Economic Policy documented in its 2021 study, that 55 of America’s largest corporations paid $0 in federal income tax on $40.5 billion of pre-tax income in 2020. A 2024 update found 109 large profitable U.S. corporations paid 0% federal income tax in at least one year between 2018 and 2022, with an average effective rate of about 14.1% against a statutory rate of 21%. A 2022 study from the U.S. Government Accountability Office on large profitable corporations found an average effective federal rate of about 9% over the period 2014 to 2018, well below the statutory rate of the time. The mechanisms by which large multinationals (and wealthy individuals) achieve these rates are well-documented, largely legal and, most importantly, only available to companies (and individuals) of equal size and accounting firepower , and definitely not to your mom-and-pop-shop next door. The Double Irish with a Dutch Sandwich , used by Google , Apple , Facebook and others, was estimated by economist Gabriel Zucman to have shifted more than $100 billion per year at peak. Ireland closed it in 2014 with a phase-out completed by 2020. The European Commission ruled in August 2016 that Apple owed €13.1 billion in back taxes to Ireland, and the Court of Justice of the European Union finally upheld this on September 10, 2024 in Commission v. Ireland (C-465/20), eight years after the original ruling. The Tax Justice Network ’s State of Tax Justice 2023 report estimates that countries collectively lose roughly $472 billion per year to tax abuse, of which about $311 billion is corporate. It’s worth mentioning that the TJN’s methodology is contested by the IMF and others, and that the figure should be treated as an upper bound, but even at half that figure, the disparity is striking. The OECD’s BEPS Pillar Two , the global minimum corporate tax of 15% beginning in 2024, is estimated to raise corporate income tax revenue by roughly $155 to $192 billion per year, but it does nothing for the structural disparity between a small business (or regular individuals) that cannot relocate its profits and a multinational (or wealthy individuals) that can and, on the contrary, is likely to introduce even more bureaucracy for small businesses in future iterations of the code. There are honest reasons the system has ended up where it has, including the difficulty of taxing economic activity that crosses borders, but the lived effect is that a self-employed plumber in Paris or a small bakery in Chicago pays a higher effective tax rate than Apple or Amazon does on income shifted through the right holding structure. There is one more thread that I want to pull on, because it has changed character significantly in the past decade and is, I think, undertreated in the broader conversation, which is the slow conversion of banks from financial-services providers into compliance gatekeepers. One (in)famous exampale for this is Operation Choke Point , a U.S. Department of Justice initiative running from 2013 to 2017, that pressured banks to drop high-risk merchants, including payday lenders, firearms dealers, and adult-industry workers. The program was officially terminated in August 2017 after the FDIC settled lawsuits and pledged to cease informal or unwritten suggestions to banks, but the label Operation Choke Point 2.0 has since been applied to alleged debanking of crypto firms after the March 2023 collapse of Silvergate , Signature Bank , and Silicon Valley Bank . However, the evidence for a coordinated Choke Point 2.0 operation remains contested , and the framing has been used by politically interested parties on both sides. Less contestable, on the other hand, is the Nigel Farage / Coutts case, in which the U.K. private bank Coutts closed Farage ’s account, and an internal 36-page Reputational Risk Committee dossier from November 2022 cited his political views as “at odds with our position as an inclusive organisation” . The CEO of parent group NatWest resigned in July 2023, and the U.K.’s Financial Conduct Authority subsequently reviewed account closures across multiple banks, finding roughly 343,000 personal and business accounts were closed in 2021 to 2022 alone. Banks self-reported that few were for political views, but the FCA also noted significant data-quality problems. Disclaimer: I have no skin in the U.K.’s political game and I do not care about Farage as a political figure or even as an individual. However, the Farage / Coutts case is one of the most prominent cases, which is why I picked it up to give an example. Make no mistake to believe that de-banking is solely an issue on one side of the political spectrum , as it is clearly not. The volume of Suspicious Activity Reports filed by U.S. financial institutions to FinCEN has risen from about 1.3 million in 2014 to roughly 3.6 million in 2022 , and Currency Transaction Reports run at about 20.5 million per year. The European Banking Authority ’s 2022 opinion on de-risking is even explicitly acknowledged that AML rules are causing unwarranted account closures across NGOs, money-service businesses, and correspondent banks. To understand the real world implications of how these account freezes and closures impact even regular people on a day to day basis it’s enough to look at individual institutions’ bad ratings on any unbiased review site, e.g. for (Transfer)Wise on ConsumerAffairs . The mechanism here is, again, one I think is poorly understood. Banks are one part malicious, injecting their own policy and beliefs into their decision-making, and one part cautious, as they face fines for AML failures. For example for laundering $881 billion, the HSBC paid $1.9 billion in fines in 2012. But don’t worry, nobody at HSBC went to jail. Similarly, the U.S. Treasury Department settled with the Standard Chartered for $1.1 billion, for violations of multiple sanctions in 2019. On the other hand, however, AML over-compliance effectively carries no penalty at all, e.g. for closing the account of a legitimate small business or unbanking an innocent individual. The economically rational response is to weight profit vs. risk and to interpret risk conservatively for any account that does not pay enough to justify the regulatory exposure . The result is that the marginal small business, the freelancer with an unusual revenue pattern, or the person whose work happens to fall in a politically sensitive category, finds banking impossible, without any of this being written into any law as such. It is the emergent behaviour of a stack of regulations, none of whose authors probably intended this outcome. Add to this the ever changing regulatory environment and banking suddendly becomes yet another bureaucratic burden for small and medium businesses, let alone lower- and middle-class private individuals. The deeper irony is that this regime consistently fails at the very thing it was built to do. The list of major money-laundering scandals over the past two decades, including HSBC ’s settlement for laundering Mexican cartel money , Credit Suisse ’s Suisse Secrets leak revealing accounts held by criminals and corrupt politicians, the 1MDB scandal in which billions of dollars flowed through major Western banks, the CumEx tax fraud in which European treasuries lost an estimated €150 billion, and the Wirecard collapse in which one of its senior executives simply vanished, all happened despite KYC, AML, beneficial-ownership disclosure, and the rest of the modern compliance stack, without any of the involvement of cryptocurrencies or any other modern technologies, that are usually politically vilified for enabling these sort of schemes. The people the regulatory regime is supposedly catching are, with rare exceptions, not being caught. The people most affected are those who do not have a tax planner, a private banker, a trust fund, or a corporate structure that can absorb the friction and make issues simply go away . Take the popular case of Flipper Devices , the small hardware company behind the Flipper Zero , a multi-tool aimed at hardware hackers, penetration testers, and electronics hobbyists. The product’s Kickstarter campaign in 2020 was extraordinarily successful, raising nearly five million dollars from tens of thousands of backers. In late 2022, the company publicly reported that PayPal had frozen approximately $1.3 million of its funds, applying the platform’s standard 180-day review hold and citing only generic suspicious activity as justification. After significant media attention the funds were eventually released, but for a small hardware company in the middle of manufacturing and fulfilling international orders, going six months without access to over a million dollars of customer money is plainly a near-fatal event. Flipper survived because the tech press noticed and because they had alternative revenue streams, but the experience is far from unique. Most small companies that find themselves on the wrong side of a payment processor’s algorithmic risk score do not have a public profile large enough for anyone outside maybe their accountant or, ultimately, their lawyer to care. I believe that what is happening here is important and underappreciated. The bureaucratic delegation of compliance enforcement to private financial institutions has handed banks, payment processors, and similar gatekeepers a degree of power over private economic life that, historically, simply did not exist at this scale. A bank has the unique ability to create a business, by extending it credit on terms no ordinary lender would offer, or to destroy one, by freezing or even closing its account. If a major institution decides a particular firm is strategically valuable, it can throw virtually endless money at it through revolving credit facilities, underwriting commitments, intra-day liquidity, and market-making support, propping up balance sheets that, on the merits, would have folded years earlier. The opposite operation is just as easy, and considerably faster, as a compliance officer flagging a customer as inconvenient can, overnight, sever that customer from the payment rails on which essentially all modern economic activity runs. There is no court, no due process, and no meaningful right of appeal, and the customer typically receives a single boilerplate letter that does not even state the reason. This is a degree of power over individual livelihoods and corporate existences that, in democratic societies, used to require a court order. It is now exercised routinely by salaried risk officers operating under regulatory pressure that strongly incentivises closing first and asking questions later never. The same dynamic falls, sometimes even more starkly, on individuals, where a debanked person can find themselves locked out of housing, employment, and even the ability to receive their own salary, with no agency, court, or ombudsman that they can effectively appeal to. It’s this exact same financial-control infrastructure that has been used for instance by the Canadian government in response to the Freedom Convoy protests , or by the German government in response to Antifa . By freezing bank accounts associated with protest participants and donors, without conventional court orders, these individuals were cut off of modern life in an instant. Regardless of the underlying political debate and whatever you think of each of these cases individually, the precedent (specifically, a government using existing AML infrastructure to remove citizens from the financial system as a form of political pressure) is now established, in a world in which even the everyday use of cash, which is the official government-issued currency , has been recoded as suspicious in many jurisdictions. Large-cash deposits trigger reports, jewellers and car dealers face mandatory reporting thresholds, and several EU member states have explicitly capped what can be paid in cash at all. Going back to the more general topic of bureaucracy , especially in the context of business activity, I think the outlook is worrying when we project forward on the current curve. The U.S. Census Business Formation Statistics show that applications surged after 2020 from roughly 3.5 million per year to about 5 million per year, which is generally a welcome thing. But the underlying business dynamism has been declining for decades. Decker, Haltiwanger, Jarmin and Miranda ’s Brookings work documents that the U.S. startup rate fell from roughly 13% of all firms in the 1980s to about 8% by the 2010s. Additionally, multiple studies show that the share of employment at firms with fewer than 20 employees fell significantly in the past fourty years, and the OECD ’s Entrepreneurship at a Glance series finds similar declining startup rates across most member economies. So the recent surge in applications is encouraging, but it is seemingly happening against a multi-decade trend of declining small-firm employment and declining new-firm formation relative to incumbents. One plausible end-state, which I do not think is inevitable but which is clearly the trajectory we are on, might look something like this: Large incumbents accumulate the regulatory, tax, and compliance machinery (at their scale, the per-employee cost of compliance falls). Small entrants either do not start, start under the radar in regulatory grey zones (if even possible, see below), or get acquired before they can scale. The marginal new business is increasingly a side-hustle on a platform owned by an incumbent (think Amazon FBA , TikTok Shop , etc.), where the platform absorbs the compliance burden in exchange for a (hefty) cut, but also sets the terms unilaterally. The number of independent businesses falls, the share of actual, as well as paractical employment in incumbents rises, and the regulatory state both causes and justifies this concentration, on the grounds that fewer, larger firms are easier to oversee, while simultaneously likely to be corrupted bought lobbied by these exact firms. For most of the past century, the infrastructure of compliance was built and operated by bureaucrats , namely people sitting in offices, processing forms, applying judgement within the limits of their statutory remit. The friction generated by that arrangement was high, but the friction was also a feature, in a way, as it built in a small reserve of leeway , in the form of a human who could lose a form, mark a case as borderline, or exercise discretion. The trajectory we are now on is the replacement of that human by a system, with the bureaucratic structure inherited intact and made fully queryable . The bureaucrats built the cathedral, and the techno-/algocrats are now installing the 24/7 surveillance and the “AI” . Decades of beneficial-ownership filings, KYC records, CRS and FATCA exchanges, DAC7 platform reports, payment-service-provider data, e-invoicing pipelines, real-time VAT reporting (Italy’s SDI , Spain’s SII , Hungary’s RTIR , the impending EU-wide ViDA regime), property and Land Registry records, vehicle registries, customs data, and social-security feeds, all sitting in databases that, for most of their existence, were used in isolation, as data-silos. The techno-/algocratic project, broadly speaking, is to wire those databases together, to make them fully searchable, and to layer pattern-detection and “AI” on top. Make no mistake in believing that this is only hypothetical. The U.K.’s HMRC Connect , which is operational since 2010 and built for the tax authority by BAE Systems Applied Intelligence at a reported cost in the tens of millions of pounds, already cross-references dozens of distinct sources, including bank statements, social media, Land Registry filings, DVLA vehicle records, Companies House data, PayPal transactions, and offshore-account exchanges. On September 8, 2023, the U.S. IRS announced a major expansion of audit activity targeting large partnerships and high-income individuals, with Inflation Reduction Act funding and an explicit reliance on “AI” to identify return patterns that human reviewers would not have spotted. The OECD ’s forum on tax administration has, for years, been pushing member states toward real-time compliance and data-driven audit as the operating model of choice. With all of this the direction of travel is clearly set, and the technical capacity to act on it has now finally caught up. The cautionary tales of what happens when this approach is rolled out at scale, without the institutional caution that has historically slowed bureaucratic overreach, are already with us. For example Australia’s Robodebt scheme , which was in operation from 2016 to 2020, used automated income-averaging to issue hundreds of thousands of debt notices to welfare recipients on the basis of data-matching alone. The scheme was found unlawful by the Federal Court in November 2019, the government settled a class action for AUD 1.8 billion, and the Royal Commission that reported in July 2023 concluded the programme was crude, cruel, and produced disproportionate harm, including contributions to suicides . Also, the Netherlands’ toeslagenaffaire , in which the Belastingdienst ’s self-learning risk model wrongly accused tens of thousands of mostly immigrant-background parents of childcare-benefits fraud, demanding repayments that drove families into bankruptcy and, in over a thousand documented cases, the loss of custody of their children, was serious enough to bring down the third Rutte cabinet on January 15, 2021. Finally, the Dutch SyRI system , a separate algorithmic fraud-detection tool deployed in low-income neighbourhoods, was struck down by the District Court of The Hague in February 2020 for violating Article 8 of the European Convention on Human Rights on grounds of opacity and disproportionality. AlgorithmWatch ’s Automating Society reports have catalogued dozens of similar cases across European member states, in welfare, policing, education, and employment. What unites these cases, and what should worry anyone trying to run a small business or live a private life, are the integral features of the techno-/algocratic arrangement, which are that the system acts at machine speed, that the cost of being wrongly flagged is borne entirely by the citizen, and that the institutional pathway for appeal is essentially the same slow, human bureaucracy that has now been deprioritised in favour of the system that flagged you. The political-philosophy literature on algocracy , or governance by algorithm, has been making this point for over a decade, but has only recently moved it from academic concern into operating practice. The borderline situation, namely the small business that took a contested deduction, the freelancer with an unusual revenue mix, the side-hustle whose VAT return is six weeks late, or the consultant whose payment patterns trip an unexplained risk score, that, twenty years ago, would have been quietly tolerated, mis-filed, or simply missed becomes discoverable instantly. Once discovered, it is sanctionable with no human in the loop, and the same asymmetry that already shapes the regulatory landscape applies here, as large multinationals have the budget to deploy their own AI , hire armies of tax engineers, and structure around the algorithmic detection, while small businesses inherit the algorithmic enforcement without the means to defend against it. The leeway that used to exist in the system, a function of human inattention, finite processing capacity, and occasional judgement, is being engineered out as a deliberate goal, and sold as efficiency and fairness . The people who lose the most when that leeway disappears are precisely the ones who needed it most. I think this is sadly where we are headed if nothing changes, and I think it should worry people across the political spectrum, in every developed and developing nation. Probably the strongest argument against this is, that the reason 1700 looked deregulated is, that it was also worse on almost every dimension of human welfare. Workers had no protection, children worked in mines, the seas were full of slaves, rivers were poisoned, and banks collapsed routinely and took depositors’ savings with them. The reason the modern regulatory state exists is that the previous arrangement was actively killing people, and the slow accumulation of rules is the price of a society in which most people “no longer” die at work , drink contaminated water , or lose their savings to a bank’s bad bets . That’s at least what the bureaucrats , and technocrats , and algocrats keep telling us. In principle, cumulative regulation is not a flaw of the system, it is a record of every preventable disaster the system has tried to prevent from recurring, and removing the rules in aggregate would remove the protections in aggregate. And don’t get me wrong, I am glad when workers have meaningful safety protections, when consumers can sue over defective products, when depositor insurance exists, when environmental externalities are at least partially priced in, and when a small number of bad actors no longer get to externalise their costs onto everyone else. I do not think that the counterfactual world in which we kept the freedom of 1700 and added the income from 2026 is a world I or anyone else would probably want to live in. What I do think, however, is that there is a meaningful difference between essential protections (that actually work) and accumulated regulatory drift . The basic worker-safety rule that says you have to provide fall protection above a certain height is essential. The 47-page guidance document about how to file your beneficial-ownership disclosure for a single-member LLC is drift. The basic principle that consumers should be told what is in their food is essential. The 200-page set of EU labelling rules covering every permissible variation of free-range is drift. And the regulatory process, almost everywhere, is asymmetric, as rules are added much more easily than they are removed. The U.K.’s one-in, two-out initiative was an attempt to rebalance this, and was quietly abandoned. The EU’s REFIT programme was modest in ambition and modest in delivery. The basic dynamic, that political incentives strongly favour adding rules in response to any given incident and very weakly favour removing them in response to cumulative drift, is the big issue here. If you can grant me that distinction, between essential protection and accumulated drift , then I think the current state of the western regulatory system contains a lot more drift than its defenders are willing to admit, and removing some of that drift would not actually require dismantling any of the protections that make modern life better than in 1700. To wrap this up with something approaching constructive thoughts, I think we should want a regulatory state that protects against catastrophic externalities (pollution, fraud, systemic financial collapse, occupational deaths) while making it easy to start the kind of small, independent business that built post-war prosperity. I think we should want a tax system that is fair and simple enough that a person running a one-person operation can comply with it in an evening, and graduated enough that a multinational cannot escape it through accounting geography . Speaking of which, I also think that we should want a levelled playing field, in which accounting geography is either impossible, or possible for anyone regardless of the depth of their pockets or the political and economical influence they might have. I think we should definitely want banking that is open to anyone who has not been individually adjudicated to have done something wrong, and not closed to people on the basis of category-level reputational risk. And we should almost certainly want this lifeblood of our modern life to require a lot more effort to be simply turned off in an instant than it does today. I think we should want a habit, in the political class, of asking what should we remove this year , with the same energy we currently bring to the question what should we add . None of this is a return to 1700, but it is more like a return to the economic environment of, say, the 1950s, 60s, 70s and maybe even 80s, in which the post-war west had built a real welfare state and meaningful worker protections, but had not yet loaded on top of that the accumulated drift of seventy further years of rule-making. That is not a libertarian fantasy, and it may in fact be living memory for some of the people reading this. It was the environment in which their parents or grandparents started shops, opened bakeries, built small factories, and made middle-class lives. None of the rules that I think constitute drift were added in bad faith and probably each of them was a response to a real problem, designed by people who (in most cases) meant well, and voted for by representatives whose constituents wanted that specific problem solved. The cumulative effect was nobody’s intention, it is just what happens when a system has a stronger tilt towards adding than towards removing, and that runs on such an imbalance for several decades. Therefor, I think the next political project that is worth caring about, more than most of the noise that currently passes for debate, is the project of deciding what to keep, what to remove, and how to build an institutional habit of asking that question regularly. I do not have a clear policy proposal for how to do that, as I am far from being truly politically and economically knowledgeable, but I am reasonably sure, that the current trajectory ends somewhere I would rather not arrive at, and that the people who will pay the highest price for arriving there are the people who were not yet born when most of the drift was added. If you take only one thing from this post, take this: The bureaucratic weight that we treat as an immovable feature of modern life is, in fact, a very recent construction. It was built in living memory, by people we can name, in response to problems we can list, with consequences they did not entirely foresee or willfully ignored. It can be rebuilt, lightened, simplified, and reformed, in the same way it was built up. The question is whether we have the political stomach to treat accumulated rules with the same scepticism we currently treat proposed rules , and to remember that every line of regulation, however well-intentioned, is also a small tax on every future person who has to read it before they are allowed to do something useful. I would like to think we still have that stomach, but I am not certain we do. Footnote: The cover artwork is a real painting by Heather Castles . Sarbanes-Oxley ( SOX ) from 2002 added 3,000 to 10,000 compliance hours per company per year, with average direct cost of $1.7 million for accelerated filers, and average annual SOX cost for a small public company rose from about $1.5 million in 2001 to over $2.8 million by 2007. This is a significant part of the reason that the number of U.S. publicly listed companies has roughly halved since the 1990s. Dodd-Frank from 2010 required, at peak, around 398 distinct regulatory rulemakings, and the American Action Forum estimated cumulative compliance burden at over $36 billion and 73 million paperwork hours by 2016. The 2018 Economic Growth, Regulatory Relief, and Consumer Protection Act rolled back some of this for regional banks, but the substantive bulk remained. MiFID II from January 2018 cost the financial industry roughly $2.1 billion in first-year implementation costs and several hundred million in ongoing costs, with the top ten sell-side firms each spending more than $50 million. A documented side-effect, perhaps an unintended one, was a substantial fall in EU sell-side research analyst headcount over the following two years. The General Data Protection Regulation ( GDPR ) , in force from May 2018, has been one of the most consequential pieces of EU legislation of the past decade. Industry surveys at the time put average Fortune 500 GDPR spend in the mid-eight-figure range, with substantial recurring annual costs thereafter. More than a thousand U.S. news sites blocked European users entirely after GDPR came into effect, including major publications like the Los Angeles Times and the Chicago Tribune , and many of those blocks remain in place years later. GDPR was a serious response to a real problem, but the way the cost falls is itself an externality of how the rule was designed. Strong Customer Authentication ( SCA ) under PSD2 , enforced from 2021, made online payments in the EU more secure but, by Stripe ’s estimate, also lost European e-commerce roughly €57 billion in sales in the first year. The U.S. Corporate Transparency Act , effective January 1, 2024, requires beneficial-ownership disclosure on roughly 32.6 million existing entities plus another 5 million new entities annually, at first-year compliance cost estimated by FinCEN itself at approximately $22.7 billion . The constitutionality is currently in litigation, but the regulatory intent tells you a lot about where the trajectory is. The EU AI Act , passed in 2024 and phasing in through 2027, will impose high-risk AI compliance obligations whose cost the Commission estimated at roughly €29,000 per system, but which independent analyses (such as CEPS ) suggest could run closer to €400,000 for a small company deploying a high-risk system. The order-of-magnitude disagreement is itself a sign that nobody really knows what this is going to cost yet, which is not a reassuring property of a major piece of legislation.

0 views
iDiallo 1 months ago

Why all the PRs?

It's a signal. That's why we get AI-generated PRs. We told everyone, in order to get your resume taken seriously, you need to show your work. When I was getting started in my career, that meant having your own website that you contribute to regularly. So I did that. I built websites, I maintained them. I kept maintaining them even after I got the jobs because that's how I actually honed my web programming skills. Where else was I going to try new frameworks, a new JavaScript paradigm, or try out Ruby on rails? I got the job, and I advised other developers to follow the same path. But then github became mainstream. Rather than just show a finished website, you could actually share the code that runs your project. Share a link to your github project and companies can review your code and directly gauge your experience. But even better, you can show your contribution to open source projects. Not just any projects. Popular projects. The github stars became a metric people look for. A signal that can be used to quickly assign a value to a candidate. But that’s the story told from the outside. I don’t think the github profile link was ever important, unless it was significantly good. Employees focused on their work rarely have the time to maintain healthy github activity. Their experience comes from their day to day job. So for the most part, not much attention was placed on github links other than skimming through those surface level details. When stacks of resumes came on my desk, the best candidates stood out because they had work experience. The good candidates had projects that they could link to, github or elsewhere. But then, the worst candidates had long padded resumes that had elements of every job application tips-and-tricks-article. They had a website, but it was built in a day for the purpose of getting a job, with nothing interesting to say. They had github links, but those often pointed to school projects, homework, or boilerplate code. That’s the vast majority of github links I used to get. People with active and well maintained github profiles were rare. Rare because it actually requires time, effort, and experience. But then we have AI. There was a golang auth issue that I've contributed to on github. It was already a few years old when I proposed a solution that worked for my case. It wasn't universal so it wasn't accepted. The discussion is revived every couple years, each person bringing one more piece to the puzzle. But then recently, someone exploded the thread with comments. And even created a PR to go with it. This was from a user that went from a dormant account to 4000 contributions in a year. It was all AI assisted code. This isn’t to comment on the quality of his code, but he was clearly trying to optimize the metric. Looking at his linkedin profile, he doesn’t work in a software engineering role, and it’s hard to decide if he would be a good contributor if hired. If we were to judge his resume by looking at the github profile, it might catch our attention. But then, there is a problem. There are hundreds, even thousands of people all doing the same thing. They are cranking up their contributions to github projects using AI, so they can have a better chance at getting hired as developers. I understand the job market is rough right now, especially for gen z , and anything to differentiate yourself is a plus. The problem is this is being done at the expense of open source projects. The contributors are not submitting PRs to your project because they are personally invested in it. Instead, they are trying to get their name on the contributors list so that they can use it as a signal in their resume. When we are out here debating if there is any merit in AI generated PRs, or if we should just judge the code, we tend to miss that their gesture is completely hollow. The PR’s author intentions are completely misaligned with the project's maintainers. They are playing a different game. We call it slop, or a waste of time, we ban them and they get really vocal about expressing their first amendment rights. We are directly interfering with their goal of padding their resume. I often ask, why don’t people who create those PRs not just start their own project? One answer I’m starting to believe is, nobody cares about a github profile with a handful of stars. You need to contribute to a popular project. Most if not all AI generated websites look the same, it doesn’t matter how well you customize the prompt. Most greenfield projects from new programmers look the same, the prompter lacks the experience to do anything different. Contributing to open source is a scary thing when you are new. Even when you have experience, it’s a deliberate act. You have to be invested in the work. Just like asking questions on stackoverflow, issues you raised will often get closed . And when they do, you have to learn from it. The value of an open source contributor is not in the volume of work they can perform. If you skim any important projects, you’ll see that the best contributors spend more time discussing the problem than writing code. Their value is in solving problems and contributing to the collective memory of the group. But when you are doing a drive-by PR that may or may not be correct, and you are just trying to get your name on a list, you are providing zero value to the maintainer. Just more work. This is the signal every slop PR generator is after.

0 views

Premium: The Hater's Guide To The AI Bubble 3.0

Last year I wrote one of my favourite pieces ever — The Hater’s Guide To The AI Bubble — and followed it up with The Hater’s Guide To The AI Bubble Volume 2 several months later. Sadly, I’ve realized “volume” is a terrible way to structure something like this, because each volume is more of an update , which is why today’s newsletter will move to a versioning system. The AI bubble is a psyop, a melodrama, a financial crisis, and a mask-off moment for the Business Idiots that run the vast majority of our economy. It is the largest-scale exploitation of ignorance in history, gnawing at the intellectual weaknesses of society by presenting just enough information or just enough proof to substantiate a trillion-plus dollars of investment and manufactured consent for a technology that, based on how many discuss it, doesn’t actually exist. And it’s revealed how many rich and powerful people are either (or both) credulous and woefully ignorant. To be clear, LLMs are real and do some things, but they don’t do any of the things that Dario Amodei is talking about when he says that AI will wipe out 50% of white collar jobs . We’re four years into this joyless slog and people are still talking about AI’s “potential” and what it “will” do and that we’re in the early innings of a technology that, for the most part, is still doing exactly what it was doing at the beginning with refinements that never come close to reaching the vacuous heights of boosters’ promises.  Markets are moved by poorly-written fan fiction by outright scam artists and deceptive hedge fund gargoyles because those selling AI services have entirely disconnected the minds of the markets and the media from reality. This is because con artists like Amodei and Altman constantly discuss what AI will or might or theoretically could do rather than what it actually does , because if they had to do that they’d have to say it constantly loses money and doesn’t have a measurable return on investment . As I said on Bloomberg this week , the markets and the media have conflated capital expenditures for data centers with a thriving AI industry. In reality, 89%+ of all AI revenues and 90%+ of all compute demand comes from two companies — OpenAI and Anthropic — largely based on money-losing subsidized AI subscriptions and unrestrained token burn at organizations run by imbeciles that will go away now that executives are having trouble justifying it because there’s no ROI , in part because AI is too inconsistent and unreliable, and in part because you can’t really measure how much a task will cost .  Now enterprises are already capping their AI spend , with many more are going to follow after multiple companies blew through their annual token budgets in a few months . The sheer volume of the “AI ROI” conversation is remarkable considering that Anthropic and OpenAI only moved enterprises to token-based billing — paying the actual costs of AI — in Q1 of this year.  Remember: the total, actual revenue of the entire AI industry — including OpenAI, Google, Microsoft, Amazon, and Anthropic — has barely reached $100 billion in 2026. That includes every ounce of compute spend, every penny of the $500 million that a single customer accidentally spent on Anthropic’s API , and every cent of NVIDIA’s backstop deal with CoreWeave . More importantly, absolutely nobody is making a profit outside of those selling the bits that go inside a data center.  Both OpenAI and Anthropic lose billions of dollars a year, with no end in sight, though Anthropic did a great job swindling the media by having a single “profitable” quarter thanks to Elon Musk discounting two months of compute . Anthropic has already filed to go public , with OpenAI  allegedly not far behind . Neither of these companies are fit for public investors. Their products are inconsistent, unreliable and only ever seem to get “better” in a kind of wobbly way that can only be measured by increasingly-less-useful benchmarks that they specifically train to beat. Despite many people (and some companies like Spotify ) claiming that AI is writing “most” code, nobody can seem to explain what that means. It isn’t saving money, it isn’t saving time, it isn’t making companies ship better or more-functional products, and the only tangible examples of its effects are that it broke AWS several times and deleted a company’s database . It’s unclear where AI exists outside of coding and the various places companies have shoved it.  I’ve spent years trying to catalogue other, non-coding use cases, and most of what I’ve found are vague descriptions of companies like Goldman Sachs maybe launching agents “soon” at some point to do something maybe and this weird story with Novo Nordisk claiming that it was “integrating ChatGPT’s models to analyze complex data sets” despite them claiming to have done this for years . That’s because generative AI is, no matter how many hats or harnesses or deterministic processes you add, limited by its mathematically-certain hallucinations . These models are probabilistic, guessing at what the ideal output may be, which means that every bit of information they produce is suspicious and every decision they make is brainless, thoughtless and arbitrary. They do not “know” things, they do not have “thoughts,” and no amount of API connections will fix that problem. As a result, nobody has really got a clear answer as to what everybody is doing with AI. Code? Image generation? Using it as a shitty search engine? Using it as a companion? You can’t really rely on it to do anything. When a model hallucinates an incorrect answer to something you know is true it’s a problem that can be fixed — when it hallucinates an incorrect decision with your codebase, that’s fucked everything up to a near-permanent end. This is the ultimate problem with AI. You can try and dress it up with billions of investment and supposed ways to mitigate hallucinations, but it still makes — and will continue to make — mistakes that it has no idea are mistakes.  Well, okay, the other problem is that generative AI just isn’t built to do most jobs. It can generate stuff and summarize stuff at varying degrees of complexity, but the more complex the generation, the more likely it is to hallucinate. The only way to reduce hallucinations is pre-training (shoving stuff into the model at the beginning) and post-training (training it on what “good” looks like), and neither of these actually solve the problem. It is clumsy, inaccurate, unreliable, expensive and cumbersome.  AI cannot do the vast majority of jobs, and the only reason that anybody thinks that it can is that the vast majority of CEOs have no actual connection to the work that enriches them , and because AI can do an impression of something that looks like work, they choose to believe it can do anything . It can burp out a half-functional prototype with the company’s name on it or legitimate-looking legal or financial document, and that’s all it takes for a fuckwit with a high salary and a low IQ to think it’s capable of replacing everybody. If I were wrong, it would actually be replacing people. You’d be able to point to both the data and the proof. You’d have single-person software companies making billions of dollars, hyperscalers would have their companies destroyed by people copying and bettering their software, accountants and lawyers and writers and every other knowledge work career would be dead , not threatened with constant layoffs that are mostly connected to improving profits, but actually dead, untenable, impossible to work in thanks to the “power of AI.” In reality, AI is dramatic only in its mediocrity and the ferocity with which it’s proven how ignorant most authority figures and executives have become. Every boss demands you use it, every app screams at you to try its integration, every news story tells you it will replace you imminently, but in the end it doesn’t appear to do very much beyond generating and summarizing at varying levels of complexity.  The media categorically failed to scrutinize an industry built to exploit it, as I said earlier in the week : The consent has been manufactured and the markets are engorged with semiconductor stocks running because people keep mistaking the availability of debt for actual, real demand for AI compute. The geniuses in private credit and the greater markets saw the amounts that hyperscalers were spending on data centers and the ascent of OpenAI and thought “fuck me up, grandpa,” leading to $178.5 billion in data center debt deals in the US in 2025 and $50 billion in data center construction in April 2026 alone .  Yet it turns out that data centers take anywhere from 18 to 36 months to build , with Microsoft finishing a grand total of zero of the data centers it broke ground on in 2023 , and JP Morgan saying a month ago that 60% of capacity planned for completion in 2027 hasn’t even started construction, with another 7% delayed, per the Wall Street Journal .  And despite the supposed 100GW+ of data center capacity being planned, AI compute demand doesn’t really exist outside of Anthropic and OpenAI, two companies that rely on perpetual flows of venture capital and debt to survive. Between them, they’ve raised over $200 billion in the last six months , and their revenue streams are inherently based on either unprofitable AI startups subsidizing their subscriptions , their own unprofitable subsidized subscriptions, or experimental token spend borne of companies allowing their employees to burn as much as they’d like , which is already coming to an end. At the top of the pile lies NVIDIA, the largest company on the stock market, which sells GPUs that are so expensive that once cash-rich hyperscalers are now having to take on mountains of debt or, in Google and Oracle’s case, dump tens of billions of dollars of new stock into the markets. NVIDIA’s continued growth relies on a dwindling subset of clients, with 54% of its last quarter’s revenue and 64% of its accounts receivable coming from three customers in its last quarterly earnings.  Demand is somehow both incredibly high for data center components but so low for AI compute that NVIDIA has agreed to spend $30 billion over the next six years to rent GPU capacity.  That’s because the AI buildout is being driven by people who haven’t bothered to check whether the demand is real, much like AI is being adopted by people that don’t bother to do any real work, much like AI is sold based on things that it can’t actually do.  Midwits and the incurious will say this is just like the Dot Com Bubble ( it isn’t and won’t leave behind any useful infrastructure ), or Uber ( it isn’t ) or Amazon Web Services ( it isn’t ) because they want to rationalize the waste. In reality, the people running the tech industry are listless Business Idiots throwing as much cash at the problem as possible rather than facing the fact that they’ve backed a dead-end technology because they’ve run out of hypergrowth ideas . Today’s piece is an attempt at a little fun — a raucous, aggressive rundown of the major players and stories of the AI Bubble, both as a refresher for those who already know and a guide for those that don’t. Welcome to the Hater’s Guide To The AI Bubble 3.0. The Rot-Com Bubble — A Guide To How The AI Bubble Got Inflated Why You Keep Being Told AI Is Powerful How The AI Industry Is Almost Entirely Wrappers For OpenAI and Anthropic’s Models How NVIDIA’s Findom Operation Conned Every Hyperscaler How Microsoft’s AI Strategy Has Fallen Off The Rails How Google Is Using AI To Destroy Its Legacy How Amazon Lost The Plot And Became Anthropic’s Paypig  How Mark Zuckerberg Burned $158 Billion To Buy GPUs For Effectively No Reason How SpaceX Became Musk’s Last Gasp Attempt For Exit Liquidity How Anthropic Is The Greatest Exploitation of the Media and Economy In Tech History To Prop Up An Unsustainable Company Run By The Most Annoying People Imaginable How OpenAI Became A Miserable Failson With Too Many Ideas, Unsustainable Economics, and No Plan For The Future How The ROI Conversation Could Burst The AI Bubble

1 views
DHH 1 months ago

A pond of interesting problems

The great joy of having built a successful business that employs a broad team of talented people is that I get to fish for exactly the kind of problems that most interest me, most of the time. Usually, this coincides well with the needs of the business. When we moved out of the cloud, I spent months getting Kamal off the ground, so we didn't have to get mired in the complexity of Kubernetes. Fun problem to solve! And of course, the origin story of Ruby on Rails is that Basecamp gave birth to it all back in 2003. Because I simply wanted Ruby to work well for the web, and we needed a platform to build the business. But sometimes it's also a bit further afield. We had our big clash with Apple over the App Store's monopoly abuses back in 2020, but it wasn't until 2024 that I severed our exclusivity with the Mac on the engineering side by moving to Linux, and ultimately building Omarchy. I don't always get to choose, of course. There are occasionally urgent problems that just need our, and therefore my, full attention as a company, or humdrum issues that I just happen to be best qualified to tackle. But this is increasingly rare because of all those great people we've managed to assemble at 37signals. And that's how it should be! Building a successful business should yield dividends beyond just the financial ones. It should afford you more opportunity to press your comparative advantage, so you spend most of your time on the projects that stimulate a little Call of the Wild. Never to the point of being too good for anything, mind you. Taking out the trash is still everyone's job some of the time. But mostly, I want to be sitting by the pond of interesting problems, fishing for the ones that catch my eye and hook my motivation.  Who could wish to retire from that?

0 views
Maurycy 1 months ago

Notes on optimizing battery life:

Ok, so you have something with a battery, and you want it to run for a long time. I'll be using the classic CR2023 non-rechargeable lithium "coin cell" as an example, but everything here applies to other types of battery. (except the exact voltage and capacity numbers) First off, it helps to measure power draw in current and charge in well, charge. It is tempting to convert everything into power and energy, but don't. Most circuit's power draw is much closer to constant current than constant power: a single clock cycle on a microcontroller involves charging or discharging some number of MOSFET gates. That requires some number of coulombs, not some number of joules. Linear regulators turn any circuit into a perfect current sink: no matter what potential is supplied, the device sees a constant voltage and will always draw the same current. Even if you don't use any, most chips will use a few to generate internal voltages. This is the "typical" current draw of an AVR32DD32 microcontroller over voltage from the datasheet : Black: 25 °C. Yellow: 125 °C. Also, battery capacity is nearly-universally specified as charge, usually in milliamp hours: a 100 mAh battery can support 1 mA of current for 100 hours before it's "dead". (more on what this means later) Non-ideal batteries : This battery has 3 volts stamped right on it... but that's kinda of a lie: Measuring the battery with a meter, the voltage is actually 3.3 volts. However, checking the datasheet, getting the manufacturer's claimed 235 mAh capacity requires operating down to 2 volts: From the datasheet (yes, these have one) With these "CR" Li/MnO 2 cells, the discharge curve is fairly flat: a device that only works down to 85% of nominal (2.6 volts) can still use a good 90% of the capacity. However, an "Alkaline" Zn/MnO 2 1.5 volt cell falls below 80% of nominal with a quarter of it's charge remaining. The manufacturer considers them dead at 0.8 volts — around half the original voltage. In a typical circuit, two batteries will be connected in series to produce a 3 V-ish supply. To get the advertised capacity, the device must be able to run down to 1.6 volts: the same as a (fresh) single cell! Think of supply voltage like a budget : If your battery will drop down to 2 volts and the MCU needs 1.8 V, any other components involved in supplying power must not drop more than 200 mV. It's not that the same MCU won't work on two AA batteries, but it won't be able to use the last 10% or so of capacity because it requires at least 1.8 / 2 = 0.9 volt per cell. Ok, so design for half the nominal supply voltage ? Batteries have non-trivial internal resistance, which causes a voltage drop when any current is drawn: a coin cell is usually around 10 ohms, while large AA cells sit around 0.1 ohms. To understand what causes this, let's look at how a coin cell works: On the negative electrode, a piece of lithium metal looses it's electron and dissolves into the electrolyte. Li → Li + + e - The resulting ions travel over to positive electrode and steal oxygen from the manganese dioxide: 2 MnO 2 + 2 Li + + e - → Li 2 O + Mn 2 O 3 This reaction releases a lot of energy because lithium is an alkali metal the manganese doesn't really care. That released energy is actually what powers the connected circuit. Crucially, the whole thing depends on positive lithium ions reaching and reacting with the positive electrode: moving against the electric field produced by the battery. The open circuit voltage, 3.3 volts, is enough to completly stop the reaction. This is why batteries only discharge once a circuit drains some of the accumulated electrons... but for the reaction to proceed at a reasonable rate, the voltage must drop quite a bit below the measured open-circuit voltage. If you've done any chemistry, it should come as no surprise that this is affected by temperature : As a rule-of-thumb, to operate down to -40 C, plan for ten times the internal resistance at room temp. If you see the voltage rail dropping by 50 mV at 20 C, make sure there's still enough voltage to go around if it drops 500 mV. Another thing that impacts reaction rate is the amount of reagents present , or in other words, the charge left in the battery: resistance increases as the battery is drained. As a test, I discharged an Alkaline battery at 400 mA: Orange: open circuit, blue: under load With a fresh cell, pulling almost half an amp only results in 100 mV of drop, or 0.25 ohms. By the time the battery is half empty, the resistance doubled to around half an ohm. At 60% discharge, the under-load voltage has dropped below the 0.8 V "dead" threshold. Reducing the voltage requirement won't help here: shortly afterwards, the resistance increased so much my test rig needed to supply power to force those 400 mA through. The smaller CR2032 cells start at around 10 ohms, and reach several hundred ohms by the time the open-circuit voltage falls to 2 V. It follows that any circuit that draws a lot of current can not use the full rated capacity. For pulsed loads, large capacitors can help, but they have their own problems which I'll discuss later. Also, batteries get worse as they age . Electrolytes can evaporate/leak and side-reactions can form layers that impede current. There's a good chance you've experienced this: a battery that tests fine on a meter but refuses to actually power anything. What's happened is that it developed a huge internal resistance (many killohms). In series with a high-impedance multimeter, it doesn't create any noticeable voltage drop. When connected to an actual device, the voltage drops to almost nothing. This is why you should be skeptical of any claims of 20 year, 30 year, 50 year battery life. Sure, that might be what you get by dividing nominal capacity by average current draw, but there's no telling how well the battery will work after all that time: I doubt even the manufacture really knows what happens past a decade or two. There's also self discharge , where leakage currents drain the battery, even when it's sitting on a shelf: This is usually given by the manufacturer as percent of capacity per year. Because the cell's voltage doesn't change all that much during discharge, — and the current is quite small — it's a fraction of the original capacity, not of what's remaining. This alone is enough to kill a AA battery in only 5 years depending on temperature (hotter is worse)... but again, this is not the only mechanism at play: Just because self-discharge might suggest a hundred year shelf-life, doesn't mean it will actually work in a hundred years. Another "fun" effect is voltage droop : Drawing current can deplete the chemicals around the electrode, causing a temporary increase in resistance. Applying a 400 mA current pulse to a half-empty ZnMnO 2 500 mAh cell caused the internal resistance to triple over the course 40 seconds: Yellow: cell voltage. Blue: Current Eventually, the battery does recover, but it took a good minute or so: Actually a trace of a different pulse, so the starting voltage is higher. What's interesting is that even though no current is being drawn, the battery circuit voltage is still not back to where it should be. This is where the "resistance" model starts to break down. It's more accurate to say that the pulse temporarily pushed the cell down it's discharge curve: increasing the resistance and decreasing the open circuit voltage. This gets worse when the battery is nearly empty: I applied a similar 10 second pulse to an 80% drained cell, it took around 5 minutes minutes to for it's open circuit voltage rise back above 0.8 volts. This effect highly variable depending on temperature (colder is worse) and state of charge, so it's good to include a wide voltage margin when designing a circuit that will draw sustained current. In short , internal resistance increases when... ... it's cold ... the battery is close to being empty ... the battery is used ... you do nothing at all Plan for a much worse voltage drop than what you see on your workbench: it's possible to loose as much as a volt per each mA drawn with a mostly empty coin cell on a cold night. With that in mind , it's time to look at those capacity numbers. As already discussed, aiming for longer than a decade or so is largely pointless because of battery aging. These CR2023 batters have quoted shelf life of 10 years, so it's going to be my target: From a CR2032 (~230 mAh), a device can draw an average of 2.6 uA if it runs down to 2 volts. From a AA (~3000 mAh) AA battery, a device can draw 34 uA if it runs down to 0.8 volts per cell. ... so we have a voltage budget and a target current. Keep in mind that internal resistance will cut into the voltage if when draw pulses in excess of a few microamps. Measurement techniques: These small currents present a problem: most multimeters don't really do well below a microamp. Benchtop models that can measure down to the nanoamps exist but are quite expensive. On paper, measuring current is easy: Insert a known resistor into the circuit and measure the voltage drop across it... except this either requires adding a large resistance or measuring a tiny voltage. A better way is to use an op-amp to hide the voltage drop from the device under test: The amplifier tries to keep its two inputs at the same voltage, which requires it to exactly match the device's current through the feedback resistor. This results in exactly the same voltage as if it was used as a shunt, except with zero burden voltage. Since most chips have two opamps, I use the other to create a VDD/2 supply rail which is used as the ground. This allows the chip to have access to voltages both above and below it. Most modern chips are "rail-to-rail", meaning they are designed to operate close to one of the supply rails... but this doesn't work too well: Consider what happens when the input current drops to zero. The amplifier has to pull the output (with a non-trivial amount of capacitance) down to zero. If the best the amplifier could do is connect the output to the negative rail, the voltage would exponentially decay, approaching zero but never reaching it. Would this be a huge problem? Probably not. Is it a good idea to make the chip's job as easy as possible? Yes. As a bonus, this allows the device to measure currents in both directions. Using the 100 pA/mV range, the circuit has an offset of ~10 pA, so it's not quite a picoammeter, but it's close. This makes it good for testing the leakage of MOSFETs, diodes, capacitors and the such. However, this design has one huge snag: It's zero burden voltage up to a fairly modest point. Once the output maxes out (100 nA - 100 uA depending on the range), the device will can see the full shunt resistance. This is a non-issue for testing component leakage, but it becomes a problem when measuring the current drawn by a microcontroller. For measuring sleep current, it's best to build a firmware image that never wakes up, and short the meter's input or connect a second power source during startup. Another option is to use a tiny feedback resistor: connecting a 1 kohm resistor between the input and output yields a 1 uA/mV range with a maximum of 1 mA. Once the microcontroller boots, the resistor can be removed to measure it's sleep current. (and if you are drawing more than this, you probably shouldn't) This is also a good trick to avoid crashing MCUs when switching ranges, which can cause a momentary disconnection depending on the geometry of your selector switch. Shielding is not optional : 100 picoamps is a kind of current that floats around on the air. It's best to put the whole setup inside a metal box connected to the meter's ground. Running coax to a scope or meter is fine because the wire's sheath is connected to the rest of the shield: this isn't RF stuff. If you don't have a box, wrapping the whole thing in aluminum foil works almost as well. (make sure it's not touching anything!) Also, it's a little silly to carefully screen out interference only to reintroduce it with a power supply, so it's best to run everything with batteries: Two 1.5 volt alkaline cells provides 3 volts and four is close enough to 5 volts. Also, be careful with what's touching the meter or part under test: a post-it note can easily conduct a whole nanoamp at 5 volts. Wood and fabric are similarly problematic. If in doubt as to if something is a problem, test it. When measuring capacitors, there's a really annoying property to be aware of : The dielectric material can slowly absorb or release charge over multiple hours. This effect is mostly known for recharging high-voltage capacitors after they've been removed from circuit — with unpleasant results — but it can also result in a deceptively high leakage current that goes away if the capacitor is used in a real circuit. Unless you have fancy polypropylene capacitors, you'll have to leave them in the test rig for several hours before taking a reading. Circuit testing : Of course, it's not enough to test individual components. The whole system has to work correctly with an imperfect power supply: A device running on a coin cell should be able to tolerate the full 1k with a two volt supply. ... also, it's a good idea to simulate a dead battery: an empty battery shouldn't result in hardware damage or data loss. Temperature can greatly effect leakage currents. If you expect the components to get up to 80 C, grab a heat gun and see how it performs at those temperatures. Practical advice: Before considering any components, does to circuit board itself consume any power? There's lots of people on forums saying you shouldn't use a soldermask, or that flux on the board causes leakage... For testing, I used a nothing special JLCPCB, green, FR4, 2-layer board. It had two quarter millimeter traces 30 mm long and separated by 2.7 mm. For the measurements, I used a 9 volt bias, which should represent worst case results: Clean : Testing the board as it came from the factory Humid : Breathing on it for a few seconds (99% RH, no visible condensation) Fingers : Touching it to get skin oils on the board Rosin : Spread some RMA flux and burned it with a soldering iron. Board condition and soldermask Current Soldermask, clean < 5 pA Soldermask, fingers < 5 pA Soldermask, humid < 5 pA Soldermask, rosin < 5 pA No soldermask, clean < 5 pA No soldermask, fingers 10 pA No soldermask, humid 30,000 pA No soldermask, rosin 20 pA The main troublemaker is humidity. If you are designing a circuit that needs to work outside, underwater or underground, it would be a good idea to include some desiccants: most plastic will allow water vapor to permeate inside. The soldermask prevented any significant leakage between traces, but problems could still happen between component pins. Conformal coatings will protect against short exposures, but will suffer from the permation problem. Soldering residue or skin oils aren't a problem unless you are doing picoamp metrology. Capacitors : Electrolytic or tantalum capacitors can leak multiple microamps at just a few volts: A jellybean 100 uF 16V electrolytic pulled 26 uA at nine volts, which is ten times the entire current budget for a CR2032! That cap alone could discharge the battery just a year or two. Ceramic capacitors a lot better: I grabbed a random 1 uF capacitor from my parts bin initially pulled several hundred nanoamps, but it dropped down to 920 pA @9 volts after two hours. Even a hundred of these would only draw 92 nA, which is only 3% of the budget. TLDR ; Don't use electrolytic or tantalums. Ceramic capacitors are fine in reasonable quantities and when run well below their rated voltage. Diodes are very commonly used for reverse polarity protection, but there are two possible configurations: A series diode uses a forward biased diode to prevent reverse current from getting to the device. A parallel diode adds a reverse biased diode to clamp the reverse voltage before the device is damaged. In the series configuration, voltage drop is very important : Real diodes are quite different from the idealized model. The voltage drop of a 1N4148 is only 0.6 V at 1 mA of draw and at 25 C. The relationship between current and voltage drop is roughly exponential: For a silicon PN diode, passing 10 times the current requires an extra 100 mV. This also works in the other direction: A circuit that only needs 10 uA (peak) will only see around 0.4 volts of drop across that diode. Temperature affects this: The threshold will rise ~2 mV for each degree the diode is cooled. At -40, expect 130 mV of extra voltage drop compared at room temperature. A Schottky diode has a much lower threshold voltage: 1 mA of current only needs 0.25 V. This can be a huge improvement to your voltage budget, although it's still a non-trivial amount. In the parallel configuration, reverse leakage matters . Because it's highly dependent on voltage, I measured a few diodes at 5 volts, which is closer to normal operating conditions: 2N4148 [PN] @5V: 2.3 nA BAT46 [Schottky] @5V: 2.4 uA In this test, the schottky doesn't do so well: It's three orders of magnitude worse than a similar PN diode. So, use a PN diode right? Well, if the battery can supply 50 mA into a short (fresh coin cell), there might be around a volt across the device. That can be enough to cause damage. So, what's a good reverse polarity protection circuit? An n-channel low-side switching version is also possible A MOSFET can act as a near ideal diode: If the gate (connected to the negative rail) is in fact, the lowest voltage, it's switched on. If the battery is inserted backwards, the gate now has the highest voltage in the circuit and the transistor stays off. However, it's still important to consult the datasheet or conduct experiments: the battery voltage might not be enough to fully turn on the FET, and even a properly "on" MOSFET still has a voltage drop. The final option is nothing: Battery clips that physically prevent a user from inserting a battery backward exist. These have no electrical penalties except for the contact resistance (which is negligible when compared to the battery's). Schottky leakage also poses a problem for dual power supply circuits. A microamp of backfeed into the backup battery can actually be enough to damage it. In these cases, you may be forced to use a PN diode or use a variation of the MOSFET trick: connect the gate to the primary supply rail. This will, at a minimum, perform as well as a silicon diode because of the transistor's intrinsic body diode. Once the power rail drops down to zero, the MOSFET's gate will be negative and it will turn on. However, it's performance won't be perfect if the main rail takes more than a millisecond or so to loose voltage. It's best to plan for a PN diode drop and consider any extra voltage as be a nice bonus. Computers : In theory, CMOS logic doesn't draw any power when sitting idle. In practice, it absolutely does. An 8-bit AVR128DD28 microcontroller draws 1.5 uA during sleep mode. Connecting a 32KHz crystal and using the integrated RTC to provide wake ups bring it up to 1.8 uA. This leaves just 700 uA of average current to work with. Ok, but at some point, the processor has to do something. Each clock cycle has a fixed cost: For the AVR, I measured it at ~0.28 nanoamp seconds, meaning that the battery has enough power for 3,000 billion cycles. Individual clock cycles on an AVR128DA28 running at 32 kHz. However, it's almost always a good idea to use a slow clock: The chip will draw an extra 277 uA of current draw per MHz. At the default four MHz clock speed, that's just over a milliamp. There's no guarantee the battery will be able to supply that kind of power. Decoupling caps aren't going to save you here: 1 mA is enough to drain a rather big 1 uF capacitor at 1 volt per millisecond. (remember, no electrolytics allowed.) Since the MCU has a minimum voltage of 1.8 volts, and the batteries can go as low as two, it's only safe to run like this for 200 microseconds / 800 cycles! However, running at 32 kHz only draws an average of 10 microamps. There are still current pulses from each clock cycle, but there are small enough to that they only drop a 1 uF capacitor by 0.27 millivolts. The processor does draw more a bit more quiescent current while running then in sleep mode. This is why some people suggest you should run at the maximum clock speed to save power... but while it is more efficient on paper, it simply doesn't work with real batteries. This also lets us calculate how long it can run for: 10 microamps is 14 times the remaining 700 nanoamp budget, so the processor can be running 7% of the time. Also, on this particular MCU, wakeups cause a big current pulse: Because of stray capacitance, applying power to the processor costs a whole 2.62 nanoamp seconds. With a 1 uF capacitor, this would drain it by 2.62 mV. However, with smaller caps like 6.8 nF, it could would discharge them a whole 385 mV. Stuff like this is why I'd recommend using around a microfarad: A decent 1 uF (MLCC) ceramic rated at a few times the supply voltage will leak almost nothing. To be fair, the datasheet does recommend this value, but plenty of people are in the habit of using smaller ones: When you have a 5 volt supply, loosing a third of a volt is not a big deal. Using a 3-but-actually-2 volt battery, it's enough to drop below the chip's minimum operating voltage. Some parts claim a much lower sleep current (in the nanoamps), but that's without retaining memory: Most applications can't use these modes. Consider a data-logger. Because flash consumes the same amount of power when writing a few bytes or a kilobyte, being able to buffer readings actually saves power. ... although there are some applications where a feature like this does make sense: This is something you have to consider before taking sleep current specs at face value. ... it's cold ... the battery is close to being empty ... the battery is used ... you do nothing at all Clean : Testing the board as it came from the factory Humid : Breathing on it for a few seconds (99% RH, no visible condensation) Fingers : Touching it to get skin oils on the board Rosin : Spread some RMA flux and burned it with a soldering iron. https://ww1.microchip.com/downloads/en/DeviceDoc/AVR128DA28-32-48-64-DataSheet-DS40002183B.pdf : The discussed microcontroller. https://data.energizer.com/pdfs/cr2032.pdf : Example battery datasheet https://lcamtuf.substack.com/p/real-mlccs-and-inductors-have-curves : Another footgun with capacitors

0 views
DHH 1 months ago

Basecamp Five

I've been working on Basecamp for half my life, and nearly my entire professional career in software. The first code was written in the summer of 2003 when I was just 23. Now I'm 46, and we've just released the fifth major version.  It's an incredible update to a service that continues to help about a million users a day avoid dropping the ball when working with others. It's AI accessible, but not agent hysteric. It's still famously easy to use, still executes the basics beautifully, and still focuses on the small to medium-sized teams we've been serving in the Fortune 5,000,000 for decades. Here are just three of my favorite new features in Basecamp 5: Lexxy editor: Our new text editor finally brings tables, markdown, and live syntax highlighting for code to Basecamp. Oh, and voice notes. It's built on Meta's Lexical editor toolkit, and it's going to ship as the default for Action Text in the next major version of Rails. Keyboard accessible: After moving to Linux, building Omarchy, and acquiring a taste for mechanical keyboards, I've come to love navigating the computer primarily through hotkeys. So with a lot of effort, Basecamp is now a delight to drive through the keys, and you don't have to be a brainiac to remember them all: just hold down SHIFT, and they're revealed in the interface. SHIFT + S opens the sidebar, ESC moves focus between it and the main page, SHIFT + C starts composing a comment/chat line/answer. The permanent sidebar: If you live in Basecamp, like I do, it's to stay on top of all the new things that are constantly happening in a busy account, and that's just gotten so much faster with the new permanent sidebar. Before, we had a Hey! menu in the top bar. You'd get a little dot when something was new, then you'd open it, click, and the menu would close. If you had five things that were new, it'd be open-click-close, open-click-close, five times. Being able to zoom through these now with just the return key, tap, tap, tap, and I've read three new things. So good. And there's so much more. Jason put together a great summary on the new marketing site, which in itself is brand new too. A back-to-basics design in many ways. As our entire industry is getting swept up in agent hysteria (and I love AI as much as anyone!), we thought it better to focus on the human communication that's the cornerstone of Basecamp. The new site just speaks plainly to that mission and shows you the software right at the top. Another thing that's back is color, specifically in the logo. Basecamp's clever but flat paperclip logo has been replaced with a modern take of our original rolling mountains. In full three dimensions, with depth and a gradient. Love it.  Overall, I'm really proud of what we've built with Basecamp Five. We're inching in on a quarter of a century in service! We still have customers who signed up back in early 2004! This is the kind of legacy that makes me beam, and the new version is just ace.  If you've tried Basecamp in the past, it's time to take another look. If you haven't tried it yet, you're in for a treat.

0 views
Kelly Sutton 1 months ago

Moving on from React, 2 Years Later

It’s been an even busier year and change for Scholarly . We’re coming up on 3 years in business. We’ve raised a small round of funding from our existing investors, grown the team in both Denver and Seattle, and continue growing in all dimensions. I’m trying to do an annual review of a decision to move away from React in ~2023 to see how things are turning out. You can read the original posts, Moving on from React and Moving on from React, a Year Later . What a wild 18 months it’s been. Since the last post, we’ve moved from tab-completion and copy-paste LLM-aided development to full-on agents with things like Claude Code. We’ve also grown the team and we have reintroduced React (gasp!). The decision to reintroduce React was solely driven by React Flow . It’s the best diagram tool we found, and we thought it was worth eating our hat. Unlike some of the other libraries we use and pay for, it’s not currently packaged as Vanilla JavaScript. We’ve also deployed React in a select few areas where its state management yields the best customer experience. We ship this as small pieces of a page that is otherwise server-rendered. The React bits help us add the interactivity that we believe makes the best customer experience. For those keeping tabs, here’s how our Ruby/JS LOC has changed over time: A few reflections on the numbers above: Given the recent changes in software engineering, it’s hard to tell how much of this even matters anymore. Our roles as software engineers are changing with every model or harness upgrade. Agents and models have gotten a lot better at interpreting and using StimulusJS and Turbo . We use Claude Code with Opus 4.7 at the time of writing. Some of the rough edges of using Turbo with LLMs in the beginning feel completely gone now. Kept this one short to provide an update. Things are changing quickly, and it’s kind of interesting to think how much of this may or may not matter in the long run. If the LLM is writing our code and the customers have a great experience, how much does stack choice matter? Maybe we should index toward more complex technologies for humans but easier for LLMs to write? How much control should we cede? Thanks for reading. Until next time. Our codebase has 179k LOC of Ruby, compared to 61k from 18 months ago. A tripling! This can be somewhat attributed to our adoption of Sorbet for static type-checking. It just produces more verbose Ruby and provides some more safety that certain parts of our code base benefit from. Our JS LOC went from 4.1k to 14.8k in the same time frame. We’ve also adopted TypeScript here for some of our files that touch React. I’ve kept the linear trendline to simulate where we might have been with React. We’re still below where I’d predict we’d be had we stuck with it. You can clearly see where we made the cutover from React to Stimulus in August 2023, although it’s not as obvious since it’s so far in the past. Our Ruby LOC was growing super linearly last time, and that continues to be the case. I attribute this solely to Claude Code. It really whips the llama’s ass. Volume of LOC remains a liability, but the product capability has grown about this much or more in the meantime, so not concerning.

0 views
Max Bernstein 1 months ago

Travel notes: RubyKaigi Hakodate

I just got back from a three and a half week trip to Japan. It was the longest trip I have ever been on (aside from studying abroad in Germany, which felt different). I made the following wild circuit with only a backpack and a duffel: This trip was split into three parts: time with my immediate family, going to a conference, and then time with my partner. They were all great and also I am glad to be home. I’ll post my abbreviated travel notes here, including activity and food recommendations. We started in Tokyo but we were only there for about 40 hours. We focused our time mostly on arts and crafts: we did a kintsugi workshop, spent time at an artists cooperative, and then did a lot of walking around. This was a good intro to the trip, because everyone kept waking up at 4am and crashing at 7pm due to the jet lag. 4am wakeup makes for nice morning walks to 7-Eleven. I brought my family to T’s Tantan in Tokyo Station because I’m vegetarian and it’s otherwise hard to find ramen that approaches kosher in Japan. It continues to be great and I really appreciate having a steady vegetarian option available. Many years ago when I visited Tokyo there was a place that served a delicious tomato-based vegetarian ramen, but I hear it has since permanently closed. Bummer. We took the shinkansen to Kanazawa. I love the train. It’s fast. It’s quiet. You can eat your snacks on board and gaze out the window as the world whizzes by. It’s nice. We toured a soy sauce factory (meh; they don’t let you in the room where the magic happens) and the old town (pretty!) before finally eventually ending up at our small hotel in Toyama: Satoyama Auberge Maki No Oto. I highly recommend this hotel. It is beautiful, the staff is lovely, the food was excellent, and they were very accomodating of me being vegetarian. We continued on to Toyama, which is a port town. We got to talking with an older local guy who told us all about his favorite local spots. We learned after leaving that this guy has extraordinarily fancy taste and they were all either Michelin starred or at least Michelin rated and with a lead time of months. We opted to instead go to a local brewery, which had a ghost pepper beer (!) and pizza. We then moved on via train to Osaka, where we transferred to a car to head (eventually) to our hotel in the hills near Nara. We toured the Daimon sake brewery. They explained every little thing about the process, which was especially interesting to me, as I’ve done some small amount of homebrewing and I bake. They sounded similar. We had a tasting and even got to talk to Daimon-san. I recommend going. I also recommend the Akame 48 waterfalls walk/hike, which has some exquisite falls, and Murou Art Forest. They had some really wonderful installations. My brother and I parted ways from the rest of my family in Osaka: they headed further west and we headed north to Itō on the Izu peninsula. We got a surprise perfectly clear view of Fuji along the way. It’s beautiful there. They don’t seem to welcome foreigners in a lot of their restaurants (we were turned away several times) but one place had a guy who enthusiastically welcomed us in. We ended that evening enjoying a some food and a beer while also being stared at by a 300lb completely tattooed guy. It was a little unsettling but we left without incident. My brother and I made our way to Tokyo for the day before his flight and before my train north to Hakodate for RubyKaigi. I once again did that thing where I walked around in humid 80F heat with a large backpack and pants and was extraordinarily warm toward the end of the day. After about a liter of Aquarius on the train north I felt better. I stayed at Yunokawa Prince Hotel Nagisatei which I would like to especially call out for having an enormous, diverse, and very vegetarian friendly breakfast. Every morning I got to try new and tasty things and even feel full after. It was great. Hakodate is beautiful in the spring. I arrived at peak cherry blossom season and Goryokaku, their star shaped fort, is absolutely decked out in cherry blossoms. It is also moderately swarmed by tourists (in this case, three cruise ships). It didn’t feel over-crowded though. I enjoyed eating at The Bear King which had a vegetarian friendly option. The next day was the committer meeting. I don’t remember a ton from it other than people talking at length about the semantics of deep freezing an object (do you freeze its class? its class’s superclass? …?). I picked up my badge and also got to check out my colleague Chris Salzberg’s bar SOLENOID ! It’s a neat spot. I headed out to go find some dinner. This is about when I got a message on my phone that there was going to be an earthquake, so I walked back into the bar and said “hey, did you get this?” just before everything started shaking. It was the biggest earthquake I’ve experienced, but I was metaphorically not too shaken up. Then we got the tsunami warning. Chris’s bar is already something like 8 meters above sea level and at the foot of Mt Hakodate. With the city sirens going off and the police directing traffic with batons, though, I decided my best bet was just to march directly up the mountain to get more elevation. Since the tsunami wasn’t scheduled to arrive for about 20 or 30 minutes and my hotel was across the sea-level part of town, I parked myself on a little concrete post. Chris found me eventually. Someone told us that there was a middle school offering refuge, so we went and hung out on the side of the gymnasium. They were really nice about it. On Wednesday, the conference started. It was really well signed and organized. My usual complaint with conferences is that there’s nothing to eat for vegetarians (or that we get mashed with the gluten-free people and each group only gets a salad and bad bread) but that did not happen! They had really stellar vegetarian bento. They had a lot of leftovers toward the end of lunch so I even went and got a second. This was about when I started freaking out because my speaking slot was approaching and I wasn’t yet feeling my talk. Normally when I give a talk, I get up in front of people and I pace and gesticulate and productively complain and throw in some fun anecdotes and the audience, one way or another, ends up learning about JITs at scale, or Scheme semantics, or something. It’s what I’d done for my little lunch talk at Brown two weeks prior. I even titled that talk One must imagine compiler engineers happy so there was plenty of room for educational complaining. But this RubyKaigi talk was in front of an enormous crowd and toward a more general audience than I was used to addressing. The slides did not feel like they were flowing until about twenty minutes before my talk. In the end it went alright. I realized about 40 seconds in that I had way too much content so I ended up speaking rapidly for 30 minutes straight, completely unaware of the audience (which you can’t see anyway because of the lights). I only really noticed people when I made a dumb six-seven joke and Aaron laughed. The rest of the conference I was able to relax and enjoy other people’s talks. I got some good hallway track in, too. I think there’s a good group of people who are interested in Ruby tracing (for example, Perfetto in ZJIT ) so maybe we will make something happen. We had a nice small dinner at Yasai Bar Miruya , which was vegan (!) and had some nice sake. The host was very friendly, too. I nerd-sniped John and J into implementing a VM for the Universal Machine . This was a daunting homework assignment back in undergrad but it was a fun project later in life. S joined toward the end of the conference. She’s also vegetarian so we got some really excellent vegetarian ramen at MAIDO Ramen . Finally, S and I headed south on the shinkansen for Nikko. Nikko is small, beautiful, and a tourist day-trip town. Dinner closes early. Shops close earlier. Since we were staying there we had to make sure to track down and visit the one or two vegetarian places before they shuttered. S and I, along with J and J, took the bus up from Nikko, up the windiest switchbacks, to the Kegon Falls. We were going to take a boat across the lake, but the water level was too low for the dock on the other side, so we ended up half hiking and half taking a bus. Then we continued our hike through the Senjōgahara Marshland (beautiful), to the Yudaki Cascades (lovely), which also had a surprise restaurant and ice cream shop at the base! It’s called Yutaki Rest House . After some great (vegetarian friendly!! wow!!) udon, we marched up the waterfall and around Yuno Lake at the top to Yumoto Onsen. In order to make the last reasonable bus back to town, we just enjoyed putting our feet in the foot bath. One day was rainy. In the evening, J and I thought it would be fun to continue our Universal Machine implementations. As Norman Ramsey would say, “my implementation is 90 lines long and runs sandmark in under six seconds.” We also enjoyed doing a tour of the shrines right above Nikko. The shrines are resplendent against the backdrop of forest. Pro bus tip: you can either pay by IC card or credit card. No need to grab a ticket if you do that. S and I shipped our bags (thanks, Yamato) before continuing on to the small town of Moka, the staging area for our big pottery festival day. Unfortunately, there was no good way to get there: there was no reasonable series of trains and no taxi would take us. Ultimately we ended up taking the train to Utsonomiya and catching the long local bus to Moka. About twenty minutes into this ride, in the middle of nowhere, bus nearly empty, the bus driver pulled over and ran over to us looking kind of panicked. He asked where we were going and was visibly relieved when we said Moka. I suppose we are not the usual riders. Very nice of him. Upon arrival, S introduced me to CoCo ICHIBANYA, which is also super vegetarian friendly. I loved it. We ate really well before walking to our tiny hotel. We did not really know what to expect from the Mashiko pottery festival. The internet said it would be crowded and to arrive early, so we got up at 6:30am for estimated 7am departure on the tiny train from Moka to Mashiko. On most trains you can pay with an IC card but we were out in the sticks so we asked the only other guy on the platform how to pay for the train. He said he had no idea and that this was his first time here. When the train showed up completely packed to the gills and we had to (politely) push onto it, we started to realize that this was The Event and it was going to be mayhem. Also, fun fact: the way the Moka train payment works is that you grab a little ticket from the train, and, upon arrival, wait in line to present your ticket to two very overwhelmed looking people at a table, who charge you, and you pay in cash. Onto Mashiko: the festival was packed . There’s pottery everywhere the eye can see. There are tents and there are full buildings. It varies in quality and artistry from fine to jaw-droppingly spectacular. You could completely stock your kitchen from this fair alone and it would even be cost-effective. The main bummer for us is that we had to get pottery safely back home. We limited ourselves to a reasonable assortment but we really wanted to buy a beautiful painted 20 inch plate with a bird on a branch. After a ton of walking around, we took another long long bus back to Utsonomiya and continued onto Karuizawa. We didn’t know what to expect from Karuizawa but, having been, I could probably concisely describe it as “Aspen for people from Tokyo”. It was… fine. We loved our hotel, Tsuruya Ryokan. The manager was very excited when we borrowed a Studio Ghibli DVD from their collection. We continued on to Tokyo, our final stop. We our usual tour of stationery stores and bakeries—the bread was something to write home about (har har). We enjoyed a (vegetarian!! friendly!!) kaiseki meal at Hyoki Shabu-shabu Ginza before enjoying some live music at Rocky Top . We also recommend Jikasei MENSHO for vegetarian ramen. Bakery checklist: We had an uneventful and reasonably easy trip home. Whew. Long post for a long trip. See you next year in Miyazaki! BOUL’ANGE NIHONBASHI (check! good croissants) Bricolage bread & co (check! good everything) Brasserie Viron Marunouchi Beaver Bread Bricolage bread & co. Bartizan Bread Factory Gontran Cherrier Tokyo Aoyama Shop Comme’N Tokyo Shiomi Bakery The Little BAKERY <!– https://www.jocjapantravel.com/kanto-tokyo-bakeries/ –>

0 views
Rob Zolkos 2 months ago

Watch Your Agents

I’ve been telling developers to watch their logs for years. Not just when something is broken. Not just when production is on fire. Watch them while you are building. Your logs are the closest thing you have to x-ray vision for a web application. Click a button in the browser, watch the request move through the app, and you can see what is really happening behind the scenes. The habit is simple: keep the server log visible while you work. When you do, you start spotting problems long before they become production issues: The logs give you immediate feedback. They make the invisible visible. Coding agents need the same treatment. When you are working with an agent, do not just look at the final diff. Watch what it is doing. Watch the commands it runs, the files it opens, the mistakes it repeats, and the little bits of glue code it keeps inventing along the way. That is the agent equivalent of watching your development log. You are not only checking whether this turn succeeded. You are looking for patterns that can make future turns better. Most coding agents keep some kind of session history: transcripts, tool calls, command output, file edits, errors, retries, and sometimes timing information. Those logs are useful after the fact. Point the agent at its own session logs and ask it to look for patterns: A prompt I like for this: This is the same habit as watching the Rails log after clicking around a page. You are looking for the part of the system that is doing too much work, guessing too often, or hiding useful signal. A useful signal is when the model keeps generating code to do the same mechanical task. For example, imagine you have a skill for publishing blog posts. Every time you run it, the model writes a small Ruby or Python snippet to: If the agent is generating that code every time, that is a smell. The model is doing work that should probably be deterministic. Ask the agent to turn that behavior into a script: Then update the skill so future agents call the script instead of improvising the logic. Bad pattern: every publishing session, the agent manually inspects YAML front matter and tries to remember the required fields. Better pattern: create that exits non-zero when , , , or are missing or malformed. Now the agent does not need to reason about the rules from scratch. It runs the command and reacts to the result. Bad pattern: the agent repeatedly writes one-off Python to resize screenshots, compare image dimensions, or calculate visual diffs. Better pattern: create with clear output like: The agent can use the result without reinventing image processing each time. Bad pattern: the agent keeps constructing ad hoc SQL to answer common questions like “which users have duplicate active subscriptions?” or “which jobs are stuck?” Better pattern: create named scripts or Rails tasks: Now the workflow is repeatable, reviewable, and safe to run again. Bad pattern: the agent writes custom code every time it needs to build a fake webhook payload or API response. Better pattern: create or a small fixture library that produces known-good examples. The agent stops guessing at payload shapes and starts using something the test suite can trust. Moving repeated agent behavior into deterministic tools gives you a few wins: Watch the agent the way you watch your logs. When you see friction, repetition, or uncertainty, ask whether the agent needs better instructions or a better tool. Sometimes the answer is a clearer prompt. Sometimes it is a skill. And sometimes the best thing you can do is take the fragile reasoning out of the model entirely and give it a boring, deterministic script to call. That is not making the agent less useful. That is making the whole system more useful. the same query firing 50 times because of an N+1 a page that feels fine locally but is doing way too much work a slow query that needs an index an unexpected redirect or extra request a cache miss you thought was a cache hit a background job being enqueued more often than expected parameters coming through in a shape you did not expect What tasks did you repeat multiple times in this session? What code did you generate only to throw away later? Which commands failed, and what would have prevented those failures? Did you write any one-off scripts that should become checked-in tools? Did you repeatedly search for the same files or project conventions? Were there project rules you had to infer that should be documented? Which parts of the workflow were deterministic enough to automate? What should be added to , a skill, or a script? If a smaller model had to do this next time, what tools or instructions would it need? parse front matter validate the title, summary, badge, tags, and date derive the final filename move the draft into Dependability: the same input produces the same output. Determinism: fewer “creative” variations in routine work. Testability: scripts can have tests; improvised reasoning usually cannot. Reviewability: a script can be read, improved, and versioned. Cost: once the workflow is encoded, you may be able to use a smaller model for that task. Speed: future turns spend less time rediscovering the same procedure.

0 views
Tenderlove Making 2 months ago

Rails Security, AI, and IBB

For quite a few years the Rails project has been working with the Internet Bug Bounty (IBB). The IBB is an organization that awarded cash to security researchers that reported issues to OSS projects participating in the IBB. For quite a while I wasn’t certain about my feelings toward the program because I felt like cash rewards could incentivize low quality reports as well as encourage reporters to “haggle” about the severity of a particular bug (the IBB paid more when the bug was more severe). In the beginning that certainly was the case. We were fielding many low quality reports, and people were haggling over severity. But the program evolved, and despite the never-ending haggling, I felt it did more good (rewarding security researchers) than bad (forcing the security team to wade through low quality reports). That is, until AI came along. Sometime in 2025 our team started getting inundated with low quality AI generated reports. I know for sure this wasn’t unique to just our team as well. Anyway, AI lowered the barrier to generate reports, so we were back in the era of wading through low quality reports. Only this time, the low quality reports were masquerading as high quality reports. AI made it easy to turn a bullshit problem into something that looked legit, and since there’s a possibility of money involved people tried to take advantage of the situation. We even had a report where someone forgot to delete the AI generated output and just uploaded the report as-is with the following text: I enjoy using AI, but I really don’t like AI being used on me. But that’s not what this post is about. Recently the IBB stopped accepting new submissions. In other words, they aren’t paying bounties to security researchers anymore. I don’t know for sure since I haven’t asked them directly, but I suspect this is due to so many projects being inundated with AI generated reports. I think putting a stop to bounties makes sense for the time being. Of course the downside is that legitimate researchers are no longer incentivized to report bugs to OSS projects. Finally, the Rails team didn’t actually handle paying out any of the bounties. After we accept and release fixes, the IBB took care of the bounties and we had no visibility into that process. Since the IBB has stopped accepting new submissions and paying bounties, we’re now tasked with playing customer support for IBB as many reporters are now asking us “are we getting paid?” I honestly don’t know what to make of this situation except that working in OSS security will always find new and interesting ways to suck. I don’t have any particular “call to action” for this post, but I hope that it gives people some kind of glimpse into how the tofu is made. Anyway, have a good day, and remember: It’s always Friday somewhere!

0 views
iDiallo 2 months ago

Don't use localhost:3000, use your own custom domain

After presenting a demo of how an internal tool works, I was flooded with questions. Not about the tool, but about why I had bought a domain just to run the demo. "Why didn't you use the staging server?" they asked. I was confused. I didn't buy a domain. I was running it locally. But instead of the URL being , it was a fully formed domain. . In fact, some people told me that they couldn't access the website on their devices. They thought I had to whitelist their IP to grant them access. To feel young again... Setting up a custom domain locally was common practice when I started web programming. But with the advent of Node.js (and rails?), everyone has resorted to just pointing to with an incrementing port number. The main reason is that the webserver is often bundled into the application itself. It’s easy to just run and call it a day. However, if you have multiple long-term projects running locally, especially if they need to communicate with one another, then managing a mental map of ports like , , and quickly gets tiring. This is where my old school approach shines. By combining the system hosts file with a reverse proxy like Nginx, you can run different projects locally with actual domain names. I usually end up with for active development, for a stable local build, and the actual production URL for the live site. Here is how to set it up. First, we need to tell your computer where to find these domains. Think of as your computer's personal contact list. When you type a URL, your computer looks here first. By adding an entry, you are telling your computer: "Don't bother checking the internet when I ask for myproject.com, I am actually talking about this machine." It creates a manual override that maps a friendly name directly to your machine's IP address. You can edit the file here: Linux/macOS: Windows: Open the file in your editor. In this file, right after the block of entries for Adobe (active.adobe.com...), add this line: Now, when you access those domains in your browser, they don't point to the wider internet, but directly to your own machine. Now that the domain is pointed to your own machine, we want to redirect it to the right application. If your app runs on port , navigating to will default to port and fail. This is where Nginx comes in. It listens on port and forwards the traffic to the specific port your app is running on. Here is a simplified Nginx config to make it work: Restart Nginx, and voilà! You have clean, professional URLs for your local environment. If you are running your services inside Windows Subsystem for Linux (WSL2), networking is handled a little differently because the Linux instance has its own virtual IP. You can get your instance's IP address with this command: You would use that IP address in your Windows hosts file instead of . After that demo, some people were disappointed to learn the trick. They thought I was so committed that I had bought a domain name just to give them the raw deal with my demo. Someone mused about a shirt with the words "real men don't use localhost:3000". That could have started a whole new motivational speaking career for me. A custom domain just looks very professional and is practical for separating environments. It just feels cooler than staring at all day. That's how you separate yourself from vibe-coders. Anyway, back to earth. I feel like this is a lost skill and I'm keeping it alive by sharing it. That's how you run a custom URL locally.

0 views