A friend moved to Florida in the middle of 2025. He went back in February 2026 to deal with issues around selling his old house in the Boston suburbs. Some of his messages to a group chat:
After Florida this is indeed f***ing torture
I spent the entire morning doing useless shit that is neither fun nor contributes to my future well being. Shoveling snow, salting.
Even though I pay hundreds of dollars a month to an entitled lazy idiot gardener who doesn’t do anything unless you tell him repeatedly.
The house was empty yet my heat bill was $1500.
In Florida that will be the electric bill for a 20k sq ft house with another 15k sq ft of usable outdoor living space
I forgot a snow brush
Now I will have to scrape snow off my car after a [gym workout], all sweaty and freezing
Took me an hour to get to my house from the airport on Friday [about 20 highway miles]
But it is good because I can spend this time listening to NPR
He included a photo:
A little later in the chat group, from a participant who lives in a South Shore suburb of Boston:
How can anyone commute to work? It’s an hour and 20 minutes going to Cambridge now [27-mile trip, mostly highway]. I guess people don’t work from home anymore?
[me] They stopped taking the T. So even though fewer are working the traffic is as bad or worse. ChatGPT: [the MBTA has] about ~64% of pre-pandemic ridership
Speaking of NPR, we had a dealer loaner while our Honda Odyssey was being serviced (some more battery trauma, this time with a 4-month-old Duracell AGM; I paid $308 for a Honda OEM part instead of trying to get another short-lived Duracell under warranty). I didn’t want to go to the trouble of getting Apple CarPlay organized so instead of my usual Audible book I listened to Treasure Coast NPR. When I tuned in they were talking about the real victims of the Gazans’ October 7, 2023 attack into Israel: American Muslims. Islamophobia in the U.S. reached crisis proportions after October 7 and then became an emergency crisis emergency when Donald Trump was elected by the haters. This piece was followed by a story about Black-white interracial marriage 60-150 years ago in the U.S. In a country that has been transformed by Latinx and Asian immigration, thus enabling the entire economy to do without Black workers (see Replacement of Black workers by migrants in Cambridge, Massachusetts), NPR remains stuck on the idea that Black-white relations are the defining issue of our time.
The Olympics are over. How did the American athletes who made the news for hating Donald Trump do in terms of medals? If we assume a just God who hates a malevolent dictator, the virtuous #Resistance should have dominated the games. Did the Trump-haters in fact do better than expected?
Vonn, who was preparing to qualify for the 2018 Games in PyeongChang at the time, was approached by CNN to see if she would go if asked. Her response was as icy as the snowy mountains she conquers. “Absolutely not,” Vonn said. “I hope to represent the people of the United States, not the president. …I want to represent our country well. I don’t think that there are a lot of people currently in our government that do that.”
Fox News recently approached Vonn about the possibility she might get a second invite to the Trump White House. “First of all, I just want to say that every Olympic athlete from Team USA is normally invited… it has nothing to do with if you win a medal or not,” she began. “I’m not going to answer that question because — I’m just not going to answer it. I want to keep my passport.” It was a more diplomatic answer than the one she gave eight years earlier, but her meaning was clear. Donald Trump has a history of meltdowns when faced with dissent, and he tends to lash out at those who dare to oppose him. He disinvited the Philadelphia Eagles from a White House visit in 2018 because they wouldn’t promise all players would salute the flag. Who’s to say the president wouldn’t find a way to keep a star skier from getting to a major competition if she said something that wounded his pride?
Amber Glenn was apparently a trailblazer in combining unusual sexual desires (behaviors?) with ice skating (unlike 100 percent conventional NBC host Johnny Weir):
Glenn, who is the first openly queer woman to represent the U.S. in Olympic figure skating, was asked directly about President Trump, his treatment of the LGBTQ community and how it affects her at a press conference on Feb. 4 for the 2026 Winter Olympics in Milan. The athlete, 26, told reporters that while it’s been “a hard time” for the community, she hoped to use her platform and her voice “to try and encourage people to stay strong.”
This sculpture in Austin’s UMLAUF Sculpture Garden reminds me that Taylor Swift was at the Games and sagely pointed out that “skaters gonna skate”:
(My personal favorite skaters this year: Isabeau Levito, France’s Adam Siao Him Fa, and, of course, Alysa Liu.)
“It’s always an honour and a privilege to represent Team USA and to represent your country,” she told a news conference when asked by a reporter how it felt to be representing the United States “given what’s happening there”.
The query chimed with more pointed questions faced by other U.S. athletes at the Games over President Donald Trump’s crackdown on immigration. Trump’s Vice President, JD Vance, drew a smattering of boos at Friday’s opening ceremony in Milan. The host city has also seen protests against Trump’s policies.
Shiffrin said that for her “as this relates to the Olympics, I’m really hoping to show up and represent my values. Values of inclusivity, values of diversity and kindness and sharing.”
I don’t think we have to look too far to find a hater who does not value inclusivity and diversity! Where does the diversity-loving Shiffrin live? In a mansion in Edwards, Colorado, right near the Beaver Creek ski resort and not far from Vail. Her address is supposedly 43 Hollis Lane Edwards, CO 81632. Zillow says it is worth $5.2 million. Here’s a nearby 2BR apartment that a diverse person could purchase for $2.8 million:
Then there’s Hunter Hess, the freestyle skier who says that he wants to #resist ICE, but somehow ended up in Italy rather than in Minneapolis. NBC:
“It brings up mixed emotions to represent the U.S. right now, I think. It’s a little hard,” he said. “There’s obviously a lot going on that I’m not the biggest fan of and I think a lot of people aren’t.”
He continued: “I think for me, it’s more I’m representing my, like, friends and family back home, the people that represented it before me, all the things that I believe are good about the U.S. I just think if it aligns with my moral values, I feel like I’m representing it.”
“Just because I’m wearing the flag doesn’t mean I represent everything that’s going on in the U.S.,” he said.
I hope that we can all agree on whose moral values are deficient/bankrupt and also that “a lot going on that I’m not the biggest fan of” means ICE detaining migrants and not Minnesota paper day care centers siphoning out all U.S. taxpayer cash.
They won Gold for virtue and Trump-hatred, but how did the above athletes actually do in competition?
He/she/ze/they is not exactly an athlete, but Justin Trudeau did taunt Donald Trump with a “you can’t take our game” message before the Canada v. USA hockey match.
The Government Employee Fair Treatment Act of 2019 guarantees 100 percent pay for federal workers who either (1) show up to work during a “shutdown”, (2) relax at home during a “shutdown” as blessed non-essentials, or (3) vacation in Europe during a “shutdown” without using any vacation days (again, limited to those who can get classified as non-essential).
Lawmakers left town this week without a deal to fund the department over a disagreement about reining in the Trump administration’s hard-line immigration enforcement tactics. Most of the hardships faced by employees — who are working without pay — will go unnoticed by the public with a few possible exceptions, including the people who check IDs, scan baggage and complete other security tasks at U.S. airports.
Officers are frustrated that they have to pay the price for a political fight that has nothing to do with them. It’s even worse this time, because they have to work without pay while immigration officers will continue to be paid through a separate fund.
Nowhere do the journalists mention that TSA employees are guaranteed to receive 100-percent pay so long as the U.S. government is able to print money.
The momentous end to the federal government’s legal authority to fight climate change makes it official.
The United States will essentially have no laws on the books that enforce how efficient America’s passenger cars and trucks should be.
That’s the practical result of the Trump administration’s yearlong parade of regulatory rollbacks, capped on Thursday by its killing of the “endangerment finding,” the scientific determination that required the Environmental Protection Agency to regulate greenhouse gases because of the threat to human health.
“The U.S. no longer has emission standards of any meaning,” said Margo T. Oge, who served as the E.P.A.’s top vehicle emissions regulator under three presidents and has since advised both automakers and environmental groups.
With no emissions standards, then, it would be legal for Toyota, GM, and Ford to stop including catalytic converters ($300-$1,500?) with their new vehicles? Here’s part of what ChatGPT said regarding the greenhouse gas limits that are potentially gone and the “no emission standards of any meaning” world described in the New York Times…
——————-
If greenhouse-gas (GHG) limits on cars were removed in the U.S., a substantial set of non-GHG emissions regulations would still remain. These target pollutants that directly harm human health and local air quality rather than global climate.
Below is a structured breakdown of what would still be regulated.
1) Criteria Air Pollutants (Clean Air Act “criteria pollutants”)
Under the Clean Air Act, the EPA regulates tailpipe emissions that contribute to smog, soot, and toxic exposure.
I recently wrote up our Celebrity Ascent cruise experience and also wrote about St. Kitts. This is about the other four ports that we visited. Most of our ground activities were planned by ChatGPT.
Barbados
Despite the fact that the U.S. had just kidnapped the democratically elected leader of Venezuela, about 500 miles south, the port was relaxed.
We did the 20-minute walk to downtown Bridgetown, past the Harvard Club of Barbados (the Palestinian flag):
We ducked into the Church of the Holy Trinity (1830; rebuilt 1999):
Downtown is quiet and geared toward locals.
The National Heroes Square honors Rihanna
The synagogue (1654; rebuilt in 1833 after a hurricane) operates services on Shabbat with 30-40 people attending, mostly vacationing Jews. It’s a UNESCO World Heritage site and a museum the rest of the time. Robert Kraft probably wouldn’t want to feature the historic Jews of Barbados in a Super Bowl ad. Like other Europeans, they showed up to make money in sugar cultivation, didn’t object to slavery, and moved elsewhere when the industry was destroyed by the 19th century sugar beet revolution. Intolerance isn’t always bad (see below; Jews prevented from owning enough slaves to work a plantation):
The synagogue was restored in 1987 and the Barbadians remain proud of it:
We got some ideas for repainting the Honda Odyssey from the taxi stand and headed over to the Atlantis Submarine dock:
Make sure to pay extra for the front seats!
As in the U.S., people are leaving the coronapanic signs up. Atlantis used to pack about 50 people into a small tube and the virus prevention strategy was a 5-cent mask:
A short walk away is the modest house where Rihanna grew up:
Back to the port:
Summary: a pleasant slow-paced island.
Tortola
Arrival:
We walked by the Supreme Court:
And Avis rental car?
To get to the Botanic Gardens where Donald Trump’s National Park pricing system prevails (foreigners pay 3X):
Science reminds us that “uncontrolled transport of plans and soil” is harmful to natives (uncontrolled transport of humans, on the other hand, always benefits natives):
Tortola is where a lot of people pick up their Moorings rental catamarans. They run a market where everything necessary for a good week on the water is available:
ChatGPT told us to go to Cane Garden Bay, which is more crowded than any beach in Florida (fewer people than on some parts of Miami Beach, but the sand is not nearly as wide):
We had a nice lunch at Rhythm+Sands. The obligatory Caribbean spiny lobster:
The port includes a #Science lesson:
Here are are parked next to our brothers, sisters, and binary-resisters on Norwegian Epic, which seems to follow an almost identical itinerary:
Sailing away, we see some of the same sights as those enjoyed by the Moorings bareboat renters, but from a higher perch and with about 10 restaurants to choose from within an easy walk from our berths:
St. Lucia
We did a morning snorkel trip on a catamaran that included views of the famous Pitons.
Marigot Bay, where I was able to tell fellow snorkelers, “That’s just like the yacht that our family had when I was growing up”:
It turns out that St. Lucia was the birthplace of two Noble laureates:
Celebrity warned us about robberies when ashore, but we never felt unsafe walking around Castries. (We weren’t warned about crime in any of the other ports.)
St. John’s, Antigua
The port is a bit unnerving, with locals aggressively hawking their services. We were reminded to stay safe by wearing a mask:
We visited the downtown museum, inside an old courthouse. We learned that people who lived in Antigua for 3,000 years were wiped out by immigrant Arawaks from South America. After they killed all of the natives, the Arawaks lived in harmony with nature by slash-and-burn agriculture.
Just up the hill, the Catholic cathedral (1845):
Then it was time for a water taxi to Dickenson Bay, a ChatGPT suggestion that we didn’t love. Most of the facilities are controlled by Sandals, an all-inclusive resort.
Sailing away:
Conclusion
Given our own beach-adjacent status here in Florida, I don’t think I would have wanted to spend a lot of time at any of the above islands. It is more or less the same idea as what we have here in Jupiter, but with much less convenience (can’t just drive 10 minutes to the Apple Store at the Gardens after the iPhone fails; can’t get 50,000 different SKUs at a Publix supermarket 7 minutes away). Coral reef snorkeling would be an exception, but there are denser coral reefs in other parts of the world.
Coming from the miserable Northeast or Midwest, though, probably a cruise around the smaller islands in a Moorings catamaran would be great or even just a hotel stay in Barbados.
As New York City moves toward a ban on pet dogs (consistent with the Hadiths; see Nerdeen Kiswani’s February 12 tweet that stirred up Rep. Randy Fine), a former Club Med in Florida has gone in the opposite direction: a Fido-welcome all-inclusive resort. Here’s a report on a weekend spent at Sandpiper Bay. We brought the kids and Mindy the Crippler, our golden retriever.
There are tons of great restaurants in Stuart and Port St. Lucie. Why would anyone want to eat three (or five) meals per day at the hotel? We met a lot more people than we would have if we stayed in a regular hotel and everyone dispersed at mealtime. Of course, not everyone agrees that this is a great system…
The setting is right next to a marina on the St. Lucie River:
One can sit on the shore in the shade and read a book with birds and jumping fish for company:
This isn’t a “drop off the kids after breakfast” place like Club Med. There are some kid-oriented activities, but not enough that kids or teens can form a tribe and entertain each other. Where the resort shines is in tennis. The grounds are shared with RPS, a boarding school for future professionals, similar to Bradenton’s IMG, though much smaller (Mindy the Crippler introduced us to some of the boarding students; they do academics 4 hours per day and sports training 4 hours per day and they seem to love it. Some students do all of their sports training at RPS while living at RPS, but then do virtual school for their academics, e.g., the (free) Florida Virtual School). There are group tennis lessons every day except Sunday and you can also arrange private lessons with RPS staff.
If the kids are getting on your nerves, the good news is that unlimited alcohol is included. Don’t expect high-end vino, though, and, in fact, the Kirkland wines are superior to what we were offered at Sandpiper Bay. Perhaps that was just as well because I consumed just one drink per day as a result. There’s a relaxing riverside adults-only pool that also has a hot tub that is actually hot.
Not too many people had brought dogs, but all the ones we met were friendly. They included two Corgis, several Doodles, a Spaniel, and a Standard Poodle. There were no hassles regarding paperwork (i.e., undocumented canines are not illegal) or weight limits. Dogs were welcome almost everyone in the resort, but not within the pool fences nor inside the various buildings, including restaurants and bars. Consistent with most of the rest of Florida, it was possible to eat or drink at outdoor tables, including at the main buffet restaurant, with a dog. Mindy the Crippler used her dog bed despite the sizing mismatch:
The resort is equipped with an arcade (pay per game) and free ping pong, pool, and table shuffleboard. The shuffleboard table was a magnificent 22′ regulation length example, but almost unplayable because the hotel managers hadn’t figured out that they needed to buy wax for it (I told them to call up Shuffleboard Federation and order the correct speed for their table; they also had no silicone spray that I saw nor did they have a wiper to use between games; all very sad considering the time and trouble that some wood nerds had gone to when building the 22′ playing surface).
What about the fact that the resort isn’t directly on an ocean beach? It’s a 20-minute drive to Jensen Beach, one of the nicest in Florida.
A lot of the staff members had warm and welcoming personalities. As with nearly every other hotel in the U.S., though, they’re somewhat understaffed. Expect to wait in line and don’t expect daily room cleaning.
How are the rooms? The family rooms are huge, much better than the family room we had at Club Med Michès Playa Esmeralda (Dominican Republic). The Club Med “family room” was just a regular-sized room chopped up with more doors to the point that there wasn’t anywhere for the entire family to hang out except in the queen-sized bed of the “parents’ space”. At Sandpiper Bay, the parents’ room has two huge sofas and plenty of space for the entire family, including the pup who got her own bed ($75/day extra for the animal). The kids’ room is small, but sufficient:
What kind of people did we meet?
A retired but super fit pickleball enthusiast from Albany, traveling with his wife.
A mechanical engineer from Tampa and biomedical engineer wife who came to the U.S. from Cuba at age 16 and eventually earned a PhD in biomedical nerdism (she could be featured on my four random immigrants page, though I don’t think a Democrat politician would want to highlight her due to the fact that she was unequivocally anti-socialism and generally pro-Trump (at least preferring him to the Democrat alternatives)). They were celebrating their 20th anniversary and had left their children behind with grandparents.
An architect from Delray Beach whose firm was about to finish a Palm Beach barrier island starter home ($100 million construction cost; I was afraid to ask what the land had cost or what his firm’s fees might have been; remember the WSJ says $200 million is the new luxury home buy-in).
a mom from Plano, Texas on a three-night break with two kids and a grandma (father left behind to take care of a cat; a great metaphor for modern marriage)
A pre- or post-trip suggestion: the Port St. Lucie Botanical Gardens (admission is free; donations encouraged). They’ve got about 100 orchids and several hundred cacti and succulents.
Conclusion: The price is fair. The location is great. The dogs are friendly. The food is about what you’d expect from a Hilton or Marriott. You’re not trapped as you might be at a foreign all-inclusive. If you forgot something, drive 10 minutes to Walmart or Publix. If the kids are bored, take them to the Regal movie theater or go another few minutes to Hobby Lobby, downtown Stuart, or the Play Money unlimited pinball and video arcades (one in Stuart and one in Fort Pierce).
Packing list:
your own ping pong paddles
your own Pickleball gear
your own tennis racquets and balls
your own shuffleboard wiper, silicone spray, and speed wax
Nearest airports: Stuart (if flying yourself), PBI, Vero Beach. It’s 1:45 from FLL with a lot of interesting things to see and do on the way. It’s 1:53 from MCO with absolutely nothing to see or do in between (you could take an indirect route from MCO, though, and stop at the Kennedy Space Center in one direction (allow a full day) and Valiant Air Command in the other (all a couple of hours).
Prices right now
I checked for March 7-14, 2026. The site gives the same price for two adults or two adults+two kids. Riverside life begins at $324/night plus ruinous taxes:
There were a couple of videographers present so I’m hopeful that eventually the lectures will appear on YouTube as some previous events in this “Expanding Horizons in Computing” series have.
During the intro, we were reminded that the first thing computer nerds want to do is get rid of computer nerds:
Inevitably, though, there have been haters. Alan Perlis:
Tim Kraska was the speaker who’d done the most to determine what LLMs can do. His grad students spent 2.5 months and about $100,000 in Claude API fees replicating the capabilities of the 500,000-line DuckDB embedded database management system but in a different language (I forget which! Sadly, not Lisp). It seems that for a complex project like this, the only people who can tell AI what to do are those who could do it themselves if they had to.
Continuing Carnegie-Mellon’s tradition as “the useful place in CS” (CMU gave us the Mach kernel, for example, which is inside nearly all Apple products), Graham Neubig talked about his experience building and using OpenHands, a system a little like Google’s Antigravity in that you can tell your “agents” to write software for you and the editor connects to the LLM of your choice. Prof. Neubig demonstrated using OpenHands to build a web site for the MIT event and the results were impressive!
How good are LLMs in practice? Contrary to my own experience where LLMs are amazing at diving into huge legacy codebases and telling the human “these are the relevant files”, AI felt good but actually slowed human programmers down:
AIs cut and paste like crazy, eventually producing code with so many duplicate blocks of code that only an AI will be able to make a change consistently through a real-world system:
I enjoyed the bathroom break. The smartest humans on the planet need a lot of coaching for the operation of sophisticated machinery:
Based on the period products in what was labeled a “men’s” room, the world’s smartest people are going to struggle with the “What is a woman?” question:
Speaking of bathrooms, the ground floor restroom signs are already falling apart in the nearly-new building. Fortunately, the sacred word “inclusive” hasn’t been marred.
Towards the end of the day, Varun Mohan showed up via Zoom to make the academics look like fools. While they were dithering to get a few papers published and secure a lifetime guarantee of employment at a wage that is 1/50th of what a receptionist at NVDIA earns, an apparent teenager glued together a few open-source developer tools and added LLM integration to create Windsurf, which Google then acquired in a non-acquisition for $2.4 billion. The result is Antigravity (see Antigravity as web developer (AI in an IDE)).
What nobody could offer at the event: A clear explanation of what skills made a person a good software developer in the Age of AI and, therefore, what an undergraduate CS program should teach. On the other hand, the slides did offer a clear picture of what a typical human software engineer looks like: female and, usually, non-Asian.
For the haters who say that there is no “science” in computer science… I learned about Science starting during the walk to the event. The hardware store in Inman Square’s most prominent sign:
Not Science-related, but I love seeing Black Lives Matter signs and here a commercial property owner had devoted a huge amount of space to one. (See Replacement of Black workers by migrants in Cambridge, Massachusetts for how the city’s merchants have kept the signs and discarded the people.)
Of course, there were the sidewalk maskers:
And the cycling maskers (note the filthy snow and trash in the background):
In the MIT event space there were 6 people sitting in front of me, 3 of whom were masked for the entire day. Here are a couple of them: I’m not sure that I understand the rationale for
The next day at the Harvard Art Museum, Arthur M. Sackler section (don’t forget that before developing ties to Jeffrey Epstein, Harvard was entwined with the Sackler family), an apparent couple in which one person doesn’t wear a mask while the other does. This has always mystified me. Partner 1 is protected by his/her/zir/their mask so only Partner 2 gets infected by SARS-CoV-2 at the public venue. Then they go home and, without masks, share a confined space for days during which time the virus can trivially hop from Partner 2 to Partner 1.
Also a mystery: the person who is afraid of catching a respiratory virus and chooses a job with guaranteed exposure to hundreds or thousands of strangers each day. The mask is great protection, I’m sure, but wouldn’t it be far safer to wear the mask while working in a regular office or warehouse with just a handful of other employees nearby?
Maybe one day an LLM will be able to explain these choices?
In working with John Patrick Morgan to see what capabilities today’s LLMs have for doing web page design and upgrades of existing web pages/sites, it occurred to me that there is a gap in the marketplace. As far as I can tell, there isn’t a good tool that a publisher can run after every CSS tweak that will crawl the entire site and look for pages that were uglified by the tweak, broken by the tweak, never responded to the tweak because they reference some other CSS file or no CSS file, etc.
There are plenty of tools that will look for changes to pages, but they consider every change to be a mistake. If the publisher has intentionally decided on a fresh new look for the site, these tools will flag every page on the site (could be tens of thousands or hundreds of thousands for a newspaper, for example) as being defective.
Gemini says that these are the best current options:
1. The Best “Set it and Forget it” Tool: Percy (by BrowserStack)
Percy is likely the closest to what you are asking for because it integrates rendering into the crawling process.
How it works: You give it your sitemap. It visits every URL on both desktop and mobile (simulated iPhone/Pixel/iPad viewports).
The “AI” part: It uses “Smart Diffing.” It ignores “noise” (like a pixel moving 1mm due to browser rendering differences) and only alerts you to actual visual changes (e.g., your navigation bar collapsing into two rows instead of one).
Why for you: It handles the “entire site” requirement well if you feed it a list of URLs or a sitemap.
2. The “Smartest” AI: Applitools Eyes
Applitools is the leader in “Visual AI.” It attempts to mimic the human eye and brain.
The “AI” part: It is smart enough to know the difference between Content changes (a date changing from yesterday to today) and Layout disasters (text overlapping an image).
Unique Feature: It can sometimes detect “broken” layouts even without a baseline if you use their specific “Layout Match Level” which looks for structural integrity, though it is primarily a comparison tool.
Mobile: It uses the “Ultrafast Grid” to render your pages on dozens of real mobile devices in seconds.
3. The “Generic Brokenness” Finder: BrowserStack Responsive Checker
If you don’t want to set up baselines and just want a tool to crawl the site and show you screenshots of every page on an iPhone X, this is the tool.
How it works: You enter your URL (or a batch of URLs). It spins up real devices in the cloud, loads your page, and takes a high-res screenshot.
The downside: It doesn’t automatically “flag” errors (it doesn’t know that the image shouldn’t be there). You still have to scroll through the gallery of screenshots yourself, but it’s much faster than checking on your phone manually.
4. The Free / Open Source Option: BackstopJS
If you are comfortable with the command line and want a free solution you can run on your own machine.
How it works: You create a
backstop.json
file with a list of your URLs.
The Workflow:
Run
backstop reference
(This crawls your current site and takes screenshots of every page).
Apply your CSS changes.
Run
backstop test
(This crawls again and compares).
Result: It generates an HTML report showing you “diffs” (difference highlights) for every page that changed.
My Recommendation for Your Upgrade
Since you are retrofitting a legacy site, BackstopJS (if you have dev skills) or Percy (if you want a paid service) is the ideal workflow:
Run a scan NOW (with the old CSS). This is your “source of truth.”
Upload the new CSS.
Run the scan again.
The tool will instantly show you exactly which 5 pages (out of 100) broke because they had unique HTML that the new CSS didn’t account for.
Me:
You say that Percy will highlight changes to pages, but if the goal of a site redesign is to change the look of the site won’t that result in Percy flagging every page as dramatically different? What would be useful is a tool that flags only those pages that have been broken or disfigured by the change, not those that have simply changed from one style to another.
That is a very sharp observation. You’ve hit on the main “pain point” of visual regression testing: when you intentionally change the design, every page becomes a “failure” in the eyes of a standard pixel-comparison tool.
To solve this, the industry has moved toward Visual AI and Layout-Only testing. Here is how you can use tools to find “broken” pages rather than just “different” pages.
1. Applitools “Layout Match” (The Intelligence Approach)
Applitools is currently the leader in this. Instead of looking at pixels, their AI builds a structural map of the page.
How it helps you: It has a “Layout” match level. This mode ignores changes in colors, fonts, and specific images. Instead, it checks if the relationships between elements are still healthy.
What it flags: It won’t flag that your text is now blue instead of black. It will flag if your text is now overlapping an image, if a column has dropped to the bottom of the page unexpectedly, or if a button is partially hidden.
The Workflow: You run it once on your old site to let the AI learn the “structure” of your content, then run it on the new site.
2. Galen Framework (The “Rules-Based” Approach)
If you want something that specifically looks for “disfigured” pages without needing a baseline at all, Galen is a powerful open-source tool.
How it works: You write a simple “spec” file that describes what a “correct” page looks like.
Example: “Image should be above text on mobile,” or “Main container should never be wider than the screen.”
Why it fits your goal: You aren’t comparing the new site to the old one. You are testing the new site against the rules of good design. If a page has a horizontal scrollbar or a margin that is 0px wide on a phone, Galen will fail that specific page.
3. Percy’s “Grouped Diffs” (The Efficiency Approach)
Percy knows that a CSS change will break everything. To keep you from losing your mind, it uses Diff Grouping.
How it helps you: If you change the global
margins-and-ads.css
and it shifts the header on 400 pages, Percy will group all 400 pages into a single “change set.”
The “Broken” Finder: You look at the first page in the group. If it looks “correct” in its new style, you hit Approve All. If 398 pages look great but 2 pages look “disfigured,” the AI often detects that those 2 pages are “outliers” (different from the rest of the group) and flags them for individual review.
4. “VisualEyes” (User Attention AI)
This is a slightly different type of AI. It doesn’t look for broken code; it looks for broken UX.
How it works: It generates “Attention Heatmaps” based on your new design.
Why it’s useful: If your CSS change accidentally makes a “Google Ad” look more prominent than your “Navigation Menu,” the AI heatmap will show a massive red blob over the ad. It flags pages where the visual hierarchy has been “disfigured” in a way that will confuse a human.
Summary Recommendation:
If you want a tool that “just knows” a page is broken:
Applitools (Layout Mode) is the most “AI” way to ignore style changes but catch structural breaks.
Google Search Console / Lighthouse (Free) is the simplest “No-Baseline” way. You can run a Lighthouse “Accessibility” and “Best Practices” audit on your site; it will automatically flag “Touch targets too close together” or “Content wider than screen”—the two most common ways a mobile site is “disfigured.”
[after a follow-up]
By default, Google Lighthouse does NOT look at your entire site.
If you open Chrome DevTools and click “Run Audit,” it only analyzes the single specific page you are currently looking at.
However, because you are dealing with a site-wide CSS redesign, you have three ways to handle this depending on how much “manual work” you want to do:
1. The Manual Way (Single Page)
If you use the standard Lighthouse tool (in Chrome or via PageSpeed Insights), you have to enter every URL one by one. This is useful for testing your “templates” (e.g., check one article page, one gallery page, and the home page), but it won’t find a broken layout on a random page deep in your archives.
2. The “Semi-Automatic” Way (Unlighthouse)
There is a popular open-source tool called Unlighthouse that specifically solves your problem.
What it does: You give it your homepage URL. It crawls your entire site, finds every link, and runs a Lighthouse audit on every single page automatically.
The Result: It gives you a dashboard showing a “Score” for every page. If your new CSS makes a specific page’s “Accessibility” or “Best Practices” score drop (for example, because text is now overlapping or a button is too small), it will stick out like a sore thumb in the list.
3. The “Google Search Console” Way (Field Data)
If your site is already live and verified in Google Search Console, Google is actually already auditing your site for you.
Under the “Experience” tab in Search Console, look at “Core Web Vitals” and “Page Experience.”
Instead of a lab test, this shows you real-world data from users. It will group your pages into categories like “Poor,” “Needs Improvement,” and “Good.”
The Catch: This data is not instant. It takes about 28 days of real user traffic to update, so it’s better for long-term monitoring than for checking a CSS change you made ten minutes ago.
Which should you use?
For your CSS project, I recommend Unlighthouse.
Since your site appears to be a collection of legacy HTML files with a shared CSS, you likely have “patterns.” Unlighthouse will let you see if your CSS change worked for the 1996 articles as well as it did for the 2007 articles by showing you a side-by-side gallery of screenshots for every page it finds.
Summary Tip: If you want a quick check without installing anything, run Lighthouse on your three most different pages (e.g., a text-heavy page like “Chapter X,” a photo-heavy page like “Architecture,” and your Home Page). If those three pass the “Mobile Friendly” test, 90% of your site is likely safe.
We set Antigravity loose on a directory of AOLserver code behind philip.greenspun.com. The code base includes ArsDigita Community System, AOLserver configuration, and an installation of WordPress that was bolted on later. Antigravity was configured to use Gemini 3 Pro as the LLM.
Question 1
This is a directory for a web site called philip.greenspun.com. The page root is the www directory. If the / file is requested what is served is philip-home.html . What causes this file to be served instead of index.html and what functions process philip-home.html before it goes out to the browser?
Answer 1 (after 6 seconds)
Identified that index.tcl handles the root request, reads SpecialIndexPage parameter from parameters/philip.tcl (set to philip-home.html ), and serves it using ns_returnfile without content processing.
Here is what I found regarding the serving of
philip-home.html
:
1. Why
philip-home.html
is served instead of
index.html
: The file
www/index.tcl
is the default directory index file (prioritized by the server configuration
DirectoryFile
in
config/philip.tcl
). When
index.tcl
executes, it checks for a parameter named
SpecialIndexPage
. This parameter is defined in
parameters/philip.tcl
(line 269) as:
ns_param SpecialIndexPage /philip-home.html
Because this parameter is set,
index.tcl
serves this file immediately.
2. What functions process
philip-home.html
: The file itself is not processed by any template functions (like ADP parsing) because:
It is served via the
ns_returnfile
command in
index.tcl
, which bypasses the ADP parser.
The
.html
extension is not mapped to the ADP parser in
config/philip.tcl
(only
.adp
is).
The functions in
index.tcl
that lead to the file being served are:
ad_parameter
(to retrieve the
SpecialIndexPage
value)
empty_string_p
(to check if the parameter is set)
ns_info pageroot
(to construct the full path for the existence check)
file exists
(to verify the file is there)
ns_url2file
(to get the absolute path for
ns_returnfile
)
ns_returnfile
(to send the file content to the browser)
Question 2
What HTTP server is this code written for and that is likely being used for the live site?
Answer 2 (immediate)
Based on the codebase analysis, the site is written for AOLserver. … [extension explanation] … It is likely running AOLserver 4.5 (or potentially a compatible version of NaviServer) given the explicit path references in the configuration.
Question about ADP tags (a niche technology copied from Microsoft ASP)
[After browsing to /photography/learn/interior.adp] Where is the photonetheader ADP tag used in this file defined?
Answer re: ADP
Question about where to tweak
I want to modify either this function or the ad_header function that it calls to add a viewport META tag to the HEAD of every ADP page that is served. Which function should be modified and what would the modification look like?
Answer about where to tweak
I recommend modifying ad_header in d:\Backups\philip.greenspun.com\philip\tcl\2-hooks.tcl because this file already acts as a “hook” to inject content (currently a CSS file) into the header of all pages. This ensures the viewport tag is applied globally, including all ADP pages.
I have created an implementation plan to make this change.
Unless wrapped in {}, the quotes within the META tag to be added need to be escaped with backslashes. Antigravity doesn’t mention this.
Question about home page rendering
I modified this file on my dev server to include a viewport META tag, but it still doesn’t render well on mobile because the image on the left is much too large. What can I do with CSS to make this look good on mobile?
Answer
Conclusion
Antigravity can be a significant time-saver when you’re groping around a code base that you don’t understand, either because you never understood it or haven’t touched it for 20 years. Much of a programmer’s time on legacy code is figuring out what files are relevant and where a reasonable place might be to insert a required modification. Antigravity is a great shortcut.
Robert Duvall has died at 95. He played Tom Hagen in The Godfather, Part II, and famously pointed out that “A lawyer with his briefcase can steal more than a hundred men with guns” (worth remembering before considering marriage; no lawyer can sue you for divorce if you aren’t dumb enough to agree to a marriage!)
And, of course, every Robinson R44 pilot who ever thought about applying a “Death From Above” sticker to the nose of the four-seater will remember Duvall as Lieutenant Colonel William “Bill” Kilgore in Apocalypse Now.
I’ll remember Duvall in the lesser-known The Apostle (1997), which he also directed (don’t miss the soundtrack!). 88 percent on Rotten Tomatoes.
Robert Duvall, who drew from a seemingly bottomless reservoir of acting craftsmanship to transform himself into a business-focused Mafia lawyer, a faded country singer, a cynical police detective, a bullying Marine pilot, a surfing-obsessed Vietnam commander, a mysterious Southern recluse and scores of other film, stage and television characters, died on Sunday. He was 95.
Throughout his career, Mr. Duvall tried to keep Hollywood at arm’s length. He preferred living elsewhere — for many years on the Northern Virginia ranch with his fourth wife, the former Luciana Pedraza, an Argentine woman 41 years his junior. They met in the 1990s in Buenos Aires, which he visited often after developing a passion for the tango.
He was a Hollywood outlier on another front: politics. He was an ardent conservative, strongly supporting Republican presidential candidates, in a film world dominated by political liberals.
From early on, Mr. Duvall enjoyed the life of a supporting actor. “Somebody once said that the best life in the world is the life of a second leading man,” Mr. Duvall told The Times. “You travel, you get a per diem, and you’ve probably got a better part anyway. And you don’t have the weight of the entire movie on your shoulders.”
More from John Morgan and Philip Greenspun on using AI when doing web development…
Intro from Philip
In 1994, when I built my first web services backed by relational database management (RDBMS) systems, every request to an HTTP (Web) server resulted in an expensive fork, i.e., the spawning of a new process within the Unix operating system. If the request was for a small computer program to run, rather than a static file from the file system, that resulted in a second fork for a CGI script. If there was a need to refer to information in an RDBMS, such as Oracle, the CGI script would initiate the login process to the RDBMS, which would check username and password and… initiate another fork for a new process to handle what would ordinarily be 8 hours of SQL requests from a human user at a desktop in the 1980s client/server world. So that would be three new processes created on the server in order to handle a request for a web page. All would be torn down once the page had been delivered to the user. Consider how much longer it takes to start up Microsoft Word on your desktop computer than it does for Word to respond to a command. That’s the difference between starting up a program as a new process and interacting with an already-running program. Here’s an illustration of the four processes ultimately involved. The top one is the user’s browser. The three below that were spawned to handle a single request.
NaviServer (later “AOLserver” after NaviSoft’s acquisition by AOL) was the first web server to combine the following:
multi-threading, enabling a request for a static file to be served without a fork
internal API, enabling small programs that generated web pages to run within the web server’s process, thus eliminating the CGI fork
pooling of database connections, e.g., four persistent connections to an RDBMS that could be used to handle queries from thousands of requests, thus eliminating the fork of an RDBMS server process to handle a “new” client on every request
The available languages for page scripts that could run inside the AOLserver were C (macho, compiled, slow for development, potential to destroy the entire web server, not just break a single page, with one mistake; see the API) and Tcl (embarrassing to admit using, simple, interpreted, safe; see the API).
As the architect of the information systems that would be available to all of Hearst Corporation‘s newspapers, magazines, radio stations, TV stations, cable networks, etc., I selected the then-new NaviServer in late 1994 in order to achieve (1) high performance with minimal server hardware investment, and (2) high developer productivity. The result was that I developed a lot of code in Tcl, a language that I hadn’t used before. It didn’t seem to matter because the Tcl was generally just glue between an HTML template and a SQL query. The real programming and design effort went into the SQL (are we asking for and presenting the correct information? Will comments, orders, and other updates from hundreds of simultaneous readers be recorded correctly and with transactional integrity in the event of a server failure?) and the HTML (will the reader be able to understand and use the information? Will comments, orders, and other updates from the reader be easy to make?).
Just a few years later, of course, other companies caught up to AOLserver’s threaded+scripts inside the server+database connection pools architecture, most notably Microsoft’s Internet Information Server (IIS). Eventually the open source folks caught up to AOLserver as well, with a variety of Apache plug-ins. And then I persuaded America Online to open-source AOLserver.
Here we are 32 years later and I’m still running code that we wrote at Hearst. The company was interested in publishing, not software products, so they graciously allowed me to use whatever I wrote at Hearst on my own photo.net web site and, ultimately, to release the code as part of the free open-source ArsDigita Community System (adopted by about 10,000 sites worldwide, including some at Oracle, Siemens, the World Bank, Zipcar, and a bunch of universities).
[One fun interaction: in 2012, I was at a social gathering with a developer from the Berklee School of Music (Boston). He talked about some legacy software in a horrible computer language that nobody knew that they had been using for 10 years to track and organize all of their courses, students, teachers, assignments, grades, etc. They’d had multiple expensive failed projects to try to transition to newer fancier commercial tools and finally, at enormous cost in dollars and time, had succeeded getting away from the hated legacy system. It turned out that he was talking about the .LRN module that we’d developed for the MIT Sloan School in the 1990s and that was then rolled into the open-source toolkit. I kept quiet about my role in what had turned into a pain point for Berklee’s IT folks…]
Our Project
As part of our experimentation with AI and web design, we asked LLMs to do some redesign work on philip.greenspun.com. They all came back and said that it would be necessary to modify the HTML flying out of the server and not merely an already-referenced CSS file. It would be technically feasible, of course, to write a script to run on the server to open up every HTML file and add
to the HEAD of every document before writing it back into the file system. This would, however, have the side effect of updating all of the last-modified dates on files that, in fact, hadn’t been touched for decades (fixable with a little more scripting) and also creating a blizzard of updates to the git version control system.
The server was already set up with a standard ArsDigita Community System feature in which a Tcl procedure would be run for every HTML file request. This obviously reduces performance, but it enables legacy static HTML pages to be augmented with navigation bars, comment links, comments pulled from the RDBMS, advertising JavaScript, extra footers or headers, etc. Instead of modifying every HTML file under the page root, in other words, we could simply modify this function to add whatever tags we wanted in the head.
The questions:
Would an LLM be able to understand a Tcl program that had grown over the decades into a confusing hairball?
Would an LLM be able to do a minimalist modification of the program to insert the one line that was needed?
Would an LLM be able to reorganize the software for improved legibility, modularity, and maintainability?
The original
The original file is about 500 lines long and contains 18 procedures. The LLM will have to figure out which procedure to modify and then pick the best place within the procedure.
If a human programmer were to do an insertion with minimum risk of breaking everything, it would probably be around line 185. The file has been read and is sitting in a variable called “whole_page”. Even if there is a “do not disturb” tag within the page (i.e., don’t try to add comments or ads) it would still make sense to add this modern META tag in the output at line 189.
The prompt
Can you add one small feature to this AOLserver Tcl program, making as few changes as possible? It implements a procedure that runs every time a .html page is requested from the server and may add comment links, Google ads, navigation bars, and other items to legacy static pages. I want it to add “<meta name=”viewport” content=”width=device-width, initial-scale=1″>” to the HEAD of every outgoing page. Please tell me the line numbers of the file where you’ve changed, inserted, or deleted anything.
Grok can’t count
Grok finds the same location that a human programmer would, but either can’t count or numbers the lines differently from how Notepad++ and Emacs count/number. What’s at line 185 in Notepad++ and perhaps 187 in Emacs is 105-110 for Grok:
Grok helpfully offers to enhance this a bit:
Grok is capable of explaining its regsub command. Here’s part of the explanation:
Grade: A! (would have been A+ if the line counting corresponded to how text editors count lines)
ChatGPT gets an A++
It took 3.5 minutes for ChatGPT to wrap its Hopper architecture brain (assuming H200 chips) around Tcl, but the results were spectacular. Unlike Grok, it counts the lines correctly. Also unlike Grok, it puts the new META tag in a variable so that changing the META tag doesn’t risk breaking the regexp. ChatGPT also prepares an updated file for download.
ChatGPT is kind of like Air Traffic Control in dealing with humans who are making mistakes. Instead of pointing out “You’re going in the wrong direction,” ATC will generally ask the pilot to “Say heading” or just say “Turn left heading 180” (if 180 was the correct heading to fly). ChatGPT recognizes that only a stupid human would want to insert the viewport META tag into an HTML page that already has one and it just includes the regexp check in an IF statement before the regsub operation: A++!
Claude gets a B-
Unlike ChatGPT, Claude runs its regsub without first checking to see if there is already a viewport META tag. Unlike Grok, it doesn’t offer an improved version that does perform a check. Unlike both ChatGPT and Grok, Claude puts this important code after the DND pages have been served and also after some random Amazon ad tags has been searched for. Like Grok, Claude puts the new meta tag right in the regsub statement, thus making maintenance riskier.
Claude has a convenient side-by-side layout for working with code.
Credit: Claude takes the interesting approach of looking for the closing HEAD tag rather than the opening one. This avoids having to have a more complex matching pattern. That lifts Claude from a C to a B-.
Gemini Pro (C isn’t just for memory leaks)
Gemini Pro combines all of the worst features of the other LLMs. It counts lines idiosyncratically, like Grok. It fails to use the /HEAD tag and also fails to do a matching pattern that will match HEAD tags with attributes. It chooses the wrong part of the file and, unlike Claude, either lacks awareness that this means a lot of DND pages will be served without the viewport tag or chooses not to explain the implication of the placement after the DND pages are served.
Antigravity
Antigravity backed by Gemini takes a slightly different approach than we saw from Gemini in the previous test. It puts the regsub after the DND pages, but before the Amazon ads. It matches a HEAD tag with additional attributes. Grade: B
Interestingly the Antigravity chat interface gives us insight into the reasoning that led to this result. In this case we see that Gemini chose this placement location not because it failed to understand the relevance of the DND option but rather because it interpreted the “do not disturb” concept that it found in the code to be a more important than the prompt’s instruction to apply the <meta> tag to all pages. As it came up with its plan it changed its mind back and forth before ultimately deciding that the best compromise was to place the code after the DND check:
I’m now grappling with the implications of “Do Not Disturb” pages. Lines 189 and beyond are relevant. The existing logic immediately returns $whole_page if the tag is present, implying an “unmolested” state. The user requested adding to “every outgoing page.” However, “unmolested” suggests no modifications, contradicting the user’s intent if the request is taken literally. I’m leaning toward not inserting the viewport tag if the DND tag exists, as that aligns with the script’s and the variable names’, intended functionality.
I’m now carefully considering the implications of inserting the viewport meta tag in the context of “Do Not Disturb” (DND) pages, aiming to