New York Times: Analysis: ~1M $TRUMP retail buyers lost a combined $3.81B, while ~500K mostly-early wallets captured $4B in gains, a textbook memecoin wealth transfer — A report from a cryptocurrency analytics firm details how those who bought the Trump memecoin have fared, with most retail investors having lost money …
Articles
Browse all AI articles. Use filters to narrow down results.
Most Recent Articles
Ukraine is paying big to get foreign fighters to the front. Keeping them there is the hard part.
Ukrainian soldiers fire rocket artillery toward Russian positions. Dmytro Smolienko/Ukrinform/NurPhoto via Getty Images Ukraine is offering foreign fighters higher pay and longer contracts for dangerous front-line roles. Soldiers told Business Insider that the move could help address a major manpower challenge. However, success will depend on whether Kyiv can not only recruit troops, but also retain them. Ukraine is offering foreign fighters higher pay and longer fixed-term contracts to fill dangerous front-line infantry and assault roles, a move soldiers say could help address one of Kyiv's biggest manpower problems. However, foreign fighters told Business Insider that the effort's success will depend on whether Ukraine can persuade recruits to stay longer rather than leaving right after hitting the six-month minimum. "More guys will come for the money, obviously," said Ryan O'Leary, the company commander of Chosen, a volunteer unit in Ukraine. However, he said it won't automatically fix the country's manpower issues because Kyiv still has a "revolving door" of foreigners leaving after short contracts. Ukraine announced a significant overhaul of its compensation for military personnel last month, with officials laying out an ambitious plan for higher pay, more combat bonuses, and longer fixed-term contracts. The combat pay plan includes new contracts of six to 14 months for infantry and assault troops, with service members eligible for an average monthly pay of UAH 300,000 (nearly $7,000) and a maximum of UAH 460,000 (over $10,000), depending on the number of days at the front lines. Mykhailo Fedorov, Ukraine's defense minister, described them as the "highest salaries in the world for infantry," calling these front-line roles the "most difficult and risky job" right now. He said the goal is to fill 30-50% of these positions with foreigners. These jobs can be some of the deadliest. Front-line positions are often described as kill zones, the threat of drones making it hard not only to survive but even to get there in the first place. Pay can be a strong motivation, though. "We see now that a large number of foreigners are coming to Ukraine to fight, because today's salary is already attracting them," Fedorov said last month. "If we're talking about an increase, then this will attract even more foreigners, and then they will be able to strengthen our front line." O'Leary said the higher pay and longer contracts could help if they push foreign fighters to stay for a year or more. The problem, he said, is that many of them have historically treated six months as the endpoint, leaving Ukraine with little return on the time and money spent training and equipping the soldiers. A Ukrainian soldier scans the sky for a drone. Pierre Crom/Getty Images By the time a recruit finishes basic training and reaches a combat unit, a short six-month contract may have only a few weeks remaining for front-line operations, he said. That makes having longer contract options key, but only if Ukraine can give fighters a compelling enough reason to choose it. 'You need to pay' Foreign volunteers have flocked to Ukraine since the start of Russia's full-scale invasion in February 2022, with many driven to the fight by ideological or political reasons — a sense of duty to protect a nation attacked by its much larger neighbor — rather than financial incentives. However, the situation changed as the war dragged on, said Kante, a foreign fighter who asked to be identified by his call sign for security reasons. He said that there are fewer "motivated foreign fighters," adding that many of these volunteers have been killed in combat or left, and Ukraine must now fill those vacancies. Now, volunteers are increasingly joining for financial reasons. Ukraine is no longer competing only for idealists; it is also competing in a global market for experienced fighters. "If you want guys, you need to pay," he said. Kante, who has served in infantry and assault roles for Ukraine, said that the pay needs to be competitive with what experienced fighters can make in other conflicts, such as a former South American officer familiar with battling rebels weighing a contract in a place like Sudan. Ukrainian soldiers during a training drill last year. Viacheslav Madiievskyi/Ukrinform/NurPhoto Ukrainian military personnel view the new contracts as a positive for Kyiv. Yuriy, an officer in an electronic warfare unit who could only be identified by his first name, described the push for foreign fighters as "one of the best solutions" to address manpower challenges. "I think it's just a solution to fill the gaps," said Alex, a sergeant in Ukraine's 412th "Nemesis" Unmanned Systems Brigade. He could only be identified by his first name for security reasons. Alex said Ukrainians who were "brave enough" had already joined the military earlier in the war and are either exhausted or hurt. Newly mobilized personnel, he said, may not be as willing to risk their lives. Improving returns on investment Kyiv's push for foreign fighters comes as its military faces a grinding, attritional manpower problem more than four years into the Russian invasion. Infantry and assault troops are among the most battered forces on the battlefield, and Ukraine has struggled to keep front-line units staffed as the war has dragged on. The new contracts with a promise of bigger payouts could give Ukraine a way to bring in more foreign fighters and keep them longer. Foreign troops said that the test is whether the higher pay and clearer terms are enough to persuade recruits to choose a longer contract rather than leave after six months. Despite the push for recruits, foreign fighters said that sustaining the current force should be Ukraine's priority. O'Leary, the Chosen commander, said many foreign fighters sign a six-month contract and then either return home or move to another unit, leaving Ukraine with little to show for the investment. A Ukrainian commander leaves a bunker near the front lines. Pierre Crom/Getty Images He described the revolving door as a "negative for Ukraine" and said the country should prioritize retention alongside recruitment. Deeper issues often push foreign fighters to leave the war after six months, O'Leary said, including limited access to Ukraine's digital military systems and fewer day-to-day benefits. Fixing those problems, he said, might matter more to retention than higher pay. "They've already fixed the permanent residency and the citizenship stuff, so I think that's one movement forward," he said, adding that Kyiv now needs "to work on just leveling the playing field for foreigners so it seems like we're on the same page as the Ukrainians." Ukraine's defense ministry said it isn't currently in a position to comment on these efforts. Overall, foreign fighters said that Ukraine is moving in the right direction with talent retention. Charlie, a US military veteran and current candidate for Ukraine's 3rd Army Corps, said that the new contracts and payments are "positive steps" from Kyiv toward incentivizing foreign fighters to stay longer. He asked to be identified by his call sign for security reasons. "I think they're doing a good thing by understanding that they have this foreign demographic from all over the world that's coming into the country and bolstering their military, and they're actually doing things to incentivize people to come — incentivize people to stay — not just to do minimum six months and leave," Charlie said. He said the longer contracts might be most appealing to foreign fighters who come to Ukraine for combat experience that they won't find on any other battlefield. "If you look at the world right now," Charlie said, "the best place to get that experience is in Ukraine as a foreigner." Read the original article on Business Insider
I'm a 25-year-old grad student on a budget. I've struggled to accept financial help from my Boomer and Gen X friends.
The author with her 64-year-old friend at a Manhattan coffee shop. Courtesy of Jacqueline LeKachman Quitting my full-time job to go to grad school sent me into major money-saving mode. My Gen X and Boomer friends had larger budgets, and I worried when they routinely paid for me. After one of my friends said something wise, I was able to slowly release my anxiety. In August, I quit my steady job as a New York City public high school teacher to start a full-time graduate program in Manhattan. I worried about the choice not only because I loved my work with the kids, but also because I had traded a consistent paycheck and affordable health insurance for tens of thousands of dollars in tuition. When I was teaching, I prepared for the cost by scrimping to save every cent I could. But my account balance still wouldn't fully cover two years of school and living expenses. Throughout my savings journey, I learned a lot of lessons, especially from my older friends. I jumped into major money-saving mode As a result, I redoubled my frugal efforts. I made a rule that I wouldn't eat out or order takeout unless it was someone's birthday. I asked to meet people in parks rather than restaurants and suggested $5 happy-hour spots from a meticulously crafted list on my phone. On rare occasions when I dined out, I looked at the prices before deciding what to order and pored over the bill with a calculator. It worked. While it was still difficult to watch my savings dwindle — buoyed occasionally by small deposits from part-time jobs — I kept my costs (relatively) low for a 20-something in the city. Most friends understood my restrictions or were in similar situations. I worried when my older friends routinely paid for me But this approach didn't work as well with my five older friends from my intergenerational writer's group. We'd been meeting weekly on Zoom for several years when we started visiting each other in our home states across the country. As women in their 40s and 60s in dual-income households with established careers, they understandably gravitated toward nicer places where the cheapest cocktail cost $20. My dive bars with weirdly stained walls weren't going to cut it. When I visited two of these friends in Chicago, I anticipated that we'd go to swanky spots and saved up for weeks, cutting out anything nonessential from my grocery list — chocolate-covered pretzels, bananas, frozen fried rice. But when I offered to chip in for our multi-course dinners or luxury spa day, they brushed me off. I was grateful for their generosity, yet overcome with guilt. They had contributed so much to our time together. I didn't want to be a freeloader, the friend who couldn't hold up her end of the deal. How could I pay them back and show my appreciation? At the end of the trip, my friend Andrea, 46, and I ate lunch in a diner in the Gold Coast. I made one last offer to Zelle her. In response, she said something that stuck with me. "When I was in my 20s, people helped me," she told me with an easy smile. "When you're 40, just pay it forward by buying a younger woman dinner." Her wisdom helped me slowly release my anxiety I mulled over her words on the plane home. I was surprised that her view of the situation differed so much from mine, and relieved she didn't see me as taking advantage of her. Yet it was still hard to fully let go of the weight in my chest — the feeling of being indebted to someone's kindness, of accepting a gift while knowing you can't reciprocate. Months later, my 64-year-old friend from my writer's group visited from Florida. We went out for coffee, and I thought to myself, Okay, now this I can afford. But when I offered to cover or at least split it, she waved me off, saying, "My treat." I thought of Andrea's words and told myself, She's being nice. Don't worry about it. "Thank you," I said, and meant it. A while later, when another friend visited from Washington, she paid most of our checks at the bars and restaurants we visited. Though I felt a twinge of the usual panic at first, by our second day together, I was able to let it go. As we wandered through the Upper West Side, the tightness in my chest lifted, leaving only gratitude that she was here. I do plan on paying it forward Andrea was right, I realized. Helping each other was what friends did, and they clearly weren't bothered by it. Sure, I wasn't paying for lavish things or hosting people, but I shouldn't let my own hangups affect our time together, which always produces some of my favorite memories. Eventually, I'll be able to do what they've done for me for another woman, who can then help someone else. Instead of worrying, now I let my friends' kindness bring us together and smile, knowing that every time I pay for a 20-something woman in the future, I'll think of them. Read the original article on Business Insider
I've perfected my chocolate chip cookie over the years, always working from memory. To my sons, they are so much more than a dessert.
The author's sons love her chocolate chip cookies so much that her older son asked for a giant chocolate chip cookie instead of a cake for his 11th birthday. Courtesy of Kristina Wright I make chocolate chip cookies from a recipe I've been tweaking for over 25 years. My sons say they're the best cookies ever, and have been asking me to write down the 'real' recipe. The cookies are the taste of their childhood, and I understand why they're so connected to them. According to my two teenage sons, I make the best chocolate chip cookies in the world. I accept this compliment with the appropriate amount of gratitude and skepticism, because "my" recipe started life as a clipping from a women's magazine at least 25 years ago, which I then taped inside my Better Homes and Gardens cookbook so I wouldn't lose it. Since then, I've changed enough things — bread flour in place of all-purpose flour, half the amount of salt, a little extra vanilla, no nuts, double the chocolate chips, chilling the dough when the kitchen is hot — that it only vaguely resembles the original. The problem is that I have never written any of this down. I use the original recipe as a guide and make the adjustments according to memory. So if my kids decided to make cookies using the recipe taped in the cookbook, they'd end up with an entirely different cookie. My go-to cookie recipe became the only cookies they want "Mama, you need to write down the real recipe," my youngest son said, again, a couple of months ago, when I was baking a double batch for the student council bake sale. What's funny is that these cookies have always felt to me like the laziest, most basic cookies in the world. There's nothing fancy about them; I don't even buy an expensive brand of chocolate chips. But they're reliable and quick, and yes, delicious. Part of the reason they became such a fixture in our family is because they were easy. I'd always enjoyed baking and, before kids, would regularly bake for friends and coworkers. Then I became a mother in my 40s, and I knew I wanted to create the kind of home where homemade cookies occasionally appeared after hard days, before big tests, or because it was raining outside and we had nowhere else to be. Somewhere along the way, these cookies became part of our family life in a way I didn't plan for. I packed them into school lunches, made them for road trips, beach vacations, sick days, and on request. When someone would ask, "Can you bake cookies?" these were the cookies they meant. One year, my older son requested a giant chocolate chip cookie for his birthday instead of a cake. I told him I could order one from the grocery store bakery, but he wanted me to use my recipe. So that's what I made. The author has also made her chocolate chip cookies for bake sales. Courtesy of Kristina Wright My kids associate home with the smell of my cookies Every once in a while, one of my sons will come home after trying an expensive bakery cookie or a friend's mom's cookies and announce, with complete sincerity, that it wasn't as good as mine. This makes me laugh every single time. There are obviously better cookies in the world than the ones I make in my kitchen with grocery store chocolate chips, but that's not really the comparison they're making. They aren't looking for the objectively best cookie; they're looking for the taste of their own childhood. As an older mom and a writer, I think about memory more than I used to. I think about what my children will remember when they leave home, and eventually what they'll remember when I'm gone. I've spent years preserving the pieces of my children's lives that seem important. I've saved photographs and school papers, written letters and blog posts, kept journals and datebooks full of ordinary details of our family life. I realize now that sometimes what lasts are the things that show up over and over again. The inside jokes, the favorite dinners, the holiday traditions — and a cookie recipe made so many times that its smell alone can take you home. The cookies are a part of our family story One day, my boys will be in college and live in apartments and homes of their own, and I won't always be there when life gets hard or lonely or overwhelming. But I can put cookies in a box and send them wherever they are. And, if they want to, they can make the cookies themselves. So yes, I'm finally going to write the recipe down, and I'll make each of them a copy. Maybe they'll pull it out in a dorm kitchen someday. Maybe they'll make them for roommates, partners, or their own children. Maybe one day they'll have changed the recipe so much that it barely resembles mine. I think I'd like that. Read the original article on Business Insider
My 11-year-old son used AI to build his own video game — I see it as a creativity boost, not a threat
Michele Ragon's 11-year-old son, Jacob, is using Copilot to create video games. Courtesy of Michele Ragon Michele Ragon first used AI with her 11-year-old son to help with school research. She later found him using Copilot to vibecode his own video game based on a book he read in school. She said she thinks this is a perfect example of AI not taking away from human creativity. This as-told-to essay is based on a conversation with Michele Ragon, a 46-year-old employee communications business partner at LinkedIn, based in the Bay Area. The following has been edited for length and clarity. My 11-year-old son just finished fifth grade, and earlier this year, he was diagnosed with ADHD, dyslexia, and dysgraphia. He has trouble remembering the order of things and organizing his thoughts. I got him a new computer for Christmas, which he can use to access Copilot. The first time we used AI together was to help research for a school essay on hurricanes. The two of us were working with Copilot open on the side of his essay notes. Being able to go back and forth with the AI and ask it questions was eye-opening for him. He was able to get much more context from the research he was doing. Then, a few weeks later, one night, I came up behind him while he was working on his computer. Until I started asking questions, I had no idea he was building his own video game with AI. I think for him, the simplicity of using AI is what he loves. He doesn't have to be a coder to be creative in this way. This is a perfect example of AI not taking away from humanity or creativity. It took my son less than 8 hours total to build a video game with Copilot There's a gaming platform called Steam where my son sometimes browses to play free game demos. He doesn't have a paid account on the site, but he explores the games on it. In school, he had read a book called "Mrs. Frisby and the Rats of NIMH," and something about this book caught his attention. It reminded him of a civilization-building game he had seen on Steam that he thought was really cool. He told me he just started asking Copilot questions like, "Help me build this game. Here's my idea. How could I build this game?" Then the model started walking him through the steps. When I asked him how long it took to build, he said it was four days of working with Copilot for an hour or two a day until he got a workable version. He said AI never gets mad at him One of the best parts of working with AI, he said, is that AI never gets frustrated when he asks a question over again; it just repeats the answer in a different way. His favorite prompt is asking, "What does this mean?" If he gets an error code he doesn't understand, he'll copy it back into Copilot, and it will walk him through it. If it's still too technical, he'll ask the question again, and it will simplify the response even further. He also uses voice mode to talk to the model when he finds it hard to type out what he wants to ask. He said the hardest part is that he can get stuck with the same error, and neither he nor the AI can fix it or diagnose the problem. He doesn't have the maturity yet to understand that when that happens, he has to do something different, or prompt it in a different way, or he's going to keep getting the same results. When somethings not working, if he can, he'll move on or try to work around it. For example, he changed the rats to smiley faces because the game kept crashing. I have worries about his AI use, but the creative benefits are huge I think it was a low-risk environment in the specific game that he was building. I wasn't concerned that inappropriate content or responses would come up. Still, I wonder whether he has the ability to spot if something is incorrect, or if AI has given him information that is not right? I also think about the games he's seeing online on this gaming platform that anyone can post to. We like to let our kids explore on their own and then show us what they're learning, but as a parent, have I put the proper parental controls on what my son's seeing and what he's able to build online? However, building a game was entirely my son's idea, executed with the help of AI, and he had no other way to do it because he doesn't know how to code. I think, for him, using AI almost amplified his creative juices because there's a positive reward in actually making something he can use and play with. I think schools should teach kids how to use AI appropriately I think schools that aren't teaching students how to use AI are doing a huge disservice. I work for a tech company, but I have conversations with friends who don't work in tech, and they are using AI in so many ways, too. A friend who was job-hunting told me she had Claude help her practice for interviews, and she used it daily in her job search. Even when Googling something, you get an AI-generated response right away. AI is coming so fast and furious, and I think it's a disservice that we're not teaching kids how to use it in an appropriate way. I asked my son if there was anything else that he wanted to build, or anything else he's excited about with AI. His face lit up to talk about the next game idea that he has. As a parent, it's amazing to see your kid get that positive reinforcement. Do you have a story to share about AI and parenting? If so, please reach out to the reporter at aapplegate@businessinsider.com. Read the original article on Business Insider
Chemical accidents rise as Trump administration proposes weakening safety rules
Chemicals from accidents that injured or killed people increased by nearly 50 percent in recent years.
Victor Llorente for BI Anand Gopal had never considered working with a stylist. "I always thought personal stylists were for the elite," the 45-year-old award-winning journalist and author told Business Insider. Then, he met Zahra Waliji at a party and saw the outfits she'd put together for his friends. He thought she was talented and enlisted her to style him for a friend's birthday party in January. Gopal, who's based in New York, said he spent a few hundred dollars on the service, less than he expected. "Her model is more like personal styling for the masses, and I'm definitely in that category," he said. @media (min-width: 768px) { .vertical-image-wrapper { display: flex; justify-content: center; } .vertical-image-wrapper .vertical-image { width: min(calc(80vh * var(--img-w) / var(--img-h)), 100%); min-width: 0; } } Waliji, who went from being unemployed in 2024 to personal styling nine clients this year, is just one out of an industry that employs more than 263,000 people in the US and is projected to add more than 65,000 new jobs over the next decade. Many of these stylists dress everyday people for vacations, dates, work, and other day-to-day activities. They help clients do more with less and craft personal brands that go beyond Instagram. Most importantly, stylists are saving their clients two things that are often in short supply: time and energy. "We all have a million things to do, so to know that my outfits can be taken care of is really good," Gopal said. "Not having to worry about what you're going to wear is a nice luxury." "[Stylists] are helping reduce cognitive load," he added. A luxury made accessible In 2024, Waliji had just resigned from her yearslong job at a New York City hospital before relocating to Tanzania. Although she was focused on traveling, she was also designing, styling, and tailoring more than 40 outfits for herself and six family members ahead of her brother's three-day wedding in Zanzibar. @media (min-width: 768px) { .vertical-image-wrapper { display: flex; justify-content: center; } .vertical-image-wrapper .vertical-image { width: min(calc(80vh * var(--img-w) / var(--img-h)), 100%); min-width: 0; } } Waliji was, to put it simply, inspired. So much so that the now 42-year-old returned to New York City a year later with fresh creativity in her back pocket. "For the first time in my life, I was having fun styling my own body," she said. "I was feeling more confident and knew I was really good at it. So I wanted to do the same for other people and make styling my job." In Waliji's case, the career move turned out to be a relatively easy transition. In our world of aesthetic perfection, many people — not just celebrities and billionaires — are seeking styling services. It's one of the various cosmetic enhancement tools that have made their way mainstream, à la Botox, veneers, and GLP-1s. Searches for "personal styling" have skyrocketed since spring 2025, while breakout queries for the "best personal styling service" have increased 150% over the past five years. Google Trends data from the search "personal stylist" between 2005 and 20026. Google Social media, of course, plays a role. The more we post photos and videos of ourselves, the more we want to look our best. There's also the fact that, even when we don't necessarily want to be, we're always on camera — work Zoom calls, FaceTimes with friends, and Ring doorbells capture our every move. Where there's supply, personal stylists are meeting demand. "My clients are normal people, but they are highly successful and motivated," Maiya Plather, a New York-based stylist, told Business Insider. That's why she and other personal stylists deliver more than just outfits. It's self-confidence and stress relief that clients are really paying for. When a stylist dresses an everyday client, the task at hand is not necessarily to create a singular red carpet or social-media moment. It's more personal and long-term. And for many clients, the process begins with their own wardrobes. Victor Llorente for BI "My approach is, first, teaching you how to rewear things in your closet," Waliji said. "We're minimizing having to spend more money." Every dollar counts, especially since styling can cost anywhere from a few hundred to a few thousand dollars per service. While Waliji initially charged thousands of dollars for services like closet cleanouts, following industry standards, she has since lowered her prices to reach more clients. She now charges $2,000 for in-person capsule wardrobe consultations, $450 per hour for private style consulting, and $250 for virtual closet cleanouts, where she connects with clients over Zoom and helps them decide whether to keep or remove each piece of their wardrobe. Clients may pay extra to purchase new pieces that help stylists fill gaps in clients' wardrobes. Victor Llorente for BI "I have tried to master the skill of buying inexpensive clothes and making them look very high-end," Waliji said. "I'll practice on myself and style a look from head to toe for $75, so I know it's doable." Where celebrity styling and personal styling merge, though, is in the art of tailoring. It's not always the clothes themselves that make A-listers stand out. It's the fit. "[Clients] can buy a pair of pants for $25, invest another $30 to get them hemmed or to get the waist taken in, and then the entire look is elevated," Waliji said. As the industry has expanded to serve more customers, the array of personal styling services has also grown, benefiting both consumers and providers. @media (min-width: 768px) { .vertical-image-wrapper { display: flex; justify-content: center; } .vertical-image-wrapper .vertical-image { width: min(calc(80vh * var(--img-w) / var(--img-h)), 100%); min-width: 0; } } On TikTok, for example, there's a subset of stylists who scour thrift shops and dealer archives to find unique secondhand pieces for clients. Typically, these clients and stylists never actually meet; they communicate solely through texts and vision boards. At the end of their exchanges, though, customers have standout pieces to add to their closets, and stylists have new social-media content they can use to promote their services. The latter has proven especially beneficial for stylists who take their services online, regardless of their niche. Kenzie Welch is one of them. She styles everyday people with modern pieces and films their makeovers as part of an ongoing TikTok series. Her videos have gained her 1.3 million followers, more than 28.2 million likes, and a plethora of new clients. Videos like Welch's often inspire people who never before considered working with stylists. Through social media, they uncover that styling is an option. View this post on Instagram A post shared by Kenzie Welch (@stylingwithkenzie) Actors, musicians, athletes, and models are often gifted clothes and loaned designer pieces for specific events. Doctors, lawyers, and other everyday professionals who work with stylists don't usually have access to those perks. Still, they're happy to invest in pieces handpicked for them. It makes sense. Our society loves convenience. When we don't want to cook dinner, we order from DoorDash and let the fees add up. So why not splurge on styling? Someone else can figure out what clothes work for our bodies, purchase them for us, and style them into multiple outfits. And they can do so for any occasion. It's a bit different from what stores like Aritzia, Nordstrom, and Bloomingdale's offer through personal styling appointments, which are often limited to one retailer's inventory. Personal stylists can work across brands and build long-term plans for their clients. Consider vacations. Buying new pieces, turning them into cute outfits, and making sure you don't forget anything when you pack requires time and energy that many people don't have. Stylists can ease that burden. Victor Llorente for BI "I'll have clients say: I have a 10-day vacation, and I need you to style me for daytime and nighttime looks. I don't want to think about it. I want you to help me pack so when I go there, I know exactly what I'm wearing," Waliji said. "I'll do that, and I'll take pictures [of each outfit] so they have a guide." The ultimate luxury that results from personal styling, though, is confidence. "I've struggled with body image issues and confidence my entire life," Waliji said, noting that she understands the emotional side of styling. "Working with women and men to make them feel powerful, strong, and empowered every day creates a kind of happiness that nothing else can bring." One client of Waliji's works as a teacher in New York. Her personal uniform consists of a simple blazer and trousers every day — no accessories, skirts, or fancy hairstyles included. When Waliji styled her for a party, though, she realized she could actually color outside the lines. "Everyone was talking about my outfit at my party, and I was turning a lot of heads," the teacher told Business Insider. "People who I see every day at work got to see me in a new light. It was a big deal." Naysayers might argue that there's no need to spend on personal styling when you can get fashion advice for free from a friend, a store salesperson, TikTok, and ChatGPT. Stylists and their clients disagree. Victor Llorente for BI "I was working with a client, and I picked a Zimmerman dress for her," Waliji said. "When she put it on, she said, 'This is it. I want every dress to make me feel this way.'" "I made an effort to understand what makes her feel good," she added. "You can't really get that from TikTok." And you never know. If you can't afford a stylist but you meet one like Waliji, you might get lucky. Styling, she believes, should be accessible. "I don't want money to get in the way of making you feel good," she said. "I'm a bad businesswoman. I've worked with people for no cost." The teacher client mentioned above was one of them. "If I'm being 100% with you, [Waliji] styled me for free as a birthday present," she said. "But for the record, I would pay for her services." Read the original article on Business Insider
The heat of the Hadean may have come from impacts as well as the interior.
10 book recommendations for your summer reading list
Getty Images This post originally appeared in the BI Today newsletter. You can sign up for Business Insider's daily newsletter here. Beach reads Happy Fourth! Hope everyone enjoyed a good backyard barbecue, a trip to the beach, or simply had the chance to slow down and recharge. With the holiday weekend winding down, that can only mean one thing: summer reading season is in full swing. Personally, I've been reading Joanna Stern's "I Am Not a Robot: My Year Using AI to Do (Almost) Everything." Joanna is a former colleague and current author of the awesome "New Things" newsletter. She writes the way she speaks. The book is hilarious, timely, and an absolute must-read. I also asked our editors to share their favorite reads and recommendations. Here's what they said: Jamie Heller, editor in chief: I'm reading "The Calamity Club" by Kathryn Stockett, author of The Help. The book is slow in spots and at times slightly predictable. But, overall, it's been a can't-put-down read, and those are rare. Julie Zeveloff, director of editorial product strategy: Money is the ultimate fiction: that's the premise of Jacob Goldstein's "Money: The True Story of a Made-up Thing," one of my favorite history reads of late. This book gave me a new perspective on how we all need to believe in money for it to work. Plus, it's funny! Joi-Marie McKenzie, editor in chief, Life: I'm reading Mara Brock Akil's debut novel, "The Revelation of Dionne Daphne." You might know Akil from her hit TV shows, "Girlfriends" and Netflix's "Forever," which is in production for its second season. The book is centered on a magazine editor, a messy character that's delicious to read, coming to terms with her past. Meghan Morris, Singapore bureau chief: Fortesa Latifi's "Like, Follow, Subscribe" wades into the child influencer debate with much-needed nuance — and a smart angle about the big business of family content creators. Akin Oyedele, deputy editor of newsletters: What do consultants actually do? The book "When McKinsey Comes to Town: The Hidden Influence of the World's Most Powerful Consulting Firm" answers it, and probably makes you very cynical of the super-secretive industry. Ryan Kailath, senior editor, economy: My supply chain book club is reading Meg Jacobs' "Panic at the Pump" about how the original "biggest oil shock in modern history" sprang from and spiraled into further political crises and changed the course of global history. Kate Ortega, director of newsroom operations: My summer reading recommendation: "Guns, Germs and Steel" by Jared Diamond. It explains how the development of societies around the world is deeply rooted in the geographic differences of the places they were formed. I find myself thinking about it off and on, even a decade after I first read it. Jennifer Beck Goldblatt, senior editor, health and parenting: Bruce Holsinger's "Culpability" has a lot going on: tragedy, family drama, young love, and dark secrets, all set near the sprawling waterfront estate of a billionaire. The writing feels fresh as the suspense is amplified through the lens of modern technology, mainly the morality — or lack thereof — surrounding our use of AI. Max Adams, deputy editor, markets: "Malazan Book of the Fallen," by Steven Erikson. If you are among the fans waking up to the possibility that George R. R. Martin might not ever finish Game of Thrones, here's a 10-book fantasy series that's already complete. The books are a commitment, but once you're in, it's hard to get out. What are you reading? Send me your summer reading list at srussolillo@businessinsider.com. BI may earn a commission if you purchase through our links. Read the original article on Business Insider
Olivia Carville / Bloomberg: A profile of Kaley Glenn-Mills, the plaintiff in K.G.M. v. Meta et al., who was awarded $6M in damages in a landmark LA jury trial over social media addiction — Kaley Glenn-Mills' lawsuit reshaped the fight to protect children from social media. She says she still can't stop scrolling.
Financial Times: Bending Spoons' Nasdaq IPO caps its 50+ deals across 10+ years that transformed the Italian startup into a highly leveraged internet company with ~$4.4B in debt — Nasdaq listing caps more than a decade of deals that transformed an Italian start-up into a global internet company
Sofia Chesnokova / Tech Funding News: NY-based LinqAlpha, which provides AI-powered market research tools for hedge funds, raised a $22M Series A co-led by AVP, Atinum Investment, and GFT Ventures — - LinqAlpha, an AI research platform for hedge funds and asset managers, has raised $22 million in a Series A round led by AVP, Atinum Investment and GFT Ventures.
Kieran Smith / Financial Times: Sources: Uber halts plans to launch food delivery in five of the seven European countries it had targeted for expansion as it pursues a Delivery Hero takeover — Ride-hailing company will no longer launch in five of its seven planned new markets this year — Uber has paused the majority …
Sejal Sharma / Hindustan Times: India issues a notice to Telegram, asking it to curb the spread of pirated films and other copyrighted content, and seeks an action-taken report within 15 days — The Ministry of Information and Broadcasting (MIB) issued a notice to Telegram on Saturday, asking the messaging platform …
I spent years building a life in New York. Losing my job meant leaving my cats, my apartment, and the US.
Vivienne Yang moved from the US back to Taiwan after she lost her job in New York. Vivienne Yang Vivienne Yang moved from Taiwan to New York City in 2018 to chase the American dream. After she was laid off in 2024, she had to leave her Brooklyn apartment and her two cats behind. Now she's found peace in Taiwan, where she no longer has to worry about visas or her personal safety. This as-told-to essay is based on a conversation with Vivienne Yang, a 31-year-old Taiwanese national who lost her job and had to leave the US because of her visa status, leaving behind her apartment and two cats. It has been edited for length and clarity. I started falling for the American dream when I was in third grade. It was a mix of realizing that the Taiwanese education system wasn't really designed for me and becoming hooked on American pop culture like Taylor Swift, "Twilight," and "America's Next Top Model." In 2018, at 23, I moved to New York for a master's in applied analytics at Columbia University, then landed a job in Manhattan's ad-tech industry. This is part of our ongoing coverage of how the Trump administration's H-1B visa changes affect workers. If you've been impacted and want to share your story, please fill out this short form for the reporter. Over the next five years, I worked two full-time jobs, one after the other, each paying about $100,000, until I was laid off in 2024. Getting laid off while on vacation Yang was laid off from her job while on vacation in Japan. Vivienne Yang It was October, and I was on the second day of a 10-day trip to Japan with my partner when I learned I'd been laid off. I was watching Japanese TV shows in our Airbnb after a day of sightseeing in Osaka, when my colleague called me on Instagram to say he couldn't find my Slack or email and that it looked like my account had been deactivated. I didn't receive any calls from HR because my US SIM card wasn't working. I tried to have fun on the trip while struggling with immigration issues. I spent my mornings talking to immigration and labor lawyers and emailing HR. And then in the afternoons, we would go sightseeing. The emotions came two days after I heard the news, and I cried at a shrine in Kyoto. I was praying that I could go back to the US. The company agreed to prolong my employment for a few weeks so that I could return to the US. Leaving my life in New York behind Yang owns an apartment in Brooklyn and has two cats. Vivienne Yang I had built a life in the US. My entire friend circle and my two cats were there, and I'd spent years saving so I could buy a one-bedroom apartment in Brooklyn. During my grace period, I changed from an H-1B to a B-2 tourist visa so I could stay in the US a little longer, and I later renewed my B-2 so I could stay for a full year. My lawyer told me not to mention that I was a homeowner, because it could make it look like I intended to immigrate. Job searching was difficult. I spent a few months on the hunt, with more than 20 unsuccessful interviews. Then, in September last year, the Trump administration rolled out the $100,000 fee for new H-1B applicants. Although that wouldn't have applied to me, I feel like it affected employers' willingness to hire foreign workers. After a few months, I stopped focusing on corporate jobs. I couldn't see myself in corporate America anymore. I'd always loved acting and got accepted into an acting program in New York, and was supposed to start in March this year. In December 2025, I traveled back to Taiwan to apply for a student visa. I cried the whole way to JFK airport and on the plane. It felt like I was leaving for good. My gut was right. My student visa was rejected because I demonstrated immigration intent. I asked my American partner to move into my apartment to take care of the cats — Dexter and Deborah — while I figured out how to get back. I told him not to ship my stuff because I was set on going back. Then I realized that, given the current political climate and the state of the economy, it doesn't make sense to return to America anytime soon. Taiwan has helped me escape survival mode Yang said she feels at peace in Taiwan and can focus on new pursuits without worrying about visas. Vivienne Yang In Taiwan, I don't need to worry about my personal safety all the time. It's also so weird not having to worry about a visa. Now I can get any random gig without worrying: "Oh, if I want to do this, what kind of visa do I need to get?" One of my biggest worries over the past year in New York was not having health insurance and not knowing if I could afford to see a doctor. In Taiwan, especially the northeastern town of Yilan, where I live, I can just pop into a clinic and spend less than $10. It has been a bit strange getting used to living with my family again. Now I live in a three-bedroom apartment with my mom, dad, sister, and grandma, and there are rules in this house, like where things should be placed and how many layers to wear during colder months. I sleep on a portable bed in the storage room without air conditioning, because there's not enough space in the house. It felt like my life got downgraded. No plans to go back I don't want to deal with visa issues anytime soon, so I don't have plans to move. My partner plans to bring the cats in October. I've been focusing on content creation here, while also teaching public speaking in English. I'm using my savings to pay off the mortgage on my Brooklyn apartment. Despite all I went through, I don't regret my move to the US. If I hadn't gone through that, I would still be asking myself, "Oh, what if I had gone?" Now that I've had that experience, I'm clear about what I want and who I am. Read the original article on Business Insider
Simon Sharwood / The Register: AWS says Mechanical Turk will no longer accept new customers and that it is placing the crowdsourcing service in maintenance, signaling its future retirement — Workers who use OG crowdsourcing platform say AWS is closing accounts — Amazon Web Services will stop accepting new customers …
<p>I wrote about the <a href="https://simonwillison.net/2026/Jun/21/sqlite-utils-40rc1/">sqlite-utils 4.0rc1</a> release a couple of weeks ago. Since we only have Claude Fable on our Max subscriptions for a few more days, I decided to see if it could help me get to a 4.0 stable release that I felt truly comfortable about, since I try to keep to <a href="https://semver.org">SemVer</a> and like my incompatible major versions to be as rare as possible.</p> <p>I started with this prompt, in Claude Code for web on my iPhone:</p> <blockquote> <p><code>Final review before shipping a stable 4.0 release - very important to spot any last minute things that would be a breaking change if we fix them later</code></p> </blockquote> <p>Here's <a href="https://github.com/simonw/sqlite-utils/blob/0c369a447eeaf39084f0d14a45b3eeb7eacb631b/fable-review-4.0rc1.md">that initial report</a> it created for me. There were some <em>significant</em> problems that I hadn't myself encountered yet - 5 that Fable categorized as "release blockers". Here's the worst of the bunch:</p> <blockquote> <p><strong>1. <code>delete_where()</code> never commits and poisons the connection (data loss)</strong></p> <p><code>Table.delete_where()</code> (<code>sqlite_utils/db.py:2948</code>) runs its DELETE via a bare <code>self.db.execute()</code> with no <code>atomic()</code> wrapper — compare <code>Table.delete()</code> at <code>db.py:2944</code>, which wraps correctly. The connection is left <code>in_transaction=True</code>, so every <em>subsequent</em> <code>atomic()</code> call takes the savepoint branch (<code>db.py:430-440</code>) and never commits either.</p> <p>Reproduced end-to-end:</p> <pre><span class="pl-s1">db</span> <span class="pl-c1">=</span> <span class="pl-s1">sqlite_utils</span>.<span class="pl-c1">Database</span>(<span class="pl-s">"dw.db"</span>) <span class="pl-s1">db</span>[<span class="pl-s">"t"</span>].<span class="pl-c1">insert_all</span>([{<span class="pl-s">"id"</span>: <span class="pl-s1">i</span>} <span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">in</span> <span class="pl-en">range</span>(<span class="pl-c1">3</span>)], <span class="pl-s1">pk</span><span class="pl-c1">=</span><span class="pl-s">"id"</span>) <span class="pl-s1">db</span>[<span class="pl-s">"t"</span>].<span class="pl-c1">delete_where</span>(<span class="pl-s">"id = ?"</span>, [<span class="pl-c1">0</span>]) <span class="pl-c"># conn.in_transaction is now True</span> <span class="pl-s1">db</span>[<span class="pl-s">"t"</span>].<span class="pl-c1">insert</span>({<span class="pl-s">"id"</span>: <span class="pl-c1">50</span>}) <span class="pl-s1">db</span>[<span class="pl-s">"u"</span>].<span class="pl-c1">insert</span>({<span class="pl-s">"a"</span>: <span class="pl-c1">1</span>}) <span class="pl-s1">db</span>.<span class="pl-c1">close</span>() <span class="pl-c"># Reopen: rows are [0, 1, 2] — the delete, row 50, AND table u are all gone.</span></pre> </blockquote> <p>That's a really bad bug! Very glad I didn't ship that, although at least it would have been a bug I could fix in a 4.0.1 point release, not a design flaw that would force a 5.0.</p> <p>Over the course of 37 prompts, 34 commits and +1,321 -190 code changes over 30 separate files, we worked through the entire set of feedback in turn, making several other design improvements along the way.</p> <p>A weird thing about coding agents is that harder tasks like this one actually provide <em>more</em> opportunity to do other things at the same time, since the agent sometimes needs 10-15 minutes to churn away on a new task. I went out to enjoy the Half Moon Bay 4th of July parade, occasionally checking in and prompting the next step for Fable from my phone.</p> <p>Full details <a href="https://github.com/simonw/sqlite-utils/pull/767">in the PR</a> and <a href="https://claude.ai/code/session_01UnLnhsH25Nnv7LHhekUfPd">this shared transcript</a>. I switched to my laptop for the final review, which I conducted through GitHub's PR interface.</p> <p>The most significant changes relate to transaction handling, which was the signature new feature in <a href="https://simonwillison.net/2026/Jun/21/sqlite-utils-40rc1/#new-feature-db-atomic-transactions">the earlier RC</a>. The new RC now includes <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#transactions-and-saving-your-changes">comprehensive documentation</a> on the new transaction model, the intro to which I'll quote here in full:</p> <blockquote> <p>Every method in this library that writes to the database - <code>insert()</code>, <code>upsert()</code>, <code>update()</code>, <code>delete()</code>, <code>delete_where()</code>, <code>transform()</code>, <code>create_table()</code>, <code>create_index()</code>, <code>enable_fts()</code> and the rest - runs inside its own transaction and commits it before returning. Your changes are saved to disk as soon as the method call finishes:</p> <pre><span class="pl-s1">db</span> <span class="pl-c1">=</span> <span class="pl-en">Database</span>(<span class="pl-s">"data.db"</span>) <span class="pl-s1">db</span>.<span class="pl-c1">table</span>(<span class="pl-s">"news"</span>).<span class="pl-c1">insert</span>({<span class="pl-s">"headline"</span>: <span class="pl-s">"Dog wins award"</span>}) <span class="pl-c"># The new row is already saved - no commit() required</span></pre> <p>The same applies to raw SQL executed with <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#python-api-transactions-execute">db.execute()</a> - a write statement is committed as soon as it has run.</p> <p>You never need to call <code>commit()</code>, and you do not need to close the database to persist your changes. There are exactly two situations where you need to think about transactions:</p> <ol> <li> <p>You want to group several write operations together, so they either all succeed or all fail - use <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#python-api-atomic">db.atomic()</a>.</p> </li> <li> <p>You are <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#python-api-transactions-manual">managing a transaction yourself</a> with <code>db.begin()</code>, in which case nothing is committed until you commit - the library will never commit a transaction you opened.</p> </li> </ol> </blockquote> <p>In reviewing Fable's documentation - I find that reviewing the documentation edits first is an <em>excellent</em> way to build an initial understanding of what has changed - I spotted <a href="https://github.com/simonw/sqlite-utils/blob/6c88067ab76b9597fb1c538c53164632526a2891/docs/python-api.rst?plain=1#L386">this detail</a>:</p> <blockquote> <p><code>db.atomic()</code> and the automatic per-method transactions are designed for connections in Python's default transaction handling mode. Connections created with the Python 3.12+ <code>sqlite3.connect(..., autocommit=True)</code> or <code>autocommit=False</code> options are not supported, because <code>commit()</code> and <code>rollback()</code> behave differently on those connections.</p> </blockquote> <p>I admit I hadn't thought about how <code>sqlite-utils</code> would react to the more recent <a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.autocommit">autocommit setting</a>, added in Python 3.12. It turns out "behave differently on those connections" equated to almost the entire test suite failing, so I worked with the model to <a href="https://github.com/simonw/sqlite-utils/commit/f7ff3e2027aefb9905ebb2e611e5bbb0a62382c5">ensure that this difference</a> would not break how the library works.</p> <h4 id="and-a-final-review-by-gpt-5-5">And a final review by GPT-5.5</h4> <p>I used to think that the idea of having one model review the work of another was somewhat absurd - it felt weirdly superstitious. The problem is <em>it really does work</em> - I've started habitually having Anthropic's best model review OpenAI's work and vice versa, because I've had that turn up interesting results often enough to be valuable.</p> <p>I prompted Codex Desktop and GPT-5.5 xhigh with the following:</p> <blockquote> <p><code>Review changes since the last RC. Also confirm that the changelog is up-to-date.</code></p> </blockquote> <p>Which was enough to turn up two issues worth investigating:</p> <blockquote> <p><strong>Findings</strong></p> <ul> <li>[P1] <a href="https://github.com/simonw/sqlite-utils/blob/04f8971546418962aaf6579d4028c7117d6c3a20/sqlite_utils/db.py#L663">sqlite_utils/db.py:663</a> <code>db.query()</code> now rejects non-row statements only after calling <code>db.execute()</code>, and <a href="https://github.com/simonw/sqlite-utils/blob/04f8971546418962aaf6579d4028c7117d6c3a20/sqlite_utils/db.py#L705">sqlite_utils/db.py:705</a> auto-commits those writes first. So <code>db.query("update ...")</code> raises <code>ValueError</code> but the update is already committed. That is a surprising side effect for a method documented as “can only be used with SQL that returns rows.”</li> <li>[P1] <a href="https://github.com/simonw/sqlite-utils/blob/04f8971546418962aaf6579d4028c7117d6c3a20/sqlite_utils/db.py#L672">sqlite_utils/db.py:672</a> <code>INSERT ... RETURNING</code> through <code>db.query()</code> only commits after the returned generator is fully exhausted. <code>db.query("insert ... returning ...")</code> without iteration, or common <code>next(db.query(...))</code> usage, leaves the transaction open and the write can be rolled back on close. This contradicts <a href="https://github.com/simonw/sqlite-utils/blob/04f8971546418962aaf6579d4028c7117d6c3a20/docs/changelog.rst?plain=1#L15">docs/changelog.rst:15</a> and <a href="https://github.com/simonw/sqlite-utils/blob/04f8971546418962aaf6579d4028c7117d6c3a20/docs/python-api.rst?plain=1#L232">docs/python-api.rst:232</a>, which say it takes effect without iteration.</li> </ul> </blockquote> <p>I pasted that into a fresh Fable session, which ran some experiments to confirm the problem:</p> <blockquote> <p>Both findings were confirmed. <code>db.query()</code> called <code>self.execute()</code> first, which auto-commits writes, and only then checked <code>cursor.description</code> — so <code>db.query("update ...")</code> committed the update before raising <code>ValueError</code>. And the <code>INSERT ... RETURNING</code> commit lived at the end of the returned generator, so it never fired unless you exhausted the iterator — <code>next(db.query(...))</code> or an un-iterated call left the transaction open, contradicting what the changelog and docs promise.</p> </blockquote> <p>Here's <a href="https://github.com/simonw/sqlite-utils/pull/768">the PR</a> with the fix, and the <a href="https://claude.ai/code/session_012U3iRfJoTZ5vd22cBSF2nJ">full Claude Code transcript</a>. Reviewing this code helped me build a better mental model of the edge cases of SQLite transaction semantics!</p> <h4 id="for-an-estimated-unsubsidized-cost-of-149-25">For an estimated (unsubsidized) cost of $149.25</h4> <p>I upgraded to the Claude Max $200/month plan (I was previously on $100/month) to increase my Fable allowance for the remaining time until <a href="https://www.anthropic.com/news/redeploying-fable-5">the July 7th Fablepocalypse</a>, when even Claude Max subscribers will have to pay full API cost for the model.</p> <p>I was curious as to how much this would have cost me if I had been paying those costs directly. At first I thought those numbers weren't available to me since I had run the work remotely using Claude Code for web, and then I realized I could run <a href="https://www.agentsview.io">AgentsView</a> inside that existing session to get that cost estimate!</p> <blockquote> <p><code>Run "uvx agentsview --help" and then use that tool to calculate the cost of this session</code></p> </blockquote> <p>Claude figured out how to use the <code>session list --include-children</code> command and came out with the following:</p> <table> <thead> <tr> <th>Transcript</th> <th>Model</th> <th>Cost</th> </tr> </thead> <tbody> <tr> <td>Main session</td> <td>claude-fable-5</td> <td>$141.02</td> </tr> <tr> <td>API-surface sweep agent</td> <td>claude-fable-5</td> <td>$2.40</td> </tr> <tr> <td>Transactions/atomic review agent</td> <td>claude-fable-5</td> <td>$2.39</td> </tr> <tr> <td>Post-rc1 commits review agent</td> <td>claude-fable-5</td> <td>$1.72</td> </tr> <tr> <td>Migrations review agent</td> <td>claude-fable-5</td> <td>$1.40</td> </tr> <tr> <td>Prompt-counting agent</td> <td>claude-opus-4-8</td> <td>$0.32</td> </tr> <tr> <td><strong>Total</strong></td> <td></td> <td><strong>$149.25</strong></td> </tr> </tbody> </table> <p>I'm very glad I'm on that subscription! I really should have <a href="https://simonwillison.net/2026/Jul/3/judgement/">followed my own advice</a> and leaned more heavily into subagents with cheaper models.</p> <p>Here's what <a href="https://claude.ai/settings/usage">claude.ai/settings/usage</a> is showing me right now:</p> <p><img src="https://static.simonwillison.net/static/2026/fable-plan-usage.webp" alt="Screenshot of a Claude plan usage limits panel: "Plan usage limits Max (20x)"; "Current session" with "Resets in 3 hr 52 min" showing a progress bar at "7% used"; "Weekly limits" heading with a "Learn more about usage limits" link; "All models" with "Resets Wed 12:00 PM" showing a progress bar at "32% used"; "Fable" with "Resets Wed 12:00 PM" showing a progress bar at "63% used"." style="max-width: 100%;" /></p> <p>I have several other major Fable-driven projects on the go right now as well, with the goal of hitting 100% on that Fable bar just in time for the price increase.</p> <h4 id="the-full-release-notes-for-sqlite-utils-4-0rc2">The full release notes for sqlite-utils 4.0rc2</h4> <p>Here are <a href="https://sqlite-utils.datasette.io/en/latest/changelog.html#rc2-2026-07-04">the full release notes</a> for the RC. I had Fable add these to an "Unreleased" section of the changelog as each change landed, reviewing them as it went. This has the neat side effect that <a href="https://github.com/simonw/sqlite-utils/commits/4.0rc2/docs/changelog.rst">the commit history of the changelog</a> acts as a concise summary of each of the changes that went into the release.</p> <p>In the past I've had a policy of writing release notes by hand, but honestly these are better than I would have created myself. Release notes are a great example of writing that I'm OK to outsource to agents because they need to be boring, predictable and accurate.</p> <blockquote> <p>Breaking changes:</p> <ul> <li>Write statements executed with <code>db.execute()</code> are now committed automatically, unless a transaction is already open in which case they join it. Previously they opened an implicit transaction that stayed open until something committed it - writes appeared to work when read on the same connection but were silently rolled back when the connection closed. Code that relied on rolling back uncommitted <code>db.execute()</code> writes should use the new <code>db.begin()</code> method to open an explicit transaction first. The transaction model is documented in full at <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#python-api-transactions">Transactions and saving your changes</a>.</li> <li> <code>db.query()</code> now executes its SQL as soon as it is called, rather than waiting until the returned generator is first iterated. Rows are still fetched lazily during iteration. SQL errors are now raised at the call site, statements such as <code>INSERT ... RETURNING</code> are executed and committed immediately without needing to iterate over their results, and passing a statement that returns no rows - previously a silent no-op - now raises a <code>ValueError</code> recommending <code>db.execute()</code> instead. A statement rejected this way is rolled back before the error is raised, so it has no effect on the database.</li> <li>Python API validation errors now raise <code>ValueError</code> instead of <code>AssertionError</code>. Previously invalid arguments - such as <code>create_table()</code> with no columns, <code>transform()</code> on a table that does not exist, or passing both <code>ignore=True</code> and <code>replace=True</code> - were rejected using bare <code>assert</code> statements, which are silently skipped when Python runs with the <code>-O</code> flag. Code that caught <code>AssertionError</code> for these cases should catch <code>ValueError</code> instead.</li> <li> <code>table.upsert()</code> and <code>table.upsert_all()</code> now raise <code>PrimaryKeyRequired</code> if a record is missing a value for any primary key column, or has a value of <code>None</code> for one. Previously such records - which can never match an existing row - were quietly inserted as brand new rows, or triggered a confusing <code>KeyError</code> after the insert had already taken place.</li> <li> <code>db.enable_wal()</code> and <code>db.disable_wal()</code> now raise a <code>sqlite_utils.db.TransactionError</code> if called while a transaction is open. Previously they would silently commit the open transaction as a side effect of changing the journal mode, breaking the rollback guarantee of <code>db.atomic()</code> and of user-managed transactions.</li> <li>The <code>View</code> class no longer has an <code>enable_fts()</code> method. It existed only to raise <code>NotImplementedError</code>, since full-text search is not supported for views - calling it now raises <code>AttributeError</code> instead, and the method no longer appears in the API reference. The <code>sqlite-utils enable-fts</code> command shows a clean error when pointed at a view.</li> <li>The no-op <code>-d/--detect-types</code> flag has been removed from the <code>insert</code> and <code>upsert</code> commands. Type detection has been the default for CSV/TSV data since 4.0a1, so the flag did nothing - invocations using it should simply drop it. <code>--no-detect-types</code> remains available to disable detection.</li> <li> <code>Database()</code> now raises a <code>sqlite_utils.db.TransactionError</code> if passed a connection created with the Python 3.12+ <code>sqlite3.connect(..., autocommit=True)</code> or <code>autocommit=False</code> options. <code>commit()</code> and <code>rollback()</code> behave differently on those connections, which previously caused every write made by the library to be silently discarded when the connection closed.</li> </ul> <p>Everything else:</p> <ul> <li>Fixed a bug where <code>table.delete_where()</code>, <code>table.optimize()</code> and <code>table.rebuild_fts()</code> did not commit their changes, leaving the connection inside an open transaction. Their work - and any subsequent writes - could then be silently rolled back when the connection was closed. All three now use <code>db.atomic()</code>, consistent with the other write methods.</li> <li>The <code>sqlite-utils drop-table</code> command now refuses to drop a view, and <code>drop-view</code> refuses to drop a table. Previously each would silently drop the wrong type of object if the name matched. Both now exit with an error suggesting the correct command to use.</li> <li>Migrations applied by the new <a href="https://sqlite-utils.datasette.io/en/latest/migrations.html#migrations">migrations system</a> now run inside a transaction, together with the record of the migration having been applied. If a migration raises an exception its changes are rolled back and it stays pending, so it can be safely re-applied after the error is fixed. Migrations that cannot run inside a transaction, such as those executing <code>VACUUM</code>, can opt out using <code>@migrations(transactional=False)</code> - see <a href="https://sqlite-utils.datasette.io/en/latest/migrations.html#migrations-transactions">Migrations and transactions</a>.</li> <li> <code>table.upsert()</code> and <code>table.upsert_all()</code> now detect the primary key or compound primary key of an existing table, so the <code>pk=</code> argument is no longer required when upserting into a table that already has a primary key.</li> <li> <code>db.table(table_name).insert({})</code> can now be used to insert a row consisting entirely of default values into an existing table, using <code>INSERT INTO ... DEFAULT VALUES</code>. (<a href="https://github.com/simonw/sqlite-utils/issues/759">#759</a>)</li> <li>Improvements to the <code>sqlite-utils migrate</code> command: <code>--stop-before</code> values that do not match any known migration are now an error instead of being silently ignored, <code>--stop-before</code> now works correctly with migration files that still use the older <code>sqlite_migrate.Migrations</code> class, and <code>--list</code> is now a read-only operation that no longer creates the database file or the migrations tracking table. <code>migrations.applied()</code> now returns migrations in the order they were applied.</li> <li>New <code>db.begin()</code>, <code>db.commit()</code> and <code>db.rollback()</code> methods for taking manual control of transactions, as an alternative to the <code>db.atomic()</code> context manager.</li> <li>New documentation: <a href="https://sqlite-utils.datasette.io/en/latest/python-api.html#python-api-transactions">Transactions and saving your changes</a> describes how transactions work and when changes are committed, and a new <a href="https://sqlite-utils.datasette.io/en/latest/upgrading.html#upgrading">Upgrading</a> page details the changes needed to move between major versions.</li> </ul> </blockquote> <p>Tags: <a href="https://simonwillison.net/tags/projects">projects</a>, <a href="https://simonwillison.net/tags/sqlite">sqlite</a>, <a href="https://simonwillison.net/tags/sqlite-utils">sqlite-utils</a>, <a href="https://simonwillison.net/tags/annotated-release-notes">annotated-release-notes</a>, <a href="https://simonwillison.net/tags/anthropic">anthropic</a>, <a href="https://simonwillison.net/tags/claude">claude</a>, <a href="https://simonwillison.net/tags/llm-pricing">llm-pricing</a>, <a href="https://simonwillison.net/tags/coding-agents">coding-agents</a>, <a href="https://simonwillison.net/tags/claude-code">claude-code</a>, <a href="https://simonwillison.net/tags/agentic-engineering">agentic-engineering</a>, <a href="https://simonwillison.net/tags/gpt">gpt</a>, <a href="https://simonwillison.net/tags/claude-mythos-fable">claude-mythos-fable</a></p>
<p><strong>Release:</strong> <a href="https://github.com/simonw/sqlite-utils/releases/tag/4.0rc2">sqlite-utils 4.0rc2</a></p> <p>See <a href="https://simonwillison.net/2026/Jul/5/sqlite-utils-fable/">sqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)</a>.</p>
Aisha Down / The Guardian: Source calls UK- and OpenAI-touted plans in 2025 for Stargate's ~£20B Cobalt site a PR stunt; OpenAI and Nscale failed to visit Cobalt or lodge planning forms — Exclusive: £20bn of ‘potential’ £30bn AI investment touted by UK ministers appears to have been hypothetical
<p><strong><a href="https://www.experimentlog.com/blog/building-a-world-map-with-only-500-bytes">Building a World Map with only 500 bytes</a></strong></p> Iwo Kadziela (assisted by Codex) figured out a way to generate a credible ASCII world map using 445 bytes of data:</p> <p><img alt="A map of the world rendered as black asterisk ASCII characters, it looks very good" src="https://static.simonwillison.net/static/2026/world-map-ascii.png" /></p> <p>The key trick is to use deflate compression, which is then wired together using this neat snippet of JavaScript. I didn't know you could use <code>fetch()</code> with <code>data:</code> URIs like this:</p> <pre><code>fetch('data:;base64,1ZpLsgIxCEXnrM...==').then( r => r.body.pipeThrough(new DecompressionStream('deflate-raw')) ).then( s => new Response(s).text() ).then( t => b.innerHTML = '<pre style=font-size:.65vw>' + t ) </code></pre> <p><small></small>Via <a href="https://news.ycombinator.com/item?id=48747762">Hacker News</a></small></p> <p>Tags: <a href="https://simonwillison.net/tags/ascii-art">ascii-art</a>, <a href="https://simonwillison.net/tags/data-urls">data-urls</a>, <a href="https://simonwillison.net/tags/javascript">javascript</a></p>