10 interesting stories served every morning and every evening.

Gmail Thinks I'm Stupid, So I Left

moddedbear.com

Let me tell you a story

I go to check my email in Gmail’s web UI. I see a few new mes­sages re­gard­ing feed­back on a pro­ject I’m work­ing on. I click through to read one of them and the first thing I’m greeted with is a mes­sage sum­mary I did­n’t ask for gen­er­ated by a lan­guage model.

I fo­cus the mes­sage box to draft a re­ply, but there’s al­ready one there. It was also gen­er­ated by the lan­guage model. I delete it, re­plac­ing it with my own.

Afterward, I go to com­pose a new mes­sage. A col­or­ful an­i­ma­tion steals my fo­cus for a sec­ond high­light­ing a new help me write” but­ton. I ig­nore it and move on to fill­ing in the re­cip­i­ents and sub­ject line.

I fo­cus the mes­sage body area and un­der­neath my cur­sor ap­pears the mes­sage Press / for Help me write”. Again, I ig­nore it and be­gin writ­ing.

A few mo­ments later, I start a new para­graph and pause. There’s a new mes­sage un­der my cur­sor now: Tab to im­prove”. What I’ve writ­ten so far is­n’t up to Gmail’s stan­dards, it seems.

What mes­sage are you try­ing to send?

Look, I’m pretty prag­matic when it comes to gen­er­a­tive AI fea­tures in soft­ware. I see very lit­tle wrong with in­clud­ing an op­tional AI writ­ing as­sis­tant for those who want it.

But when you nag and nag, when you sum­ma­rize my mes­sages and write my replies with­out my ask­ing, when you re­peat­edly in­ter­rupt me to beg and plead that I rewrite my drafts, you’re send­ing the wrong mes­sage.

The mes­sage you’re send­ing is that you think I’m not ca­pa­ble of read­ing and writ­ing my own emails. That the peo­ple I’m ex­chang­ing mes­sages with don’t de­serve my time and en­ergy. That I’m do­ing some­thing wrong by not out­sourc­ing my com­mu­ni­ca­tion skills to a to­ken pre­dic­tion ma­chine.

I’ve looked into it. Some of these fea­tures can be turned off. Others can’t. Or if they can, it means also turn­ing off use­ful long-stand­ing fea­tures like au­to­matic thread cat­e­go­riza­tion. I have very lit­tle doubt that this is in­ten­tional, that the un­so­licited sum­maries and auto replies are a means of ar­ti­fi­cially in­flat­ing the us­age met­rics for the lan­guage model fea­tures.

I think we’re all used to user-hos­tile soft­ware these days, but this is the first time I’ve ex­pe­ri­enced soft­ware that feels like it’s ac­tively try­ing to be dis­re­spect­ful. Sure, I could switch to a dif­fer­ent mail client and never see any of these lan­guage model fea­tures, but my ex­pe­ri­ence these past months has left such a bad taste that all I’m look­ing for now is a clean break.

A 16 year breakup

I’ve had my Gmail ac­count for 16 years. It’s by far my old­est in­ter­net ac­count that I still use. Or used to use. I’ve al­ready started the long process of mov­ing away.

This time I’m do­ing things the right way by con­nect­ing my own do­main to a mail host. I’m cur­rently with Fastmail since they were by far the most pop­u­lar op­tion when I asked for sug­ges­tions on the fe­di­verse. I’m still early on in the trial pe­riod, but so far first im­pres­sions are great. It seems re­ally flex­i­ble, and af­ter con­nect­ing mul­ti­ple do­mains and set­ting up a few aliases I’m start­ing to wish I had tried it sooner.

I haven’t set­tled on whether or not I should im­port my Gmail data. I’ll al­most surely im­port my con­tacts, but there’s some­thing nice about start­ing fresh as far as every­thing else goes. I’m in­ter­ested in what other peo­ple in a sim­i­lar po­si­tion have done.

Congrats to Google, re­ally. They’ve done a de­cent job at keep­ing Gmail sta­ble over the many years I’ve used it. Which is why even I am im­pressed by how quickly they were able to get me to pack up and leave.

JP

Adafruit Industries - Makers, hackers, artists, designers and engineers!

blog.adafruit.com

June 1, 2026 AT 8:05 pm

Adafruit Receives Demand Letter From Fenwick Legal Counsel on Behalf of Defy Gravity, Inc. Flux.AI (“Flux”)

Adafruit re­ceived at 10:38 p.m. ET on May 22, 2026 a let­ter from for­mer FBI chief of staff, Jonathan F. Lenzner, and part­ner at Fenwick & West LLP, coun­sel for Flux, de­mand­ing, among other things, that Adafruit re­frain from pub­lish­ing an ar­ti­cle ad­dress­ing what the let­ter char­ac­ter­izes as false and po­ten­tially defam­a­tory claims about Flux, in­clud­ing state­ments about Flux’s in­tel­lec­tual prop­erty, com­mer­cial trac­tion and user base.

The let­ter fur­ther as­serts claims un­der the Computer Fraud and Abuse Act. Adafruit ac­cessed only in­for­ma­tion that Flux’s own sys­tems made pub­licly avail­able through a server mis­con­fig­u­ra­tion. Adafruit’s re­port­ing con­cerns a mat­ter of pub­lic se­cu­rity in­ter­est and was con­ducted in the or­di­nary course of re­spon­si­ble dis­clo­sure.

Although Adafruit vig­or­ously re­jects the as­ser­tions made in Flux’s May 22, 2026 de­mand let­ter, we have tem­porar­ily stopped pub­lish­ing on the Adafruit blog while we con­sider our re­sponse and next steps.

We will up­date the com­mu­nity as ap­pro­pri­ate.

The Adafruit press con­tact is: [email protected]

-ladyada & pt

MAI-Code-1-Flash

microsoft.ai

The lat­est break­throughs and up­dates from within our team

Turn noisy au­dio into pre­cise, do­main-spe­cific tran­scripts, with lead­ing FLEURS and Artificial Analysis ac­cu­racy scores.

Create stun­ning, de­sign-ready im­ages from any text or photo prompt, with best-in-class Arena ELO scores at a lower price.

Helps your en­gi­neer­ing team write bet­ter code faster, with a light­weight, agen­tic model built into GitHub Copilot and VS Code.

Built for the com­plex prob­lems that mat­ter most, with com­pet­i­tive rea­son­ing and top SWE-Bench Pro re­sults at a mid-weight price.

The lat­est break­throughs and up­dates from within our team

Turn noisy au­dio into pre­cise, do­main-spe­cific tran­scripts, with lead­ing FLEURS and Artificial Analysis ac­cu­racy scores.

Create stun­ning, de­sign-ready im­ages from any text or photo prompt, with best-in-class Arena ELO scores at a lower price.

Helps your en­gi­neer­ing team write bet­ter code faster, with a light­weight, agen­tic model built into GitHub Copilot and VS Code.

Built for the com­plex prob­lems that mat­ter most, with com­pet­i­tive rea­son­ing and top SWE-Bench Pro re­sults at a mid-weight price.

MAI-Code-1-Flash plans and rea­sons through com­plex cod­ing tasks from start to fin­ish, so you spend less time de­bug­ging and more time build­ing.

Takes ini­tia­tive across multi-step work­flows, mak­ing de­ci­sions and adapt­ing au­tonomously with­out wait­ing for in­put.

Optimized for GitHub Copilot in VS Code

Custom-trained for na­tive VS Code in­te­gra­tion, work­ing bet­ter to­gether with GitHub Copilot.

From strat­egy to shipped code, keep every pro­ject mov­ing for­ward.

Coming Soon to VS Code

Introducing MAI-Code-1-Flash  | Microsoft AI

microsoft.ai

Build for de­vel­op­ers, not bench­marks

Coding mod­els are most use­ful when they per­form well in the same en­vi­ron­ment de­vel­op­ers use every day. That is why we built MAI-Code-1-Flash with pro­duc­tion work­flows at the cen­ter, rather than op­ti­miz­ing only for bench­marks. The model was trained di­rectly with GitHub Copilot har­nesses used in pro­duc­tion. This al­lows it to learn how to in­ter­act with sur­round­ing tools and sys­tems in agen­tic cod­ing tasks, mak­ing it uniquely well suited to real-world Copilot work­flows com­pared to other avail­able mod­els.

During train­ing, we eval­u­ated check­points across core soft­ware en­gi­neer­ing tasks, repos­i­tory ques­tion an­swer­ing, refac­tor­ing, and teleme­try-grounded tasks adapted from real GitHub Copilot us­age. This align­ment be­tween train­ing, eval­u­a­tion, and pro­duc­tion helps of­fline im­prove­ments trans­late into real-world de­vel­oper qual­ity.

Designed to max­i­mize value per to­ken

MAI-Code-1-Flash was trained with adap­tive so­lu­tion length con­trol, which helps the model ad­just the depth of its re­sponse to the task. It can stay con­cise for sim­pler re­quests and spend more rea­son­ing bud­get when a prob­lem re­quires deeper analy­sis or broader code changes. In prac­tice, this means de­vel­op­ers start see­ing use­ful out­put sooner. We see MAI-Code-1-Flash solv­ing harder prob­lems with up to 60% fewer to­kens. This helps re­duce la­tency, lower cost, im­prove re­turn on to­ken, and make in­ter­ac­tive work­flows feel smoother.

Benchmark re­sults in the pro­duc­tion har­ness

To un­der­stand both qual­ity and ef­fi­ciency, we eval­u­ated MAI-Code-1-Flash against Claude Haiku 4.5 on SWE-Bench Verified, SWE-Bench Pro, SWE-Bench Multilingual, and Terminal Bench 2 us­ing the same pro­duc­tion har­ness that de­vel­op­ers use for their every­day cod­ing tasks. We mea­sured task suc­cess and the av­er­age num­ber of so­lu­tion to­kens re­quired to com­plete each task.

MAI-Code-1-Flash out­per­forms Claude Haiku 4.5 across all core cod­ing bench­marks tested, with higher pass rates on all 4 eval­u­a­tions, in­clud­ing a +16-point lead on the di­verse, real-world tasks of SWE-Bench Pro (51.2% vs. 35.2%). It’s not just smarter; it’s leaner, solv­ing harder prob­lems with up to 60% fewer to­kens on SWE-Bench Verified, prov­ing that higher ac­cu­racy and greater ef­fi­ciency are no longer a trade-off.

A walking tour of surveillance infrastructure in Seattle

coveillance.org

Note: this guide is a work in progress and may change at any time! We’ve done our best to cite our sources, but this page has not been pro­fes­sion­ally fact-checked.

This work­shop was first run as part of two pi­lot work­shops with the Tech Equity Coalition, in part­ner­ship with the ACLU of Washington, in October 2019. A zine based on this work was in­cluded at the CtrlZ.AI zine fair and the HOT MESS dig­i­tal ex­hi­bi­tion in 2020.

Introduction

In this tour of down­town Seattle, we’ll prac­tice spot­ting some of the lay­ers of the smart” city that are hid­den in plain sight, col­lect­ing and stor­ing data about our lives, as well as the kinds of think­ing that jus­tify their ex­is­tence. Each sur­veil­lance tech­nol­ogy in our field guide in­cludes the fol­low­ing cat­e­gories to help you spot” sur­veil­lance tech­nol­ogy in the wild: Address, Appearance, What it does, How the tech works, Social im­por­tance, Discussion and fi­nally, References.

Tour route

This is the route we will be tak­ing on the walk­ing tour. Click on each stop to pop up its lo­ca­tion, and feel free to ex­plore it on Google Maps, e.g. with Street View. The route spans 1.3 miles. Below, we out­line each of the sur­veil­lance tools/​sites listed above.

Surveillance cam­eras

Address: Practically every­where, but the above ex­am­ple is at 523 Union St.

Appearance: Poles, ledges, over­hangs, rooftops. They are of­ten spot­ted watch­ing park­ing lots, doors, banks, in­ter­sec­tions, and gov­ern­ment build­ings. Indoors, they are typ­i­cally spot­ted on roofs and near cash reg­is­ters.

What it does: The cam­era has a mem­ory. It can record video or other data and add it to a store of records over all time. The cam­era can be con­trolled re­motely: it can swivel, zoom, or change height.

How the tech works: Camera record­ings can be an­a­lyzed for pat­terns and shared with other en­ti­ties, both pri­vate (your neigh­bors) and pub­lic (the lo­cal po­lice).

It might be con­nected to a net­work (via Internet or ra­dio fre­quency), which lets it send video to any­where, re­ceive in­struc­tions from any­where, and lets other peo­ple, who might be any­where, watch the video stream.

Discussion

What are other ways to ques­tion the need to have cam­eras, or sur­veil­lance, at all? What sort of so­ci­ety would we build around this way of life?

What are your in­di­vid­ual or com­mu­nal ex­pe­ri­ences of light shin­ing more brightly on some than oth­ers”?

What if each cam­era were re­placed by a per­son? How would that change how you feel?

References

Street-level sur­veil­lance overview (EFF)

Video sur­veil­lance sys­tem overview (ACLU)

What’s wrong with pub­lic video sur­veil­lance? (ACLU)

Amazon Go

Address: 2131 7th Ave

Appearance: Looks like it could be any other con­ve­nience store… but it’s not! Inside, you must scan an app to en­ter, and there are no cashiers.

What it does: Amazon Go tracks your move­ment us­ing over­head cam­eras to de­ter­mine your brows­ing habits.

How the tech works: Amazon can use your pur­chases to know more about you us­ing pat­terns. For ex­am­ple, if you buy Hanukkah dec­o­ra­tions, they might know you’re Jewish. Or cer­tain foods might be cor­re­lated with cer­tain health is­sues. They can com­bine your in-store pur­chases with your on­line Amazon pur­chases for even more pre­dict­ing power.

What is Amazon do­ing with their knowl­edge about you? There’s no over­sight or trans­parency. Your data could be sold to third par­ties with­out your con­sent.

Discussion

References

Facial recog­ni­tion used at a con­ve­nience store in Seattle (another story)

How much is your data worth? “No cash needed at this cafe. Students pay the tab with their per­sonal data.”

Automated li­cense plate reader

Address: 699 Spring Street

Appearance: An au­to­mated li­cense plate reader (ALPR) is a lit­tle cam­era that is ei­ther mounted to a pole (stationary) in high-traf­fic lo­ca­tions or the top of a po­lice car (mobile) (Fig. 2.).

What it does: An ALPR pho­tographs the li­cense plate of every car that passes by and records the time and place of the en­counter, as well as the plate num­ber (Fig. 3.), and sends the in­for­ma­tion to a cen­tral stor­ing place (called a data­base). Based on the in­for­ma­tion from an ALPR (e.g. plate num­ber ABC1234 de­tected at the in­ter­sec­tion of Pike and Pine at 1:20 PM), and the type of ALPR, a par­tic­u­lar city agency may take an ac­tion.

There are three main kinds of ALPRs in Seattle. Stationary ones (type #1), owned by the Dept. of Transportation, are used for traf­fic pur­poses, to es­ti­mate travel time. Mobile ones, owned by the Seattle Police Dept., are used for park­ing en­force­ment (type #2) or law en­force­ment (type #3), to ping a po­lice of­fi­cer di­rectly when a wanted” li­cense plate is spot­ted. These three kinds of ALPRs have dif­fer­ent data re­ten­tion pe­ri­ods; po­lice ALPR data can be stored for up to 90 days, whereas other ALPR data is (supposedly) deleted im­me­di­ately. In Seattle, the Seattle Department of Transportation has at least 99 sta­tion­ary ALPRs de­ployed, and the Seattle Police Department has 19 ve­hi­cles with mounted ALPRs.

How to spot: ALPRs are usu­ally mounted up high near high-traf­fic ar­eas, like high­ways, down­town ar­eas, in­ter­states, and bridges. Maps of sta­tion­ary ones are dif­fi­cult to find be­cause cities don’t want dri­vers know­ing where they might be is­sued speed­ing tick­ets.

Regulations on ALPR use—both the tech­nol­ogy and the data col­lected—are mostly nonex­is­tent na­tion­ally, as well as in Seattle. That means that the agency that owns the sys­tem can choose whether and how they want to re­tain data, or track ve­hi­cle move­ments. Check out the map in Fig. 4: though SDOT says it does not track in­di­vid­ual dri­vers’ move­ments, data from an ALPR sys­tem could eas­ily be com­bined to do so.

Because of the lack of reg­u­la­tions, na­tion­ally, data-shar­ing is ram­pant with li­cense plate data. According to EFF, many law en­force­ment agen­cies share plate data di­rectly with each other, even across bor­ders. ALPR data also makes it into pri­vate data­bases such as Thomson Reuters’s CLEAR, ac­cess to which can be bought by agen­cies and pri­vate cor­po­ra­tions. In Seattle, SDOT and SPD say that they do not share data di­rectly from ALPR sys­tems, but it’s un­clear what agen­cies might be able to ac­cess data with a re­quest (per the two Seattle Surveillance Ordinance re­ports on ALPRs).

When it comes to ALPR data, be­ware of scope creep (Fig. 5): due to per­va­sive col­lec­tion and data-shar­ing, your li­cense plate could leave its orig­i­nal con­text and pur­pose and be used in ways you never con­sented to, such as pri­vate in­ves­ti­ga­tion or tar­geted ad­ver­tis­ing.

How the tech works: ALPR is one of the older sur­veil­lance tech­nolo­gies; it was first in­vented and tested in the UK in 1984 to de­tect stolen cars. It uses a tech­nique called op­ti­cal char­ac­ter recog­ni­tion (OCR), from a field called com­puter vi­sion, to au­to­mat­i­cally make a guess at the let­ters and num­bers in a pic­ture of a li­cense plate. This guess is prob­a­bilis­tic; i.e. it could be wrong. Database tech­nolo­gies al­low all the in­for­ma­tion col­lected by ALPRs to be col­lected, and ques­tions asked of it.

Interventions

In 2015, California and Minnesota passed strict laws plac­ing lim­its on ALPR data-shar­ing. Minnesota also bars law en­force­ment from pho­tograph­ing a ve­hi­cle’s oc­cu­pants. (Source: STOP)

Discussion

Of the three types of ALPRs, which ones do you think should be used in Seattle?

Is the con­ve­nience of travel time es­ti­mates (e.g. WSDOTs chart) or more ef­fi­cient law en­force­ment worth the pri­vacy leaks? What are less-in­va­sive ways that we could achieve the same goals?

How might ALPR use, and data col­lec­tion, im­pact you col­lec­tively, as an in­no­cent per­son who is not di­rectly tar­geted by the state?

Further ques­tions

What agen­cies have ac­cess to these sys­tems?

Which cities are us­ing this or con­sid­er­ing?

What are the WA state rules re­gard­ing law en­force­ment us­ing pri­vate sources of ALPR data?

Which tech com­pa­nies are pro­vid­ing these sys­tems and how much info do they keep (and what is it used for)?

(We are leav­ing an­swers to these ques­tions out of our in­tro­duc­tory writeup, but en­cour­age you to find out the an­swers for your city. Thank you to Tech Fairness Coalition mem­bers for ask­ing these ques­tions!)

References

2018 Surveillance Impact Report — License Plate Readers — Seattle Department of Transportation

2018 Surveillance Impact Report — Automated License Plate Recognition (ALPR) (Patrol) — Seattle Police Department

2018 Surveillance Impact Report — Parking Enforcement Systems (Including ALPR) — Seattle Police Department

EFF — Automated License Plate Readers

Automated License Plate Readers & Law Enforcement — 2019

They Are Watching (ACLU) — Automatic License Plate Reader

How ICE Picks Its Targets in the Surveillance Age” (The New York Times, 2019)

How Britain Exported Next-Generation Surveillance” — on the in­ven­tion of ALPRs (James Bridle, Medium, 2013)

Data Driven: What We Learned (EFF study on ALPR data)

Acyclica

Address: Corners of Spring & 5th and Spring & 4th

Appearance: Flat black cir­cles on top of traf­fic sig­nal con­trol boxes, which are large, gray or painted metal boxes, typ­i­cally found at street cor­ners.

What it does: The Acyclica de­vice casts a fake Wi-Fi net­work and tracks phones that try to join the net­work in pass­ing cars. Since each phone has a unique iden­ti­fier (called a MAC ad­dress — like your Social Security Number, but for a de­vice), dif­fer­ent Acyclica in­stal­la­tions can track your per­sonal lo­ca­tion as you pass them in the city.

How the tech works:  You know how your phone or lap­top auto-con­nects to Wi-Fi net­works?  To do this, your de­vice is shout­ing to the world a ton of your per­sonal in­for­ma­tion in some­thing called a probe packet. A probe packet con­tains the MAC ad­dress as well as the list of all the past Wi-fi net­works that your de­vice has tried to join be­fore, which can re­veal a lot about you! (See Fig. 1.) Acyclica lis­tens for these probe pack­ets, and keeps track of the dif­fer­ent places it has heard your MAC ad­dress to cre­ate a lo­ca­tion his­tory.

Another big is­sue is data es­cap­ing scope. The Seattle city gov­ern­ment may promise cer­tain things about the data, but data that gov­ermn­ment agen­cies col­lect his­tor­i­cally has a funny way of be­ing stored for longer than promised and shared with other agen­cies (like ICE or law en­force­ment) or quasi-pri­vate en­ti­ties (like Palantir) and used to cir­cum­scribe the move­ments of mem­bers of mar­gin­al­ized com­mu­ni­ties.

Discussion

How do peo­ple feel about how Acyclica is col­lect­ing their data? What could go wrong? What does the process of co­er­cive data col­lec­tion feel” like a mos­quito bite? a high­way rob­bery?

References

Crosscut news ar­ti­cle and overview: Seat­tle’s new tech­nol­ogy tracks how we drive

Seattle Surveillance dossier (large PDF) on Acyclica (see page 8 for a map of Acyclica lo­ca­tions and page 111 for a bunch of valid tech­ni­cal ob­jec­tions)

Seattle Department of Transportation overview of Acyclica traf­fic data col­lec­tion tool

Washington State Fusion Center

Address: Visit the Washington State Fusion Center (WSFC), in the Abraham Lincoln Building, 1110 3rd Ave, Seattle Washington, 98101

Appearance: Seattle’s fu­sion cen­ter seats a team of 15 – 30, with full time in­tel­li­gence of­fi­cers from the Seattle Police, County Sheriff, state in­ves­ti­ga­tors and an­a­lysts. These cen­ter em­ploy­ees are linked through the State Intelligence Network to every law en­force­ment agency in the state, and have ac­cess to the FBI both through their com­puter sys­tems as well as through a se­cu­rity cor­ri­dor link­ing them to the FBIs own Field Intelligence Group of­fice on the floor above as well as the Puget Sound Joint Terrorism Task Force.

What it does: After 9/11 fu­sion cen­ters were born with the Intelligence Reform and Terrorism Prevention Act of 2004” (IRTPA) along with a host of other counter-terrorism” in­tel­li­gence en­ti­ties such as the Department of Homeland Security. With 18 cen­ters first es­tab­lished, there are now 78 rec­og­nized cen­ters. Fusion cen­ters fa­cil­i­tated a na­tional anti-ter­ror­ism strat­egy of in­tel shar­ing be­tween lo­cal and na­tional agen­cies as well as with pri­vate com­pa­nies and the mil­i­tary.

How to spot: This build­ing’s lo­ca­tion in down­town Seattle is no ac­ci­dent. Most fu­sion cen­ters are typ­i­cally lo­cated in ur­ban cen­ters to put them in the cen­ter of mul­ti­ple agen­cies that ad­min­is­ter pub­lic safety needs, fire, emer­gency re­sponse, pub­lic health providers, and pri­vate sec­tor se­cu­rity agen­cies.

Multiple in­ci­dents of pri­vacy vi­o­la­tions and po­lit­i­cal mon­i­tor­ing are def­i­nite ex­am­ples of con­cerns as­so­ci­ated with fu­sion cen­ters. But ac­tu­ally as Brendon McQuade ar­gues in Pacifying the Homeland: Intelligence Fusion and Mass Supervision” this con­fus­ing ar­ray of co­or­di­nat­ing agen­cies makes it harder to ex­pose po­lit­i­cal polic­ing the same way as COINTELPRO in the Panther 21 / Handschu Case.

Fusion Centers are man­dated to in­clude pri­vate sec­tor in­volve­ment and their pri­or­i­ties are split be­tween mul­ti­ple stake­hold­ers at the lo­cal, fed­eral, and pri­vate level. This puts the role of fu­sion cen­ters in a frac­tured light.

Many fu­sion cen­ters have played a role in mon­i­tor­ing move­ments. From the Cato Institute’s sum­mary of ACLU Fusion Center re­ports, We’re All Terrorists Now:”

The North Texas Fusion System la­beled Muslim lob­by­ists as a po­ten­tial threat; a DHS an­a­lyst in Wisconsin thought both pro- and anti-abor­tion ac­tivists were wor­ri­some; a Pennsylvania home­land se­cu­rity con­trac­tor watched en­vi­ron­men­tal ac­tivists, Tea Party groups, and a Second Amendment rally; the Maryland State Police put anti-death penalty and anti-war ac­tivists in a fed­eral ter­ror­ism data­base; a fu­sion cen­ter in Missouri thought that all third-party vot­ers and Ron Paul sup­port­ers were a threat; and the Department of Homeland Security de­scribed half of the American po­lit­i­cal spec­trum as right wing ex­trem­ists.”

However, their role dur­ing the Occupy move­ment showed that many fu­sion cen­ters claimed of­fi­cial poli­cies of non-in­volve­ment in line with DHSs of­fi­cial poli­cies at the fed­eral level. In cases with pri­vate sec­tor stake­holder in­ter­ests such as in Arizona, how­ever, we see a dif­fer­ent story. When Occupy Phoenix tar­geted the American Legislative Exchange Council (ALEC) for its profit ties to ICE and its role in pass­ing a bill that al­lowed law en­force­ment to racially pro­file lat­inx dri­vers, Arizona’s fu­sion cen­ter as­signs an of­fi­cer to mon­i­tor Occupy Phoenix and li­aise with ALEC. ACTIC Provided ALEC with in­tel­li­gence, in­clud­ing a persons of in­ter­ests” list re­gard­ing an protest of an ALEC con­fer­ence who were later tar­geted with ar­rests.

How the tech works:

Fusion cen­ters do not store most of the data avail­able to them. Instead, they ne­go­ti­ate agree­ments that al­low re­mote ac­cess to ex­ist­ing data­bases. They will work around pri­vacy pro­tec­tions and buy ac­cess to the pri­vate data­bases (e.g. Vigilant’s ALPR data­base; see ALPR walk­ing tour stop), which pro­vide a plethora of in­for­ma­tion on in­di­vid­u­als with no crim­i­nal record.

Fusion cen­ters have ac­cess to the DHSs Homeland Security Data net­work, and sev­eral FBI data por­tals. A few data­bases used by the WSFC in­clude:

Law Enforcement Information Exchange (LINX)

FBI Systems

WAFUSION Intake Log

Regional Information Sharing System Database (RISS)

Homeland Security State and Local Intelligence Community

Law Enforcement Online (LEO)

Washington State Emergency Management Department

DHS Infrastructure Protection Protective Security Advisor (LENS, IRIS)

Interventions:

What are tools we have against such a large fed­eral, lo­cal, and pri­vate con­glom­er­ate? The strengths of a fu­sion cen­ter also con­tain its weak­nesses. A frac­tured chain of com­mand of­ten pre­sents con­flicts and con­fu­sion with ri­val agency agen­das. It ap­pears that some mea­sure of trans­parency calls and pri­vacy con­cerns work af­ter ma­jor in­ci­dents, with some abil­ity to keep watch on the stake­holder agen­das that float through fu­sion cen­ter in­for­ma­tion re­quests via pub­lic records re­quests.

Perhaps the great­est ef­fec­tive in­ter­ven­tion comes from its fund­ing struc­ture. Though the core hub” of fu­sion cen­ters come from fed­eral grants, the spe­cific pro­grams of a fu­sion cen­ter are funded more in­di­vid­u­ally, com­ing from grants that fo­cus on do­mains in­clud­ing ed­u­ca­tion, health, and neigh­bor­hoods. Such pro­grams pro­mote a model of com­mu­nity well­ness that re­lies on po­lice en­force­ment. And fi­nally, pre-empt­ing the cre­ation of such cen­ters in the first place might be the most ef­fec­tive in­ter­ven­tion with these cen­ters.

Discussion

The lo­ca­tion of this fu­sion cen­ter rep­re­sents a fo­cal point of in­fra­struc­ture and power. What is be­ing melded to­gether at these fu­sion cen­ters? Fusion cen­ters popped up in the years af­ter 9/11, par­tic­u­larly from 2003 – 2007, from an in­fu­sion of home­land se­cu­rity grants. This mar­riage be­tween fed­eral agen­cies in­clud­ing the CIA, FBI, Homeland Security and other fed­eral bu­reaus brings a level of na­tional scrutiny to the lo­cal level, with in­di­vid­ual re­port­ing made pos­si­ble through the Nationwide Suspicious Activity Reporting (SAR) ini­tia­tive. This re­sulted in two European busi­ness­men be­ing re­ported for looking sus­pi­cious” on the Washington State Ferry in 2007.

You Don't Love systemd Timers Enough

blog.tjll.net

«

You Don’t Love sys­temd Timers Enough

5 May, 2026

2,139 words

9 minute read time

My fa­vorite metonymic tech­nol­ogy term is cron job”: even though cron may not lit­er­ally be the dae­mon that ex­e­cutes ac­tions on a sched­ule, we ap­ply the term to any­thing that walks like a cron and quacks like a cron. As Patrick McKenzie likes to point out, cron jobs are one of the most em­i­nently use­ful com­put­ing prim­i­tives. They of­fer util­ity that’s al­most im­me­di­ately ob­vi­ous for plenty of use cases that al­most every­body has: do this every day; do that once a month.

And yet. You prob­a­bly should­n’t use lit­eral cron (or its more mod­ern cousins) for sched­uled tasks! In 2026 there are more mod­ern op­tions avail­able, and my fa­vorite is the hum­ble sys­temd timer. I love sys­temd timers. If you don’t love them yet, maybe I can show you the rea­sons why you should love them, too.

My cron? Cooked?

A sys­temd timer is a type of unit that sched­ules other units (usually a ser­vice) on a par­tic­u­lar sched­ule. (How a sys­temd ser­vice unit works is an­other ar­ti­cle, but you can log­i­cally con­sider the .service tar­get of a sys­temd timer to be a script.) Timers are ef­fec­tively a func­tional re­place­ment for a tra­di­tional cron dae­mon (though you could con­ceiv­ably run both), and timer cal­en­dar set­tings of­fer some sim­i­lar­i­ties to help bridge the gap from tra­di­tional cron-like ex­pres­sions.

At this point the sys­temd haters peer out of the wood­work in an­tic­i­pa­tion of tor­pe­do­ing timers be­cause they are part of the sys­temd pro­ject and be­cause they re­place ma­ture (if clunky) tech­nol­ogy. I’d rather not spend our time ar­gu­ing about cron, so briefly con­sider why newer so­lu­tions like sys­temd timers that ben­e­fit from years of hind­sight are bet­ter:

Ambiguous $PATH set­tings make cron script ex­e­cu­tion dif­fi­cult to pre­dict.

std­out and stderr out­put of­ten ends up in a black hole (and, of­ten, sent to the host’s mail sys­tem, which is usu­ally not what you want to hap­pen.)

Execution his­tory is dif­fi­cult to fol­low and in­ter­ro­gate.

You might feel cool know­ing the sched­ul­ing gram­mar by heart, but 01,31 04,05 1 – 15 1,6 * is­n’t easy or in­tu­itive for hu­mans to read.

Incidentally, timers solve all these prob­lems (and more.)

Prime Time for a Timer Primer

We can cover the ba­sics with­out a lot of cer­e­mony. First you need a tar­get for a timer to ex­e­cute. On a Linux host with sys­temd op­er­a­tional, plac­ing the fol­low­ing unit con­tents at /etc/systemd/system/roulette.service in­stalls a ser­vice with a 1 in 10 chance to be free (i.e., shut down your com­puter):

Systemd

Font used to high­light strings.

Font used to high­light key­words.

Font used to high­light type and class names.

[Unit] Description=1 in 10 chance to break your chains

[Service] ExecStart=/usr/bin/env bash -c [[ $(($RANDOM % 10)) == 0 ]] && sys­tem­ctl poweroff || echo LIVE ANOTHER DAY

Update: [2026 – 05-05 Tue]

Twitter mu­tual HSVSphere points out that the ser­vice op­tion ExecCondition= of­fers a na­tive way to han­dle con­di­tional ex­e­cu­tion. This is a more tightly-in­te­grated way to ex­press should I con­tinue to ex­e­cute?” and I agree that it of­fers a clearer way to ex­press in­tent at the unit level (I’m us­ing ab­solute paths here for a NixOS sys­tem):

Systemd

Font used to high­light strings.

Font used to high­light key­words.

Font used to high­light type and class names.

[Unit] Description=1 in 10 chance to break your chains

[Service] ExecCondition=/run/current-system/sw/bin/bash -c [[ $(($RANDOM % 10)) == 0 ]]’ ExecStart=/run/current-system/sw/bin/systemctl poweroff

This has the same ef­fect as the prior bash con­di­tional, and you end up with dif­fer­ent word­ing in the jour­nal that (in my opin­ion) ex­presses the sit­u­a­tion more clearly for you when the con­di­tion is met:

May 05 11:05:32 diesel sys­temd[3117]: Condition check re­sulted in 1 in 10 chance to break your chains be­ing skipped.

In gen­eral, lean­ing into the op­tions that sys­temd pre­sents is a bet­ter ex­pe­ri­ence than script­ing your own. (Another ex­am­ple would be to use OnFailure= to re­act when your ser­vice scripts fail or Restart= to at­tempt re­cov­ery in the case of ephemeral fail­ures.)

Associate that ser­vice with a timer by plac­ing a file with the same file stem (roulette) at /etc/systemd/system/roulette.timer:

Systemd

Font used to high­light key­words.

Font used to high­light type and class names.

[Unit] Description=impending de­struc­tion

[Timer] OnCalendar=10:00

[Install] WantedBy=timers.target

What I mean by as­so­ci­ate is that, by de­fault, a timer’s Unit= set­ting will choose a ser­vice unit with a match­ing stem suf­fixed by .service. In this case, roulette.ser­vice. You can al­ways change this if you want to ex­e­cute a ser­vice with a dif­fer­ent unit name.

I want to call out a few things right away:

Per nor­mal ser­vice unit se­man­tics, the ExecStart= tar­get does not run as a shell com­mand by de­fault. You should treat the ab­solute path tar­get like a script or, in our case, an in­ter­preter that ex­pects a script as a string ar­gu­ment. For ex­am­ple, ExecStart=/usr/bin/echo Hello | /usr/bin/awk straight-up won’t work; the pipe makes no sense in con­text here.

The ExecStart= ar­gu­ment does not in­herit any en­vi­ron­ment vari­ables by de­fault (outside of some sys­tem man­ager de­faults), so we be­gin with a pretty bare $PATH by de­fault. Executing /usr/bin/env is a short­cut to en­sure things like sys­tem­ctl are avail­able, but out of the box, you get a clean state to be­gin with. If we had used a bare ExecStart=/usr/bin/bash, we’d have the ba­sics in $PATH, but us­ing env here is an ex­tra safe­guard.

You can roll the dice with­out the aid of the timer at all:

shell

sys­tem­ctl start roulette

Although note that you can­not en­able this ser­vice with­out any us­able [Install] sec­tion: our timer is the canon­i­cal way to make the ser­vice run in a con­sis­tent way. Also use­ful to high­light that sys­tem­ctl op­er­ates on roulette.ser­vice by de­fault with­out any ex­plicit suf­fix.

When ap­plied to a .timer unit, the sys­tem­ctl start sub­com­mand puts it on the clock, per se, but does not ac­tu­ally ex­e­cute the Unit= tar­get.

shell

sys­tem­ctl start roulette.timer

The timer is now ac­tive, but not the ser­vice.

Depending on the mo­ment in time, sta­tus will tell you when to next ex­pect the timer to de­cide your fate:

shell

sys­tem­ctl sta­tus roulette.timer

You’ll see plenty of in­for­ma­tion about the timer on its sta­tus page, in­clud­ing the next time it’ll fire:

Trigger: Sat 2026 – 04-18 10:00:00 MDT; 35min left

That’s the sim­plest timer on­board­ing: cre­ate a tar­get, place the tar­get ser­vice file along­side a timer with a sched­ule, and start the timer (not the tar­get) to get the sched­ule started. Because the .timer de­fines an WantedBy= within [Install], we can en­sure the timer comes up at boot time too, not just when we start it:

shell

sys­tem­ctl en­able roulette.timer

Let’s move on past the ba­sics.

Time Lord

Arguably the most im­por­tant bit of in­for­ma­tion about timers is how to ex­press a sched­ule, whether a re­peat­ing pe­riod of time (which the man­ual usu­ally refers to as a time span) ver­sus a cal­en­dar event (or a time­stamp). Fortunately, I think the man page for this un­der sys­temd.time(7) is ac­tu­ally very good with plenty of ex­am­ples. You should use it as the first re­source when writ­ing timers; it’s good (or bet­ter) than, uh, ca­sual blog posts by ca­sual writ­ers.

sys­temd also ships with a com­mand-line tool called sys­temd-an­a­lyze which in­cludes the abil­ity to val­i­date and ex­plain time ex­pres­sions from the com­mand line di­rectly in an im­per­a­tive way to help un­der­stand them. You can even dis­am­biguate the clas­sic wild­card cron ex­pres­sion which sys­temd-an­a­lyzer can parse and then ex­plain to you, com­plete with the ex­pected ex­e­cu­tion times:

shell

sys­temd-an­a­lyze cal­en­dar *-*-* *:*:*’

Normalized form: *-*-* *:*:* Next elapse: Sat 2026 – 04-18 16:44:26 MDT (in UTC): Sat 2026 – 04-18 22:44:26 UTC From now: 431ms left

This blog post is not the place to re­pro­duce the en­tirety of sys­temd.time(7) ver­ba­tim, so I en­cour­age you to Read The Helpful Manual (RTHM). Writ small, you can pretty sim­ply de­fine ei­ther a re­cur­ring wall­clock pe­riod or, in con­trast to plain old cron, a re­cur­ring pe­riod of time against some pre­vi­ous event.

The first cat­e­gory of time ex­pres­sions is easy to en­vi­sion. For ex­am­ple, in fully-qual­i­fied form, daily means:

*-*-* 00:00:00 │ │ │ │ │ ╰── at sec­ond 00 │ │ │ │ ╰───── at minute 00 │ │ │ ╰──────── at hour 00 │ │ ╰────────── every day │ ╰──────────── every month ╰────────────── every year

You can use short­hand terms like daily, write out the com­plete form, or use any other sup­ported value listed out in sys­temd.time(7) and sub­se­quently val­i­date your as­sump­tions against sys­temd-an­a­lyze.

The sec­ond cat­e­gory of time ex­pres­sions ap­ply to run this rel­a­tive to some other event.” This dis­tinc­tion from run at the same time very day” is very of­ten what you ac­tu­ally want. Consider a job that clears out a tem­po­rary di­rec­tory, for ex­am­ple: if a cron ex­pres­sion lapsed right af­ter boot, there prob­a­bly is­n’t much to clean out of /tmp at all. But if you en­code execute an hour af­ter my com­puter has started and then every hour af­ter that”, the sched­ule logic is mean­ing­ful for what the re­lated ser­vice is ac­tu­ally do­ing.

This is easy to do in a timer:

Systemd

Font used to high­light key­words.

Font used to high­light type and class names.

[Timer] OnBootSec=1h OnUnitActiveSec=1h

That is: run an hour af­ter the ma­chine starts” (which will ex­e­cute once) and also run one hour af­ter my Unit= runs” (which im­plic­itly makes the timer re­peat in­def­i­nitely.)

Periodic time spans like this fit the every once in a while” use case sur­pris­ingly more of­ten than run at this minute every hour” and sim­i­lar ex­pres­sions. Another good ex­am­ple is a timer I use every December to poll the Advent of Code API for a Slack bot I wrote for some friends. The */15 cron ex­pres­sion hon­ors the every 15 min­utes” pol­icy that their API re­quests, but since that’s the eas­i­est way to ex­press it in cron lan­guage, I’m sure it makes spiky traf­fic along­side every­one else polling the API! Starting my timer when I’ve made a code fix that runs when­ever 15 min­utes has lapsed is all I care about, and prob­a­bly cre­ates less of a thun­der­ing herd prob­lem.

Calendar ver­sus time span units is prob­a­bly the biggest con­cep­tual leap from a tra­di­tional cron job, but timers of­fer more, too.

Bird’s-Eye Countdown

My fa­vorite high-level com­mand to get a pic­ture of a ma­chine’s timer sit­u­a­tion is the list-timers sub­com­mand. Here’s my host’s sum­mary:

shell

sys­tem­ctl list-timers

NEXT LEFT LAST PASSED UNIT ACTIVATES Mon 2026 – 04-20 15:15:00 MDT 1min 40s Mon 2026 – 04-20 15:00:05 MDT 13min ago zfs-snap­shot-fre­quent.timer zfs-snap­shot-fre­quent.ser­vice Mon 2026 – 04-20 15:32:16 MDT 18min Mon 2026 – 04-20 14:22:15 MDT 51min ago fwupd-re­fresh.timer fwupd-re­fresh.ser­vice Mon 2026 – 04-20 16:00:00 MDT 46min Mon 2026 – 04-20 15:00:05 MDT 13min ago logro­tate.timer logro­tate.ser­vice Mon 2026 – 04-20 16:00:00 MDT 46min Mon 2026 – 04-20 15:00:05 MDT 13min ago zfs-snap­shot-hourly.timer zfs-snap­shot-hourly.ser­vice Tue 2026 – 04-21 00:00:00 MDT 8h Mon 2026 – 04-20 09:43:22 MDT 5h 29min ago zfs-snap­shot-daily.timer zfs-snap­shot-daily.ser­vice Tue 2026 – 04-21 07:31:28 MDT 16h Sun 2026 – 04-19 20:15:47 MDT 7h ago sys­temd-tmp­files-clean.timer sys­temd-tmp­files-clean.ser­vice Mon 2026 – 04-27 00:00:00 MDT 6 days Mon 2026 – 04-20 09:43:22 MDT 5h 29min ago zfs-snap­shot-weekly.timer zfs-snap­shot-weekly.ser­vice Mon 2026 – 04-27 01:09:27 MDT 6 days Mon 2026 – 04-20 09:43:22 MDT 5h 29min ago fstrim.timer fstrim.ser­vice Mon 2026 – 04-27 04:28:38 MDT 6 days Mon 2026 – 04-20 09:43:22 MDT 5h 29min ago zpool-trim.timer zpool-trim.ser­vice Fri 2026 – 05-01 00:00:00 MDT 1 week 3 days Wed 2026 – 04-01 10:07:51 MDT 1 week 1 day ago zfs-snap­shot-monthly.timer zfs-snap­shot-monthly.ser­vice Fri 2026 – 05-01 03:17:17 MDT 1 week 3 days Wed 2026 – 04-01 10:07:51 MDT 1 week 1 day ago zfs-scrub.timer zfs-scrub.ser­vice

11 timers listed. Pass –all to see loaded but in­ac­tive timers, too.

From one com­mand you glean a to­tal pic­ture of any­thing ex­e­cut­ing on a timer sched­ule. Very use­ful.

list-timers is part of a fam­ily of sys­temd sub­com­mands that I use fairly of­ten. Others that are use­ful in­clude list-units and list-paths (the lat­ter is a more re­cent ad­di­tion to sys­tem­ctl.)

Suspended Reanimation

Waking a sus­pended sys­tem to run an im­por­tant script even if you’re not around to per­form the phys­i­cal ac­tion of, say, lift­ing a lap­top lid sounds like a daunt­ing feat un­til you find WakeSystem=:

WakeSystem= Takes a boolean ar­gu­ment. If true, an elaps­ing timer will cause the sys­tem to re­sume from sus­pend, should it be sus­pended and if the sys­tem sup­ports this. …

You can imag­ine the util­ity for some­thing like this. On a dis­tri­b­u­tion that sup­ports down­load­ing pack­age up­dates be­fore us­ing them (like Arch or NixOS, for ex­am­ple), you can pre-fetch up­date pack­ages late a night for morn­ing up­dates when you’re at a key­board, and there are plenty of other ideas you could ap­ply this too as well. The man page high­lights that you’ll need to man­u­ally re-sus­pend if you in­tend for that to hap­pen af­ter your .service is done.

Splay-away

I touched on the thun­der­ing herd prob­lem a few para­graphs ago, which is the sys­tems prob­lem of, what hap­pens when a set of processes all wake up at the same time?” If every Debian sys­tem in the world were hard-coded to apt up­date at 00:00:00, mid­night would be a bad, spiky time for every­one.

Two timer op­tions called FixedRandomDelay= and RandomizedOffsetSec= help:

FixedRandomDelay= Takes a boolean ar­gu­ment. When en­abled, the ran­dom­ized de­lay spec­i­fied by RandomizedDelaySec= is cho­sen de­ter­min­is­ti­cally, and re­mains sta­ble be­tween all fir­ings of the same timer, even if the man­ager is restarted. …

RandomizedOffsetSec= Offsets the timer by a sta­ble, ran­domly-se­lected, and evenly dis­trib­uted amount of time be­tween 0 and the spec­i­fied time value. …

I’ve used this for real sys­tems that check in to up­date soft­ware. Not only does it help with thun­der­ing herd prob­lems, but spread­ing out ex­e­cu­tion along a uni­form dis­tri­b­u­tion en­sures that the be­hav­ior is con­sis­tent and avoids dis­rup­tive ac­tiv­i­ties like restart­ing dae­mons that may be co­or­di­nat­ing dis­trib­uted ser­vices.

In gen­eral, tim­ing op­tions are very con­fig­urable and ex­pose a great deal of gran­u­lar­ity (again, all of which are ex­plained in the man page.)

BYD

www.lumafield.com

Design to Reality

Evolution of the Plastic Bottle

In the dark nights of my soul, I fret about how in­con­sis­tently en­gi­neered my life is. The cof­fee table I made a year or two ago was in­tended to look like the din­ing room table I built a few years ear­lier, but in re­al­ity the two bear only a vague re­sem­blance to each other. Open a drawer of my tool chest at ran­dom, and per­haps you’ll find a the­mat­i­cally-aligned col­lec­tion of well-loved hand tools, metic­u­lously cut into a nest of Kaizen foam, or maybe you’ll find a ran­dom as­sort­ment of half-for­got­ten spe­cialty wrenches. My book­shelf is nicely sorted and stacked, but my mag­a­zines are dumped into a bas­ket this way and that. We man­age to in­vest em­bar­rass­ing amounts of en­gi­neer­ing and in­fra­struc­ture into phys­i­cal ob­jects that are barely worth men­tion­ing. So when I look out at the world out­side of my own home, I am re­as­sured to find that even our most dis­pos­able ob­jects are the re­sult of stag­ger­ing quan­ti­ties of se­ri­ous and earnest en­gi­neer­ing work. You’ve got to give it to hu­man­ity: We don’t just put all of our de­sign cy­cles on the big, im­pres­sive pro­jects—pyra­mids, bridges, and semi­con­duc­tor fabs. No: We man­age to in­vest em­bar­rass­ing amounts of en­gi­neer­ing and in­fra­struc­ture into phys­i­cal ob­jects that are barely worth men­tion­ing. Stuffed an­i­mals, given away as car­ni­val prizes, are the ben­e­fi­cia­ries of un­told lo­gis­ti­cal and sup­ply-chain man­age­ment ef­forts. A pair of panty­hose might con­tain ma­te­ri­als that re­quired eight or nine fig­ures’ worth of R&D work to de­velop. A plas­tic wa­ter bot­tle, whose en­tire us­able lifes­pan is mea­sured in sec­onds, is the re­sult of decades upon decades of en­gi­neer­ing across a range of func­tions. From glass to plas­tic I stand up, put on my shoes, and walk over to the gro­cery store. The walk to the gro­cery store takes maybe 120 sec­onds, and I walk it about once a day. I rec­og­nize that this is ab­surdly fre­quent and revel in treat­ing the gro­cery store as an ex­ten­sion of my pantry. Today, I get ketchup and crack­ers then scoot around to the dairy aisle for un­salted but­ter. Walking past the bot­tled wa­ter I pause—the se­lec­tion there is hon­estly in­cred­i­ble, a lit­tle Darwinian com­pe­ti­tion play­ing out on the shelves. I stand there, reg­is­ter­ing the dif­fer­ent phe­no­types and think­ing about how each species and sub-species of wa­ter bot­tle evolved. A guy in his thir­ties reaches in front of me to grab a gal­lon-sized jug of Poland Spring from the shelf. I make room for him, con­sider my op­tions, and for some rea­son end up with a liter each of Pellegrino, Evian, and Smartwater. As weird as it sounds, wa­ter from the Evian source was bot­tled in earth­en­ware jugs from 1826 all the way un­til 1908. Glass and glass­blow­ing were not all that re­li­able in the belly of the nine­teenth cen­tury, but around the turn of the twen­ti­eth, glass tech­nol­ogy had trick­led down from lenses and light­bulbs to pro­lif­er­ate within bev­er­age pack­ag­ing. If you were start­ing a bot­tling com­pany in 1900, you prob­a­bly started in glass. Coca-Cola was first bot­tled (in glass) in 1899, the same year that Pellegrino, with their dis­tinc­tive green glass bot­tle, was founded. Evian switched to glass in 1908. Coke’s acry­loni­trile mis­ad­ven­ture While syn­thetic plas­tics were first de­vel­oped in the 1880s, and Dustin Hoffman was get­ting lec­tured about the ma­te­ri­al’s busi­ness po­ten­tial in 1967, it was­n’t un­til the mid-’70s that food-safe (or at least vaguely food-com­pat­i­ble) for­mu­la­tions be­gan to roll out. One of the most no­table of these was acry­loni­trile copoly­mer, which was brought to mar­ket in the form of Coca-Cola’s Easy-Goer” bot­tle in 1975. Coke’s acry­loni­trile bot­tles lasted less than two years on the mar­ket. From an en­gi­neer­ing per­spec­tive, acry­loni­trile copoly­mer was a great fit for soda bot­tles. It was trans­par­ent, tough, and im­per­vi­ous to gas. Coca-Cola ex­ec­u­tives touted its environmental ad­van­tages” (namely its lower shipped weight) and its re­sis­tance to biodegra­da­tion, claim­ing that the bot­tles, which were man­u­fac­tured by Monsanto, would cost essentially the same as glass.” Pepsi, who had also been work­ing on plas­tic bot­tles, fumed on the side­lines. While Coke was camped out at a ho­tel launch­ing the Easy-Goer, Pepsi held a com­pet­ing PR event, down the hall at the same ho­tel, to un­veil a cham­pagne from the Soviet Union.” The short ca­reer (1975 – 1977) of Coke’s Monsanto-designed Easy-Goer acry­loni­trile bot­tle. This au­thor was un­able to de­fin­i­tively iden­tify im­agery of Pepsi’s Soviet cham­pagne, but this state-owned Russian site seems to in­di­cate it was Nazdorovya. The Easy-Goer bot­tles were, to my taste, a bit on the chunky side. Coke’s acry­loni­trile bot­tles lasted less than two years on the mar­ket. It turns out acry­loni­trile bot­tles will leach acry­loni­trile into what­ever liq­uids they con­tain; fur­ther­more, test an­i­mals who were fed large amounts of acry­loni­trile in their drink­ing wa­ter” de­vel­oped significantly lower body weight and other ad­verse ef­fects, in­clud­ing le­sions in the cen­tral ner­vous sys­tem and growths in the ear ducts.” The FDA banned acry­loni­trile bev­er­age con­tain­ers in March of 1977; Monsanto sued and lost; Coke looked to other ma­te­ri­als. Injection Stretch Blow Molding (ISBM) Here’s how most plas­tic bev­er­age bot­tles are made to­day: A bot­tle pre­form, also known as a pari­son, is typ­i­cally in­jec­tion-molded out of PET. The pre­form looks kind of like a test tube, with threads at its mouth and a disc-like col­lar just be­low. Its walls are thick. Maybe it’s stored for a while, still de­void of cap, but even­tu­ally it’s in­stalled onto a stretch blow mold­ing ma­chine where it’s heated, stretched length­wise in­ter­nally with a metal rod, and in­jected with com­pressed air, blow­ing up rapidly like a bal­loon be­fore be­ing cooled and spat out. The same pre­form might be blown into a va­ri­ety of dif­fer­ent bot­tle de­signs, each with dif­fer­ent vol­umes and wall thick­nesses and de­sign de­tails, but their thread pro­files and necks will re­main iden­ti­cal to the pre­form from which they were made. Coke’s Easy-Goers had metal caps, but to­day vir­tu­ally all plas­tic bot­tles are also capped in plas­tic. Plastic caps are in­jec­tion or com­pres­sion molded, with their tam­per-ev­i­dent rings at­tached. The in­jec­tion molds are hon­estly beau­ti­ful—pol­ished, multi-part as­sem­blies, with twelve or twenty-four or forty-eight caps all be­ing molded at the same time. Watching caps be­ing com­pres­sion molded, mean­while, is mes­mer­iz­ing: semi-soft blobs of plas­tic goop be­ing ex­truded, cut, and squished into a ro­tat­ing tool that then dumps a fin­ished cap as­sem­bly off of its back­side. Either way, when caps meet their bot­tles the bot­tles will have been filled with some fluid, and in some cases pres­sur­ized with car­bon diox­ide gas (for that bub­bly siz­zle) or liq­uid ni­tro­gen (for struc­tural and preser­v­a­tive rea­sons). This all hap­pens at stag­ger­ingly high speed, dozens of bot­tles per sec­ond, tens of thou­sands of bot­tles per hour, frankly un­fath­omable num­bers of bot­tles per day. Injection stretch blow mold­ing forms bot­tles in two stages: a heated PET pre­form is stretched and blown in­side a mold, align­ing the poly­mer chains to cre­ate a light­weight con­tainer with high strength and clar­ity. The rise of PET Again, I’m struck by the stu­pidly ob­vi­ous fact that hu­man be­ings in­vented all of this stuff. Real peo­ple, with dreams and fears and fam­i­lies to sup­port, spent big chunks of their lives in­vent­ing not only the bev­er­age pack­ag­ing it­self but the ma­chin­ery re­quired to make, fill, cap, and pack­age these un­fath­omable num­bers of bot­tles. Disposable wa­ter bot­tle en­gi­neer­ing is a ca­reer path that you could choose, and if you did choose it then you would not be alone in hav­ing done so. While Monsanto had been toil­ing away on their yet-un­proven acry­loni­trile copoly­mer bot­tles, there was an en­tirely dif­fer­ent group, at DuPont, work­ing on poly­eth­yl­ene tereph­tha­late. Even more in­cred­i­ble is the fact that some of Dustin Hoffman’s con­tem­po­raries—in­deed lots of them—chose ca­reers in plas­tic bot­tle en­gi­neer­ing, even be­fore plas­tic bot­tles had been proven vi­able. While Monsanto had been toil­ing away on their yet-un­proven acry­loni­trile copoly­mer bot­tles, there was an en­tirely dif­fer­ent group, at DuPont, work­ing on poly­eth­yl­ene tereph­tha­late. Polyethylene Terephthalate, PET.” So many eth­yl­enes! Take a bunch of gaseous eth­yl­ene mol­e­cules, and cat­alyze them with metal salts such that they form long, cater­pil­lar-like solid mol­e­cules, with each seg­ment con­tain­ing one car­bon atom and two hy­dro­gen atoms. In this form, bulk poly­eth­yl­ene can be in­cred­i­bly strong and durable, es­pe­cially when the cater­pil­lar-like mol­e­cules get re­ally long. (Ultra-high-molecular-weight poly­eth­yl­ene, whose chained-to­gether eth­yl­enes can be hun­dreds of thou­sands of units long, has yield strengths com­pa­ra­ble to steel—at dra­mat­i­cally lower den­si­ties. Lots of high-end sail­ing rig­ging is made from this stuff, and also ul­tra­light camp­ing gear.) Polyethylene is also en­vi­ron­men­tally sta­ble, op­ti­cally clear, and does­n’t, like acry­loni­trile, leach into food or bev­er­ages that it’s put into con­tact with. People have been cat­alyz­ing poly­eth­yl­ene this way for about 75 years now, and be­cause of its re­mark­able phys­i­cal prop­er­ties, we now make more of the stuff than any other poly­mer; to­day, global an­nual poly­eth­yl­ene pro­duc­tion is some­thing on the or­der of a hun­dred mil­lion met­ric tons—equiv­a­lent in mass to al­most eight years’ worth of New York City’s solid trash pro­duc­tion. Within two years of the Easy-Goer’s down­fall, DuPont was in full pro­duc­tion, mak­ing two-liter PET bot­tles for the Coca-Cola com­pa­ny’s caramel-col­ored sugar wa­ter. I can just imag­ine the ex­cite­ment at DuPont’s poly­eth­yl­ene team when the FDA put an end to Coke’s acry­loni­trile ad­ven­tures. DuPont had been work­ing on soda bot­tles since at least 1967, when Nathaniel Wyeth (a DuPont engineering fel­low” who was also the other brother of painter Andrew Wyeth) be­gan tin­ker­ing with polypropy­lene. By this time the younger Wyeth had a paint­ing in the per­ma­nent col­lec­tion at MoMA; I imag­ine Nathaniel, the less fa­mous Wyeth, crawl­ing around in the chem­i­cal weeds, grasp­ing for some way to make his own name. Finally he found his path through the un­der­growth: A hollow ther­mo­plas­tic ar­ti­cle,” which he patented in 1973. Within two years of the Easy-Goer’s down­fall, DuPont was in full pro­duc­tion, mak­ing two-liter PET bot­tles for the Coca-Cola com­pa­ny’s caramel-col­ored sugar wa­ter. Wyeth’s 1990 obit­u­ary show­cases his in­ven­tion of the now-ubiq­ui­tous PET plas­tic soda bot­tle. Source: New York Times. I ac­tu­ally re­mem­ber these bot­tles from the birth­day par­ties of my youth. Produced from the late 70s un­til the early 90s, the first gen­er­a­tion of enor­mous PET bev­er­age con­tain­ers, with their opaque, glued-on bases, arose in tan­dem with the soda in­dus­try’s shift to high fruc­tose corn syrup. Both New” Coke and Crystal” Pepsi were pack­aged in these thick-walled, two-liter bot­tles, our par­ents us­ing two hands to pour them into our trem­bling plas­tic cups. These bot­tles were totems to American ex­cess, their con­tents slowly go­ing flat in the fridge if they weren’t spilled all over the din­ing room table first. Looking back at these beefy con­tain­ers, one can’t help but feel that it’s all too much. Too much sugar, too much plas­tic, too much overt prod­uct place­ment in our hol­i­day movies. The walls on Coke’s early two-liter bot­tles were around 0.3 to 0.4 mm thick, and their glued-on bases (which were nec­es­sary be­cause the bot­tles them­selves had round bot­toms—good for re­sist­ing in­ter­nal pres­sure, but ter­ri­ble at stand­ing up­right) mea­sured up to 0.6 mm. As a re­sult, the to­tal mass of an empty two-liter bot­tle was up to 96 grams—ex­actly dou­ble that of mod­ern two-liter bot­tles. This was, from to­day’s stand­point, a low-vol­ume prod­uct, not re­ally op­ti­mized for cost or trans­porta­tion. The bev­er­age in­dus­try had fig­ured out how to get the pub­lic to buy their drinks in dis­pos­able plas­tic bot­tles, but they had­n’t fig­ured out how to ef­fi­ciently pro­duce and sell bil­lions of them every year. Industrial CT scans show a re­duc­tion in wall thick­ness that al­lowed pack­ag­ing en­gi­neers to cut the to­tal mass of the 2L bot­tle in half since the in­tro­duc­tion of PET bev­er­age bot­tles. For more on the orig­i­nal vs. pre­sent day Coke bot­tle, check out Scan of the Month. But you can be sure that cor­po­rate chem­i­cal en­gi­neers (and mar­keters) were work­ing hard on just that prob­lem. By the early 1990s, both Coke and Pepsi fig­ured out just what bev­er­age they could sell us bil­lions of dis­pos­able plas­tic bot­tles of. The so­lu­tion did­n’t come from a moun­tain spring, or a Soviet vine­yard, or the con­cen­trated car­bo­hy­drates ex­tracted from in­dus­tri­ally-farmed corn. No, the killer ap­pli­ca­tion for the dis­pos­able plas­tic bot­tle in­dus­try was a mu­nic­i­pal wa­ter tap in Wichita, Kansas. Bottled wa­ter boom Looking back on it now, the bot­tled wa­ter boom feels like a ridicu­lous—yet un­der­stand­able—evo­lu­tion of our early 90s milk-car­tons-and-two-liter-soda-bot­tles cul­ture. The signs were there in 1992, when af­ter a bid­ding war, Nestlé ac­quired Perrier, gain­ing not only the dis­tinc­tively bub­bly French brand but also Poland Spring, Arrowhead, and Great Bear in the same trans­ac­tion. Then in 1994, Pepsi in­tro­duced Aquafina, with its clear half-liter bot­tles and un­re­mark­able brand­ing sketch­ing out the de­cid­edly mid­dle­brow aes­thetic that would de­fine the emerg­ing mass-mar­ket bot­tled wa­ter in­dus­try. Not to be left be­hind, Coke launched Dasani (a di­rect com­peti­tor to Aquafina, al­beit with slightly more dis­tinc­tive brand­ing) in 1999. These brands’ yup­pie ap­peal never re­ally spoke to me per­son­ally; they felt gauche, cor­po­rate, su­per­flu­ous. But I do re­call buy­ing bot­tles of Vitaminwater (the Glacéau-owned sis­ter-brand to Smartwater) and think­ing of my­self (then a teenager) as so­phis­ti­cated, and vaguely alternative.” This feel­ing lasted roughly un­til the pre­cise mo­ment when Glacéau was ac­quired by Coca-Cola, in May of 2007. In the years that fol­lowed I pur­chased their prod­ucts only in times of dis­tress. Today’s light­weight half-liter wa­ter bot­tles use 75% less plas­tic than those on the mar­ket in the mid-2000s. Regardless of my own feel­ings, I must ad­mit that brands like Aquafina, Dasani, and Smartwater did good work in help­ing Pepsi and Coke re­place their de­clin­ing soda sales in the late 90s and the early 00s. They also gave the soda gi­ants an op­por­tu­nity to re­ally cost-en­gi­neer their bot­tling op­er­a­tions, tweak­ing their bot­tle and cap de­signs to re­duce mass and shorten man­u­fac­tur­ing cy­cle times. Petaloid” bot­tle bases, which came to promi­nence in the 90s, elim­i­nated the need for glued-on bases—re­duc­ing ma­te­r­ial us­age while dis­trib­ut­ing stress more evenly across the bot­tle’s walls. Thinner bot­tle walls (Aquafina’s were around .2 mm) and shorter caps meant faster bot­tle pro­duc­tion; spi­ral rib­bing on the bot­tles’ walls meant that they could be stacked higher and would re­sist dam­age dur­ing ship­ping. Dasani- and Aquafina-branded vend­ing ma­chines, stocked by ex­ist­ing soft drink dis­trib­u­tors, kept prod­ucts mov­ing through sup­ply chains ef­fi­ciently. Eventually, many wa­ter bot­tlers—Coke, Pepsi, Evian, Nestlé—switched por­tions of their pro­duc­tion to 100% re­cy­cled poly­eth­yl­ene, which has proven to be durable, com­mer­cially de­sir­able, and food-safe. Lightweighting and ef­fi­ciency Once bot­tled wa­ter proved it­self as a high-vol­ume con­sumer prod­uct, its vari­a­tions pro­lif­er­ated. Look in al­most any bev­er­age sec­tion, in any store in the US, and you’ll find wa­ter pack­aged not only in PET bot­tles but also in glass, alu­minum cans, and multi-lay­ered pa­per­board boxes. My tiny ur­ban gro­cery store al­lo­cates about as much shelf space to bot­tled wa­ter as they do to bread. Even tiny, outer-bor­ough NYC bode­gas usu­ally carry broad ar­rays of bot­tled wa­ter brands, many of which are shipped in from halfway around the world. Niagara (a pri­vately-held com­pany with around 7,500 em­ploy­ees work­ing in more than a dozen bot­tling fa­cil­i­ties) claims to have re­duced the amount of plas­tic in their half-liter bot­tle by 60% since 1998, with sim­i­larly im­pres­sive re­duc­tions in their car­bon foot­print. As the mar­ket evolved, a stag­ger­ing amount of work was done to re­duce the mass of com­mod­ity-grade dis­pos­able wa­ter bot­tles. Today, even white-la­beled wa­ter bot­tles—bland, bot­tom-of-the-bar­rel brands, mostly de­void of char­ac­ter and sold only in racks of twenty-four or greater—ben­e­fit from decades upon decades of op­ti­miza­tion. An ex­cel­lent ex­am­ple of this is the Niagara Eco-Air” half-liter bot­tle, vari­a­tions of which are sold un­der house-la­bel brands like Walgreens’ Nice!, Costco’s Kirkland, and Albertson’s Signature Select. Niagara (a pri­vately-held com­pany with around 7,500 em­ploy­ees work­ing in more than a dozen bot­tling fa­cil­i­ties) claims to have re­duced the amount of plas­tic in their half-liter bot­tle by 60% since 1998, with sim­i­larly im­pres­sive re­duc­tions in their car­bon foot­print. Flimsy in the hand even when full of wa­ter, their bot­tles have wall thick­nesses of less than 0.17 mm. PET bot­tles of­fer one of the most ef­fi­cient pack­ag­ing-to-prod­uct ra­tios, com­bin­ing min­i­mal ma­te­r­ial use with strong pro­tec­tion and prod­uct safety. Both the bot­tles and caps are fully re­cy­clable and con­tain no added BPA. Source: Niagara Bottling. Even so, these fly­weight bot­tles are sur­pris­ingly strong, their phys­i­cal prop­er­ties tuned to the needs of mod­ern lo­gis­ti­cal and com­mer­cial in­fra­struc­ture. Bottles like Niagara’s Eco-Air (which is sim­i­lar to Poland Spring’s half-liter bot­tle) are typ­i­cally shrink-wrapped into 32-bottle packs, which are then shipped hun­dreds or thou­sands of miles be­fore they’re dumped on our gro­cery stores’ load­ing ar­eas. These brick-like bun­dles of plas­ti­cized wa­ter are not han­dled with a ton of care en route, and in the case of my gro­cery store they’re piled in chest-high stacks near the check-out aisles. This is what man­u­fac­tur­ers like Niagara cares about: Their bot­tles need to be just strong enough to sur­vive the trip to my gro­cery store, and then the sub­se­quent jaunt to what­ever block party or school potluck they might be ripped open at. Because once their caps are un­screwed, these bot­tles’ half-lives are mea­sured in sec­onds. Recycling and reuse Half-liter bot­tles like the Eco-Air are ubiq­ui­tous in my neigh­bor­hood. There are hun­dreds of them at each of the cor­ner stores within crawl­ing dis­tance of my stoop, and ad­di­tional dozens of them (emptied of their orig­i­nal con­tents, and then some­times filled with some­thing less re­fresh­ing) on the side­walks and curbs nearby. We are lucky if these bot­tles end up in land­fills; they cer­tainly end up in worse places much of the time. After I had drunk my liter of San Pellegrino straight from its green glass bot­tle, I tossed the bot­tle into the re­cy­cling bin with a con­fus­ing mix­ture of pride and shame. A few days later, the city’s Sanitation Department picked it up; I know from ex­pe­ri­ence that it was bound to be bro­ken up into lit­tle green glass chips at a trans­fer fa­cil­ity on the shore of the New York Harbor. But my crushed Pellegrino bot­tle is­n’t sorted into a big pile of pure green glass; it’s mixed with other col­ored glass, which is dif­fi­cult to sort into its con­stituent parts and can’t eas­ily be re-melted into new con­tain­ers. More or less use­less at that point, this mul­ti­col­ored melange is likely to be sold as fill ma­te­r­ial for an in­fra­struc­ture pro­ject—if it’s not land­filled di­rectly. What’s next for pack­ag­ing? It’s harder to say where the plas­tic bot­tles I pur­chased will end up. After drink­ing the Evian and the Smartwater, I found my­self re­fill­ing both of their PET bot­tles with NYC tap wa­ter, and over the fol­low­ing weeks I proudly—and re­peat­edly—lugged one or the other of them with me as I biked to the climb­ing gym, hop­ing se­cretly that some­one there would rec­og­nize them as some of the most pop­u­lar wa­ter con­tain­ers among the ul­tra­light hik­ing com­mu­nity But at some point even the luck­i­est and most long-lived poly­eth­yl­ene bot­tles will be trashed. But, who knows. If you wait around long enough, some­one’s bound to start work­ing on solv­ing that prob­lem too.

Quote of the day by Oracle co-founder Larry Ellison: "Citizens will be on their best behavior, because we’re constantly recording and reporting everything that is going on" — a dire warning on the erosion of privacy

www.techradar.com

Co-founder of Oracle, Larry Ellison, who serves as the cloud gi­ant’s CTO, has been part of the tech in­dus­try’s fur­ni­ture for decades now. Looking ahead, he pro­jects the rise of tech­nolo­gies such as AI, drones, and ad­di­tional mon­i­tor­ing sys­tems.

The mod­ern sur­veil­lance state

Ellison’s warn­ing came dur­ing an hour-long Q&A at an Oracle fi­nan­cial an­a­lyst meet­ing in September 2024.

Quote of the day

This ar­ti­cle is part of TechRadar Pro’s QOTD pro­ject to pro­vide an in­sight into the minds of the bright­est and most rec­og­nized fig­ures in the tech­nol­ogy in­dus­try to­day and in years gone by. Read the full se­ries here.

This world that Ellison de­scribes re­volves around AI tech­nolo­gies pro­cess­ing huge amounts of video footage from the ex­plo­sion of cam­eras in the streets, cars, front doors, and even po­lice of­fi­cers. AI will, he added, au­to­mat­i­cally re­port is­sues that it de­tects while it’s an­a­lyz­ing footage cap­tured in real time.

With so much op­por­tu­nity to scan and de­tect wrong­do­ing across so­ci­ety, and AI re­duc­ing the pro­cess­ing and de­ci­sion-mak­ing bur­den, Ellison posited that cit­i­zens will, in kind, re­spond by ad­just­ing their be­hav­ior. This vi­sion is eerily sim­i­lar to that George Orwell de­scribed in his novel Nineteen Eighty-Four, in which Big Brother over­saw the daily ac­tions of cit­i­zens.

Wrangling with an AI-fueled dystopia

The move­ment against AI play­ing a role in sur­veil­lance is vast, with plenty of com­men­tary and re­search iden­ti­fy­ing ways this is hap­pen­ing. There are, for ex­am­ple, con­cerns over the Department of Homeland Security (DHS) mon­i­tor­ing so­cial me­dia with AI used to scan and sum­ma­rize find­ings.

Other re­ports sug­gest that big com­pa­nies are en­gag­ing in work­place sur­veil­lance. Meta CEO Mark Zuckerberg, for ex­am­ple, re­cently ad­mit­ted on an em­ployee call that AI is be­ing used to study and process the day-to-day ac­tions of em­ploy­ees to gather data to train fu­ture mod­els and agents. It comes shortly af­ter re­ports that the com­pany will track clicks and key­strokes on de­vices.

Whether in the work­place — or so­ci­ety at large — the di­rec­tion of travel for the last cou­ple of decades has fa­vored in­creased mon­i­tor­ing and sur­veil­lance, with Ellison clearly con­cerned that emerg­ing tech­nolo­gies will sim­ply add more fuel to this fire.

Sign up to the TechRadar Pro newslet­ter to get all the top news, opin­ion, fea­tures and guid­ance your busi­ness needs to suc­ceed!

Keumars Afifi-Sabet is a free­lance con­trib­u­tor for Tech Radar and the Technology Editor for Live Science. He has writ­ten for a va­ri­ety of pub­li­ca­tions in­clud­ing ITPro, The Week Digital and ComputerActive. He has worked as a tech­nol­ogy jour­nal­ist for more than five years, hav­ing pre­vi­ously held the role of fea­tures ed­i­tor with ITPro. In his pre­vi­ous role, he over­saw the com­mis­sion­ing and pub­lish­ing of long form in ar­eas in­clud­ing AI, cy­ber se­cu­rity, cloud com­put­ing and dig­i­tal trans­for­ma­tion.

Apple rejected my dictation app for using the accessibility API

www.mitmllc.com

I built WhisperPad be­cause I needed it. In the fall of 2024 the joints in my fin­gers started to hurt when I typed. Maybe the bill came due for spend­ing most of my life on a key­board: a child­hood of video games, then 10 years work­ing in tech. It got worse through­out the win­ter, and by early 2025, I could not type for sus­tained stretches with­out trig­ger­ing an un­sus­tain­able level of pain. It was a pro­gres­sive in­jury, so there was no sin­gle dra­matic mo­ment; just a slow nar­row­ing of how much I could do in a day.

That nar­row­ing ar­rived at an in­con­ve­nient time. I was be­tween jobs and try­ing to de­cide what came next, and I had landed on ap­ply­ing to a mas­ter’s pro­gram in hu­man-com­puter in­ter­ac­tion. My biggest fear about it was not whether I could keep up men­tally. It was whether my hands would let me pro­duce the work fast enough to keep pace.

What WhisperPad does (or did, any­way)

WhisperPad lives in your menu bar. You press a key­board short­cut, you talk, it tran­scribes what you said lo­cally on your Mac, and it places the text into what­ever field your cur­sor is in. Nothing is sent to a server. If you have clicked away by the time it fin­ishes, the text is on your clip­board and you can paste it wher­ever you want. That is the whole app. The point was to make get­ting words out of my head and into the com­puter cost as few hand move­ments as pos­si­ble.

In April, Apple re­jected an up­date to my Mac dic­ta­tion app, WhisperPad, un­der Guideline 2.4.5. Their po­si­tion was that I was us­ing the ac­ces­si­bil­ity API in a way that was­n’t an ac­ces­si­bil­ity use. The app ex­ists be­cause I have a hand in­jury. Apple had ap­proved ear­lier ver­sions do­ing the same thing. This time they did not.

I had used Apple’s built-in dic­ta­tion first, and the ex­pe­ri­ence was a par­tic­u­lar kind of frus­trat­ing. The tran­scrip­tion was close but rarely right, and every cor­rec­tion meant go­ing back in with the key­board, delet­ing, re­typ­ing. I was hurt­ing my hands to fix the tool that was sup­posed to be sav­ing them. That is the spe­cific prob­lem I wanted to solve: not transcribe my voice,” but transcribe my voice well enough that I am not con­stantly typ­ing cor­rec­tions.”

I will be hon­est about how I ap­proached this. I did not do much mar­ket re­search. There were prob­a­bly good tools out there al­ready, but most sent your au­dio to a server some­where, and I wanted one that did­n’t. When I want some­thing, my first ques­tion is usu­ally can I just build it,” not what can I buy.”

The first ver­sion was rough, but I used it every day and kept im­prov­ing it. I shared it with a cou­ple of class­mates and watched them fold it into their own daily work­flows. Seeing other peo­ple qui­etly come to rely on it made me want to re­lease it prop­erly.

The re­jec­tion

Version 1.0 shipped in the win­ter, and it was free to down­load from the App Store. Next I added fea­tures early users asked for, and I de­cided to make it a paid app. That up­date was ver­sion 1.5.

Apple re­jected it un­der Guideline 2.4.5. The re­jec­tion was specif­i­cally about the ac­ces­si­bil­ity per­mis­sion. WhisperPad uses it to in­ject tran­scribed text into other ap­pli­ca­tions, and Apple’s po­si­tion was that this was not an ap­proved use of that API. Earlier, ap­proved ver­sions of the app al­ready did the iden­ti­cal thing with the iden­ti­cal per­mis­sions, so this was hard to swal­low.

The re­jec­tion ex­pla­na­tion had some fair feed­back, too. I fixed those is­sues, but the 2.4.5 is­sue was the real wall. So I ap­pealed, ex­plain­ing that WhisperPad func­tioned as an ac­ces­si­bil­ity tool, that I had a repet­i­tive strain in­jury, and that the whole rea­son the app in­jected text the way it did was to spare the hands of peo­ple who, like me, could not af­ford the ex­tra key­strokes. I asked Apple to look at it in that light.

They re­sponded that they would take a closer look. They told me not to re­ply in the thread, and said they would come back with a de­ci­sion. That was April 21st.

Then it went quiet. By May 21st I had heard noth­ing, so I sent a short, po­lite note ask­ing about the sta­tus. I have worked in cus­tomer sup­port. I know tick­ets fall through the cracks, and I wanted to nudge it back onto the pile.

They re­sponded quickly, and the an­swer was an­other re­jec­tion.

The de­ci­sion to split

That sec­ond re­jec­tion is what forced a real de­ci­sion, and I want to ex­plain, be­cause it would have been easy to make a worse one.

I spent some time weigh­ing two op­tions: com­ply with Apple’s re­stric­tions and re­lease a ver­sion that fit their rules on the App Store (sacrificing the di­rect paste), or re­lease WhisperPad through di­rect dis­tri­b­u­tion. I de­cided I could­n’t sac­ri­fice the reach of the App Store. So I would build a ver­sion that com­plied with their rules and put it there, and at the same time move ahead with di­rect dis­tri­b­u­tion to de­liver the full ver­sion I had orig­i­nally set out to build.

Here is the thing about the con­straint. Apple’s guide­line, as far as I can tell, is meant to gov­ern apps in­ject­ing text into them­selves for ac­ces­si­bil­ity, rather than into other apps. That is my as­sump­tion, since I never got a per­fectly clear ex­pla­na­tion. (If you un­der­stand this guide­line bet­ter and can cor­rect me, reach out — I want to hear it.) Either way, an app reach­ing into every other app on your sys­tem is some­thing to be care­ful about, and I can see how WhisperPad sits in an awk­ward spot rel­a­tive to that line.

So I split WhisperPad into two ver­sions.

The ver­sion on the Mac App Store does not auto-paste. It puts your tran­scribed text on the clip­board, and you press Command-V to place it. That takes the core flow from roughly four steps to six. That does not sound like much, and for most peo­ple it is not. The en­tire de­sign goal of the app was to re­move hand move­ments for peo­ple who need to be eco­nom­i­cal with them, so a 50% in­crease in steps is sig­nif­i­cant. It is a com­pro­mised ver­sion of the idea. But it is a real, use­ful app, and it is on the store where peo­ple with or with­out ac­ces­si­bil­ity needs can stum­ble onto it. The App Store makes it dis­cov­er­able.

The orig­i­nal vi­sion, the one that pastes di­rectly where your cur­sor is, I shipped my­self — out­side the App Store.

Shipping it di­rectly

Shipping soft­ware out­side the App Store means re­build­ing the things the store nor­mally does for you. There’s a new trust hur­dle, too. You’re ask­ing peo­ple to trust you to process their credit card on your own site.

For pay­ments I went with Paddle, af­ter some re­search into the op­tions. For up­dates I am us­ing Sparkle, the long-stand­ing frame­work for keep­ing Mac apps up to date out­side the store. Licensing is han­dled with li­cense keys checked against a small server. None of this is ex­otic, it is the well-worn path for in­de­pen­dent Mac soft­ware, but it was all new to me, and get­ting it right took real work. Practically, I forked the app into sep­a­rate build tar­gets: one con­fig­ured for the App Store, one for di­rect re­lease. I fin­ished wiring up the di­rect re­lease pipeline on May 27, the morn­ing I started writ­ing this.

What I took from this

What first looked like an ob­sta­cle turned into a con­straint that pushed me to build a bet­ter-or­ga­nized prod­uct. I now un­der­stand my own build con­fig­u­ra­tion, my up­date path, and my pay­ment flow far bet­ter than I did in March, be­cause Apple’s no” forced me to learn all of it. Apple’s guide­lines ex­ist for de­fen­si­ble rea­sons, even if I wish my par­tic­u­lar app had landed on the other side of the line.

When a plat­form tells you no, you usu­ally have more op­tions than the mo­ment makes it feel like. The choice is rarely comply or quit.” It is of­ten comply here, and do the fuller thing some­where else.” Shipping two ver­sions, each one serv­ing its chan­nel as well as that chan­nel al­lows, was not a de­feat. It was just the next piece of work.

WhisperPad is on the Mac App Store now, with a free tier of 120 min­utes a month so you can find out whether it fits how you work be­fore pay­ing for any­thing. The di­rect ver­sion, with full auto-paste, is avail­able at mitm­llc.com/​whis­per­pad. If you want to talk to me about it, I am Rene Zelaya, and you can reach me at con­tact@mitm­llc.com.

Stop ruining it

seths.blog

Paul McGowan makes stereos. To para­phrase his in­sight: The mu­si­cal­ity is­n’t a fea­ture you add to an am­pli­fier. It’s what’s left when you stop ru­in­ing it.

To ex­pand: Customer de­light is­n’t some­thing we add to our pro­jects. It’s what’s left if we don’t ruin it.

Curiosity is­n’t sim­ply what’s left af­ter a com­plete ed­u­ca­tion. It’s still there if the sys­tem does­n’t ruin it.

Or per­haps: Satisfaction in our work is­n’t cre­ated by the boss. It’s what’s left if they don’t ruin it.

And one last one: Trust is­n’t some­thing a brand builds with an ad cam­paign. It’s what’s left if the mar­keters don’t ruin it.

To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".

10HN is also available as an iOS App

If you visit 10HN only rarely, check out the the best articles from the past week.

Visit pancik.com for more.