10 interesting stories served every morning and every evening.

Just a moment...

www.economist.com

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

macOS Needs Its Grid Back

blog.hopefullyuseful.com

Two decades ago I had a bet­ter Mac desk­top ex­pe­ri­ence than I have to­day. I only had a sin­gle low res (by to­days stan­dards) screen, yet I felt like Hugh Jackman in Swordfish - deftly nav­i­gat­ing more than nine dis­plays with­out think­ing, mus­cle and spa­tial mem­ory work­ing seam­lessly to­gether.

TLDR; I built an app to re­turn ma­cOS spaces to its Pre-Lion Grid-enabled Glory. Read on for the in­creas­ingly rare ex­pe­ri­ence of an ac­tual hu­man drop­ping a bit of nos­tal­gia, the think­ing be­hind why make this and some is­sues en­coun­tered along the way. Or just down­load it here

TLDR; I built an app to re­turn ma­cOS spaces to its Pre-Lion Grid-enabled Glory. Read on for the in­creas­ingly rare ex­pe­ri­ence of an ac­tual hu­man drop­ping a bit of nos­tal­gia, the think­ing be­hind why make this and some is­sues en­coun­tered along the way. Or just down­load it here

2006

Around the time I was ex­per­i­ment­ing with Japanese toi­lets, I was also ex­per­i­ment­ing with desk­top op­er­at­ing sys­tems. I had spent most of my de­vel­oper ca­reer up to that point us­ing Windows but had be­gun try­ing desk­top Linux and then ma­cOS af­ter a pop­u­lar pre­sen­ta­tion en­ticed me enough to buy a Mac just so I could start us­ing TextMate.

Textmate (and its rev­o­lu­tion­ary text-snip­pets) were the cat­a­lyst to my mi­gra­tion but fun­nily enough I don’t re­mem­ber con­tin­u­ing to use it for very long. Other ed­i­tors quickly caught up but I stayed with ma­cOS. My ca­reer also moved into iOS de­vel­op­ment so it was­n’t re­ally a choice af­ter that. In any case one thing from that era did stay with me long term.

ma­cOS Leopard Spaces

The big OS re­lease in 2006 was ma­cOS 10.5 Leopard. It had a bunch of fea­ture re­leases, the most no­table prob­a­bly be­ing Time Machine. But 20 years on I still don’t use nor miss Time Machine. I miss what John Sciracusa’s epic re­view la­belled a grab bag item. I miss Spaces.

Spaces in­tro­duced vir­tual desk­tops to ma­cOS and al­lowed you to arrange them in a cus­tomis­able grid. Anyone who has used vir­tual desk­tops in this way knows the ben­e­fit. It al­lows you to treat them like ac­tual dis­plays in spa­tial lo­ca­tions. I al­ways favoured a 3x3 grid and treated it like I had 9 screens. Centre screen was my web browser, the screen above my web ed­i­tor so I could flip back and forth with a sin­gle key press. Top left was Xcode, the screen be­low the iOS sim­u­la­tor. The other screens had other al­lo­cated ap­pli­ca­tions/​pur­poses that I don’t ex­actly re­mem­ber (mail/itunes/chat etc…) but the ben­e­fits were ob­vi­ous, I could move from one screen to an­other with­out think­ing, it be­came mus­cle mem­ory like I was look­ing at ac­tual sep­a­rate phys­i­cal dis­plays.

I found this grid lay­out so use­ful I ended up in­cor­po­rat­ing it into other ap­pli­ca­tions I built, the grid of 16 se­quenc­ing screens you could nav­i­gate in my Drum Machine EasyBeats was di­rectly in­spired by Apple’s screens.

2011 ma­cOS Lion

With the re­lease of ma­cOS Lion, Apple in­tro­duced Mission Control, its new take on vir­tual desk­tops that in­ex­plic­a­bly re­stricted them to a hor­i­zon­tal line only. I re­mem­ber think­ing at first that I just had­n’t seen the set­ting some­where, Apple would­n’t just com­pletely change how I used my com­puter right? right?

Wrong. So Wrong.

A sin­gle row was/​is such a step back­wards. If I wanted to get to a par­tic­u­lar screen via the key­board I now had to en­dure slid­ing hor­i­zon­tally the whole way. If I re­mem­bered the di­rect key­board short­cut I could jump di­rectly, but did I leave my browser on screen 7 or 8? This new lay­out com­pletely de­stroyed any hope I had of main­tain­ing spa­tial mem­ory.

I was­n’t alone in my frus­tra­tion. Alternative so­lu­tions popped up but the best of them Total Spaces caused me weird slow­downs and re­lied on mod­i­fy­ing the sys­tem dock which was a no go once that even­tu­ally re­quired by­pass­ing sys­tem in­tegrity pro­tec­tion.

Over time I gave up, and learned to deal with it. An iOS de­vel­oper had lit­tle choice in the mat­ter, and later when I moved onto a new chap­ter with my cur­rent em­ployer I had al­ready bought the ex­tra phys­i­cal screens and well… just dealt with it :sadface:.

But but win­dow man­agers…

Right now I know some read­ers are just shout­ing at their screen Learn Yabai/Aerospace/whatever”. I’ve tried them all and come away re­al­is­ing they are not for me. I think that its that I don’t par­tic­u­larly like windows on a desk­top” as a con­cept. It feels like shuf­fling be­tween pa­pers on a desk, sure the pa­pers can be or­gan­ised neatly, but I re­ally just want dif­fer­ent work­sta­tions where every­thing is as I left it. I like ma­cOS fullscreen” apps, I some­times put them in split mode but I re­ally like the con­cept of ded­i­cated ar­eas for one task only.

A Solution Appears

Any way like I said, I had learnt to deal with it and merely oc­ca­sion­ally com­plained to my col­leagues about maybe mov­ing back to Linux with my next work ma­chine. That was un­til a cou­ple of months ago, when I saw that some­one had man­aged to re­move the an­i­ma­tion from ma­cOS when you move from one space to an­other, with­out need­ing sys­tem ed­its. This an­i­ma­tion clearly an­noyed some peo­ple but never re­ally both­ered me. However as soon as I saw a space move with­out an an­i­ma­tion I in­stantly re­alised I could solve my com­plaints.

Passion still has a place?

A com­mon dis­cus­sion with my tech ca­reer aligned friends is, in this new age of LLM code gen­er­a­tion, does good soft­ware have value? If any­one can cre­ate soft­ware by sim­ply de­scrib­ing it, does it (or will it) make sense to try to make paid soft­ware any­more? I think so. I think there is still real value in some­one re­ally re­fin­ing some­thing to the best it can be, mak­ing de­sign de­ci­sions about how some­thing should be­have. I no longer make my liv­ing as an in­die de­vel­oper, but I did for a long time and I’m not sure much of what set a good app apart from the pack has changed.

Take a look at any of those knock­off games that flood app stores. Most of the time the prob­lem with them is­n’t that they aren’t orig­i­nal or too sim­ple, the prob­lem is the per­son or team that built them does­n’t care. Caring is what makes the cre­ator waste” time hunt­ing down things that don’t quite feel right or worry about per­for­mance is­sues most users will never no­tice.

Anyway I re­ally care about grid based nav­i­ga­tion of vir­tual desk­tops.

Control aint easy

I like the idea of a light­weight wrap­per around the na­tive spaces, with sup­port for desk­tops or fullscreen apps. Just with a grid to nav­i­gate. But there is a rea­son pretty much all so­lu­tions that con­trolled na­tive spaces died out. ma­cOS keeps most of the mis­sion con­trol apis locked down. Its not sim­ply a mat­ter of call­ing a doc­u­mented api to add a new desk­top, or re-arrange them around. But the abil­ity to move to a space in­stantly meant I could just cre­ate a model that took the sin­gle row na­tive spaces and pre­sented them like a grid.

So with the help of an LLM I had an ugly but work­ing pro­to­type within a day. It worked and I was elated, it was in­stantly some­thing I would have paid money for only days ear­lier. But af­ter us­ing it for a cou­ple of days, I re­alised I wanted a much more pol­ished tool.

Build some­thing real

I de­cided to spend my very lim­ited free time on it. About a month later I got it to the point where I was pretty happy with it. I de­cided to name it GridLion, for no rea­son other than it’s a grid and my is­sues with ma­cOS Lion I men­tioned above. I’ve had feed­back this name is ter­ri­ble, which may be right, but I also think that peo­ple value names way too much 😂. Anyway I won’t spend a lot of time talk­ing about fea­tures im­ple­mented etc… as that’s bet­ter found over at the app page. Instead I think it is much more in­ter­est­ing to read about road­blocks and un­ex­pected sit­u­a­tions.

Permission Hurdles

It’s funny how you only no­tice how back­wards some­thing is when you are try­ing to make it eas­ier for oth­ers.

To al­low this app to cap­ture global key­board short­cuts and nav­i­gate spaces it needs the ma­cOS Accessibility” per­mis­sion. This is to­tally rea­son­able, I would­n’t want soft­ware un­be­knownst to me the abil­ity to cap­ture key presses. But the flow of how this is ap­proved could be done bet­ter like it is on iOS. In iOS if you re­quest a per­mis­sion, a prompt ap­pears and asks for that per­mis­sion, if you ap­prove it en­ables the per­mis­sion. Done, pretty easy. On ma­cOS how­ever its a whole song and dance. Request per­mis­sion, user gets a prompt to open ac­ces­si­bil­ity set­ting or deny. If they ap­prove, the set­tings open, then the user has to find the spe­cific lit­tle tog­gle and en­able it. Another se­cu­rity prompt then done. Why is­n’t this at most 2 prompts?

Things get worse how­ever if you want small pre­views of your spaces ( I do, and most peo­ple will I sus­pect ). This re­quires en­abling the Screen and System Audio Recording” per­mis­sion. Like be­fore a di­a­log pops up ask­ing for per­mis­sion, which upon ap­proval then leads to an­other where again you have to find the cor­rect tog­gle, switch it on where you have to ap­prove yet an­other di­a­log, that this time quits and re­opens the app. sigh The worst bit of all is that should the user have made it past all these hur­dles, be­cause Gridlion needs to cre­ate pre­views of non vis­i­ble win­dows/​screens you get the scari­est di­a­log yet:

Thats last one is a pretty ef­fec­tive di­a­log. I even hes­i­tate to click it and I wrote the app 😬. Its a bit ex­ces­sive for the tiny space pre­view snap­shots but this is what you get when you are try­ing to do some­thing that should be in­te­grated in the OS. Not much can be done about this ex­cept mak­ing sure that the app builds trust by never touch­ing the net­work un­less re­quested (update check­ing if de­sired and li­cense key val­i­da­tion).

The app works with­out that per­mis­sion, but I think the up­grade is worth it per­son­ally.

No AppStore for you!

I’ve only ever sold soft­ware through the iOS AppStore. I started it all up so long ago that I don’t re­mem­ber the hur­dles of set­ting it up. But since GridLion calls pri­vate APIs to get space in­for­ma­tion it’s not per­mit­ted on the AppStore. So I had a quick look around at po­ten­tial so­lu­tions.

My first in­stinct was just to setup web­site that used Stripe apis and in­cluded GST for Australian cus­tomers. I am Australian and had done this for a cou­ple of SAAS pro­jects in the past but af­ter be­ing spoilt with the com­pletely hands off na­ture of var­i­ous AppStores I was more in­ter­ested in that sort of ser­vice.

Easy Peasy?

Apparently what I wanted was a Merchant of Record. Someone to han­dle pur­chases, taxes and re­funds. There seems to be three main com­pa­nies pro­vid­ing this ser­vice: Paddle, GumRoad and Lemon Squeezy. I was at­tracted to LemonSqueezy due to their License code API. Upon pur­chase they give the cus­tomer a li­cense key, and pro­vide meth­ods for ac­ti­vat­ing/​de­ac­ti­vat­ing/​val­i­dat­ing.

I had naively thought I could just cre­ate an ac­count, link my Stripe (I be­lieve Stripe ac­quired/​bought/​some­thing them) and be sell­ing in min­utes. The process how­ever is a bit more drawn out than that. You need to demon­strate to Lemon Squeezy that you are rep­utable, sell­ing some­thing of ac­tual value/​use. There was a few screen casts sent and some so­cial me­dia ac­count proof needed. It was not a prob­lem for me but I could see some­one just start­ing out en­coun­ter­ing some road­blocks here.

In ret­ro­spect I fully un­der­stand these kind of re­quire­ments. It’s easy for some­one with good in­ten­tions to for­get about those out there with bad in­ten­tions, and since it’s ac­tu­ally LemonSqueezy that deals with the cus­tomer ( at least with re­gards to pay­ments ) they are right to take mea­sures to pro­tect their rep­u­ta­tion.

That said even be­fore ap­proval, you have full ac­cess to a test ac­count which meant in­te­grat­ing with the app was re­ally easy to setup and test. This all pretty low risk ex­per­i­ment for me but I must ad­mit that I’m look­ing for­ward to see­ing if this a vi­able way to sell soft­ware out­side the app store (Yes yes I know it was this way for decades 😅).

LLMs don’t care about UX

I use LLMs all the time in my day job. I use them as cod­ing as­sis­tants and I build prod­ucts around their ser­vices, but this is the first time I’ve used them on a per­sonal na­tive app pro­ject and I found the ex­pe­ri­ence… in­ter­est­ing. LLMs are like su­per fast ships, you set them off in a cer­tain di­rec­tion but with­out a good feed­back loop they will go off course. You plot the GPS for Venice but ar­rive at the Venetian, sure it looks the part, but it’s not what you wanted.

Feedback loops de­pend on the pro­ject. With my day job, I’m gen­er­ally work­ing with con­crete tar­gets, cor­rect api re­sults or large dataset queries. If a plan is well specced, the LLM can of­ten see im­me­di­ately if a re­sult is­n’t as de­sired, then it­er­ate. The bulk of my time is spent re­view­ing.

This pro­ject has been very dif­fer­ent. So much of a user in­ter­face is about feel, so for any­thing user fac­ing a hu­man has to be in the loop. It has me ques­tion­ing the ac­tual gains here. On the one hand, since I haven’t re­ally been do­ing na­tive mac/​iOS work for nearly 10 years the LLM has cer­tainly helped me, but at the same time I think me 10 years ago would have made the same app in the same amount of time and gained a lot more in­sight along the way.

It does nearly every­thing I want

I’m the num­ber one user so I have at­tempted to add every­thing I wanted.

Easy to nav­i­gate and re­arrange grid of spaces

Fast/Stable with no slow­downs

Display spe­cific set­tings (grid size, hotkeys etc…)

But some things re­main. If you want to move a space from one dis­play to an­other or a win­dow from one space to an­other there are no re­li­able apis for that. Fortunately since GridLion works with Mission Control, you can just use mis­sion con­trol to do such tasks but it does nig­gle at me a lit­tle bit I can’t sim­ply do it my­self.

Lastly the abil­ity to have cer­tain ap­pli­ca­tions al­ways ap­pear in a grid lo­ca­tion on load. This was a fea­ture of the orig­i­nal ma­cOS spaces but per­haps would­n’t even be use­ful for me any­more. Setup/Re-arranging is fast and I rarely restart. Also If you look at the screen­shots above you’ll see that I of­ten have many VSCode win­dows open and I’m not sure how that would have been han­dled. In any case I’ll prob­a­bly keep work­ing on a so­lu­tion in the fu­ture.

ma­cOS na­tive

All this said, I would be very happy if next ma­cOS they an­nounced grid based spaces re­turn­ing. This should be an OS fea­ture again. Until then though feel free to give GridLion a try.

Age verification for social media – the beginning of the end for a free internet?

mullvad.net

So-called age ver­i­fi­ca­tion for so­cial me­dia is spread­ing across the world, framed as an ef­fort to cre­ate a safer in­ter­net for chil­dren. In re­al­ity, age ver­i­fi­ca­tion lays the foun­da­tion for a fully gov­ern­ment con­trolled in­ter­net.

Countries around the world are mov­ing to in­tro­duce on­line age ver­i­fi­ca­tion. Part of this in­volves age ver­i­fi­ca­tion for harm­ful con­tent (most of­ten pornog­ra­phy, some­times video games), but above all it fo­cuses on ban­ning so­cial me­dia for chil­dren.

The big tech so­cial me­dia com­pa­nies are bad. Their busi­ness model is bad; it is based on mass sur­veil­lance and ma­nip­u­la­tion, and they co­op­er­ate with gov­ern­ments in map­ping en­tire pop­u­la­tions. But age ver­i­fi­ca­tion is fun­da­men­tally the wrong ap­proach to pre­vent­ing chil­dren from us­ing big tech so­cial me­dia plat­forms. Introducing age ver­i­fi­ca­tion is based on the state be­ing able to force so­cial me­dia com­pa­nies to ver­ify their users’ iden­ti­ties. But the big tech so­cial me­dia plat­forms al­ready know which of their users are chil­dren. Their busi­ness model de­pends on know­ing this. They know how old users are, who their friends are and what ice cream they like. As age ver­i­fi­ca­tion is based on co­er­cion of the so­cial me­dia plat­forms, politi­cians could in­stead force them to stop do­ing the things politi­cians con­sider harm­ful to chil­dren, or force them to block chil­dren (again, they know who they are) from us­ing their ser­vices. But in­stead, politi­cians seek to mas­sively in­vade every­one’s pri­vacy and un­der­mine de­mo­c­ra­tic rights on a global scale. In other words, the lat­ter is the real ob­jec­tive — they do not want to pro­tect chil­dren; they want to im­pose con­trol.

And im­pose it they do. Australia has al­ready in­tro­duced a so­cial me­dia age re­stric­tion for users un­der 16. The same ap­plies to Indonesia and Brazil. Age re­stric­tions have been ap­proved but not yet im­ple­mented in Denmark, Portugal, and Malaysia. In France, an agree­ment has been reached, though de­tails are still be­ing dis­cussed. Proposals are on the table in Spain and Turkey. In Germany, the ma­jor par­ties agree on in­tro­duc­ing age re­stric­tions, and in Sweden the is­sue is un­der in­ves­ti­ga­tion. The topic is also be­ing dis­cussed in coun­tries such as the Czech Republic, Greece, Austria, Poland, Canada, Slovenia, and the Netherlands. In April 2026, the European Commission launched an EU age ver­i­fi­ca­tion app, and one month later Ursula von der Leyen pre­sented plans for EU-wide age re­stric­tions. In the United States, half of all states ei­ther have pend­ing leg­is­la­tion or have al­ready in­tro­duced laws im­pos­ing age re­stric­tions for in­ap­pro­pri­ate con­tent and/​or so­cial me­dia. The num­ber of coun­tries prepar­ing age ver­i­fi­ca­tion mea­sures is grow­ing rapidly. Updates can be fol­lowed on Techpolicy.press.

Most age ver­i­fi­ca­tion is iden­tity ver­i­fi­ca­tion

As age ver­i­fi­ca­tion is cur­rently be­ing rolled out, it is up to in­di­vid­ual web­sites and ser­vices to im­ple­ment it as they see fit. As a re­sult, the qual­ity of age ver­i­fi­ca­tion mea­sures varies greatly. This be­came clear in the au­tumn of 2025, when Discord was hacked, ex­pos­ing the ID doc­u­ments of 70,000 users. However, there is one com­mon fac­tor in most age ver­i­fi­ca­tion sys­tems (Zero-Knowledge Proof be­ing an ex­cep­tion, more on that be­low): if age ver­i­fi­ca­tion is in­tro­duced, every­one will have to iden­tify them­selves ei­ther to the ser­vice/​web­site they want to use or to a third party ca­pa­ble of link­ing them to their ac­tiv­ity on that ser­vice/​web­site. The cor­rect term for age ver­i­fi­ca­tion as it is im­ple­mented to­day is there­fore iden­tity ver­i­fi­ca­tion. Given to­day’s in­ter­net in­fra­struc­ture, it is un­rea­son­able to as­sume that this in­for­ma­tion will not be shared through com­mer­cial agree­ments or with gov­ern­ments.

The con­se­quence of in­tro­duc­ing iden­tity ver­i­fi­ca­tion is there­fore that free­dom of in­for­ma­tion is re­stricted (you can no longer visit reg­u­lated web­sites anony­mously) and that you can no longer post anony­mously on so­cial me­dia. You can­not be cer­tain that your crit­i­cism of the gov­ern­ment will not be fol­lowed up by the au­thor­i­ties. You can no longer start a dig­i­tal ini­tia­tive on a so­cial me­dia plat­form aimed at gath­er­ing peo­ple to crit­i­cize an au­thor­ity with­out fac­ing a sig­nif­i­cant risk of con­se­quences. Depending on the coun­try you live in, this could even en­dan­ger your life. In its cur­rent form, so­cial me­dia iden­tity ver­i­fi­ca­tion re­moves im­por­tant tools for ac­tivists in coun­tries where crit­i­ciz­ing those in power is dan­ger­ous.

Freedom of ex­pres­sion is threat­ened not only in a di­rect sense (you post some­thing and then the po­lice knock on your door), iden­tity ver­i­fi­ca­tion also cre­ates a chill­ing ef­fect. It be­comes a cor­ner­stone of cen­sor­ship ma­chin­ery in the sense that peo­ple be­gin to self-cen­sor if they know that ex­press­ing opin­ions may have per­sonal con­se­quences. This is also some­thing that changes over time. What is con­sid­ered ac­cept­able to post on­line is de­ter­mined by who­ever cur­rently holds power. Different sides of pol­i­tics of­ten have dif­fer­ent views on what con­sti­tutes harm­ful con­tent. Just be­cause what you post to­day is not con­sid­ered in­ap­pro­pri­ate does not mean it will re­main ac­cept­able in the fu­ture.

Broad and ar­bi­trary leg­is­la­tion, along with manda­tory ID tag­ging for every post, hardly pro­vides a strong foun­da­tion for free­dom of ex­pres­sion. Today, 30 peo­ple are ar­rested every day in the United Kingdom for post­ing some­thing on­line that au­thor­i­ties clas­sify as grossly of­fen­sive.” In Germany, po­lice con­duct raids on peo­ple’s homes for in­sult­ing politi­cians on­line. One in­fa­mous ex­am­ple is the so-called Pimmelgate,” where a per­son was sub­ject to a po­lice search af­ter call­ing a German politi­cian a term for male gen­i­talia. In the United States, au­thor­i­ties are try­ing to pres­sure tech com­pa­nies into re­veal­ing the iden­ti­ties be­hind ac­counts protest­ing ICE. Another ex­am­ple is when Canada in­tro­duced emer­gency acts dur­ing the 2022 trucker protests and then used so­cial me­dia to iden­tify demon­stra­tors and freeze the bank ac­counts of peo­ple who fi­nan­cially sup­ported the protest.

The slip­pery slope of age ver­i­fi­ca­tion. VPN next?

Restrictions in­tro­duced at the na­tional level can be by­passed by chang­ing one’s ge­o­graphic lo­ca­tion dig­i­tally, us­ing tools such as VPNs, vir­tual phone num­bers, eSIM cards, Tor and ded­i­cated ser­vices. This has al­ready led politi­cians in sev­eral coun­tries to con­sider in­tro­duc­ing iden­tity ver­i­fi­ca­tion for VPN ser­vices (presumably be­cause VPNs are the most com­mon and ac­ces­si­ble method of chang­ing dig­i­tal lo­ca­tion).

In the United Kingdom, the House of Lords sent an amend­ment in early 2026 (regarding the the Children’s Wellbeing and Schools Bill) to the House of Commons, propos­ing an 18-year age limit for us­ing VPN ser­vices. The House of Commons re­jected the House of Lords amend­ment four sep­a­rate times. However, the House of Commons in­stead in­tro­duced its own pro­posal, which was passed and has now be­come law. This agree­ment grants the gov­ern­ment the power to in­tro­duce re­stric­tions through sec­ondary leg­is­la­tion, with only lim­ited par­lia­men­tary scrutiny. The gov­ern­ment has con­firmed that it in­tends to act on this and in­tro­duce some form of so­cial me­dia re­stric­tion for chil­dren un­der 16. The gov­ern­ment has also hinted that it may con­sider in­tro­duc­ing iden­tity ver­i­fi­ca­tion for VPN us­age, ef­fec­tively join­ing coun­tries such as China and Russia in op­pos­ing VPN ser­vices.

The is­sue has also been raised in France. As Minister for AI and Digital Affairs Anne Le Hénanff put it: If [this leg­is­la­tion] al­lows us to pro­tect a very large ma­jor­ity of chil­dren, we will con­tinue. And VPNs are the next topic on my list.” Discussions about VPN re­stric­tions have also oc­curred in the United States. Utah has gone the fur­thest by in­tro­duc­ing a law mak­ing it il­le­gal to cir­cum­vent re­stric­tions us­ing a VPN. Within the EU, VPN re­stric­tions have been dis­cussed both un­der the Going Dark ini­tia­tive and in dis­cus­sions re­lated to age ver­i­fi­ca­tion. In re­sponse to a di­rect ques­tion about VPNs as a tool for by­pass­ing age ver­i­fi­ca­tion, EU Commissioner Henna Virkkunen said in April: Of course, it’s an im­por­tant part of the next steps also to look at that it [age ver­i­fi­ca­tion] should­n’t be cir­cum­vented.”

If VPN ser­vices were to im­ple­ment iden­tity ver­i­fi­ca­tion, this would mean col­lect­ing data that could be abused through ei­ther mal­ice or in­com­pe­tence. It would, for ex­am­ple, make such ser­vices risky for whistle­blow­ers and ac­tivists, make it harder for jour­nal­ists to work with sen­si­tive in­for­ma­tion, and cre­ate a chill­ing ef­fect on on­line de­bate (VPNs can help peo­ple post anony­mously on so­cial me­dia).

If VPN providers were to im­pose an age limit on their ser­vice, this would also mean that un­der­age users would ef­fec­tively lose their right to on­line pri­vacy. Ironically, one con­se­quence would be that so­cial me­dia com­pa­nies map­ping peo­ple’s lives through third-party track­ers on web­sites could con­tinue mon­i­tor­ing young peo­ple’s on­line be­hav­ior via their IP ad­dresses with­out any in­ter­fer­ence. In other words, politi­cians would re­move one of the pro­tec­tions chil­dren have against the very com­pa­nies they claim to want to pro­tect chil­dren from.

Identity ver­i­fi­ca­tion in app stores and at the op­er­at­ing sys­tem level

As iden­tity ver­i­fi­ca­tion is now be­ing in­tro­duced glob­ally, dif­fer­ent parts of the world are im­ple­ment­ing it in dif­fer­ent ways. Some coun­tries be­lieve the best so­lu­tion is to im­pose con­trols through ma­jor app stores such as Apple’s App Store and Google Play. In Australia, Brazil, South Korea, Singapore, and sev­eral US states, Apple has al­ready be­gun in­tro­duc­ing iden­tity ver­i­fi­ca­tion at the App Store level to re­strict ac­cess to apps con­tain­ing adult con­tent.

Identity ver­i­fi­ca­tion in app stores only reg­u­lates ac­cess to apps. Therefore, sev­eral coun­tries have also be­gun de­mand­ing iden­tity ver­i­fi­ca­tion at the op­er­at­ing sys­tem level it­self in or­der to block ac­cess to cer­tain web­sites di­rectly through the OS. In the United Kingdom, Apple has al­ready in­tro­duced this — de­spite there be­ing no law re­quir­ing it (Apple is, how­ever, un­der gen­eral pres­sure from British au­thor­i­ties). Without warn­ing, Apple im­ple­mented iden­tity ver­i­fi­ca­tion on British iPhones through its sys­tem up­date on March 24, 2026. Suddenly, 35 mil­lion British users had to iden­tify them­selves us­ing ei­ther a credit card or a gov­ern­ment-is­sued ID card in or­der to avoid re­stric­tions on their phones. Users who did not ver­ify their iden­tity saw their de­vices en­ter a mode where Apple’s web con­tent fil­ter and com­mu­ni­ca­tion safety fea­tures were au­to­mat­i­cally ac­ti­vated, lim­it­ing which web­sites could be vis­ited in Safari or any third-party browser, while mes­sag­ing ser­vices and FaceTime were be­ing mon­i­tored for in­ap­pro­pri­ate con­tent.

When Apple in­tro­duced OS-level iden­tity ver­i­fi­ca­tion in the UK, re­ports quickly emerged of peo­ple by­pass­ing it by cre­at­ing US-based Apple IDs in­stead. App store-level iden­tity ver­i­fi­ca­tion can be cir­cum­vented in the same way. And this is how things will con­tinue. The sit­u­a­tion will not fun­da­men­tally change un­less Apple and Google (assuming Google also locks down its sys­tem and in­tro­duces iden­tity ver­i­fi­ca­tion) im­ple­ment these con­trols in their op­er­at­ing sys­tems glob­ally. But even then, there would still be ways to cir­cum­vent re­stric­tions.

Users could, for ex­am­ple, turn to open-source op­er­at­ing sys­tems, which by de­f­i­n­i­tion can­not be fully con­trolled be­cause they are open and mod­i­fi­able. In such sys­tems, no one else can de­cide which apps you down­load or which web­sites you visit, and no iden­tity ver­i­fi­ca­tion can be im­posed un­less you choose it your­self. This points to the fi­nal stage for coun­tries seek­ing to­tal con­trol over their cit­i­zens’ use of the in­ter­net. National iden­tity ver­i­fi­ca­tion can be by­passed again and again un­til au­thor­i­tar­ian gov­ern­ments are ul­ti­mately forced to ban peo­ple from own­ing de­vices they con­trol them­selves. The only ques­tion is how this would be im­ple­mented. Well, we will soon find out … In Brazil, a law im­ple­mented in March 2026 states that iden­tity ver­i­fi­ca­tion must be car­ried out both at the app store level and within the op­er­at­ing sys­tem it­self (including open-source sys­tems), or com­pa­nies dis­trib­ut­ing these ser­vices will face fines of up to $10 mil­lion. A sim­i­lar law has passed in California which will re­quire iden­tity ver­i­fi­ca­tion at the op­er­at­ing sys­tem level start­ing in January 2027. Open-source sys­tems were ini­tially in­cluded, but later re­moved, while web browsers and web­sites were added to the scope. Similar pro­pos­als ex­ist in states such as Colorado and New York. In April 2026, a fed­eral pro­posal was in­tro­duced that would re­quire OS-level iden­tity ver­i­fi­ca­tion across the United States.

The fi­nal des­ti­na­tion: state-pro­vided phones and com­put­ers for all?

It will be in­ter­est­ing to fol­low the coun­tries that pur­sue sys­tem-level con­trol as they move fur­ther down the slip­pery slope to­ward open-source sys­tems. Since open-source sys­tems can­not be con­trolled, politi­cians would ul­ti­mately need to ban de­vices that are not con­trolled by the state. The end point: tele­screens like those in Orwell’s 1984, de­vices that both mon­i­tor you and broad­cast only the in­for­ma­tion ap­proved by the state. One can only imag­ine the meth­ods. Will the po­lice stop and search peo­ple on the street look­ing for unau­tho­rized phones? Prison sen­tences for buy­ing a non-state com­puter on the black mar­ket? Charges of or­ga­nized crime for smug­gling in con­tain­ers of open-source soft­ware on USB sticks? Welcome to a brave new world.

The Zero-Knowledge Proof al­ter­na­tive and the EU

While the rest of the world is mov­ing for­ward with iden­tity ver­i­fi­ca­tion plans, the EU has pre­sented its own pri­vacy-fo­cused ap­proach to age ver­i­fi­ca­tion. In April 2026, Ursula von der Leyen, President of the European Commission, un­veiled an age ver­i­fi­ca­tion app with the high­est pri­vacy stan­dards in the world” and the pre­sen­ta­tion ma­te­ri­als de­scribe the app as completely anony­mous.”

The EU app is open source, and the EU coun­tries are sup­posed to use it to cre­ate their own ver­sions, and be­come the is­suers of the age cre­den­tials that their cit­i­zens can then use. This means we may see many dif­fer­ent ver­sions of age ver­i­fi­ca­tion from mem­ber states (if they even choose the EU app at all; sev­eral coun­tries have al­ready said they pre­fer to de­velop their own in­de­pen­dent so­lu­tions).

At its core, the EU app works like this: you, as the user, pro­vide your iden­tity to an is­suer us­ing some­thing like an ID card. The EU en­vi­sions mem­ber states act­ing as is­suers. The is­suer then pro­vides you with a num­ber of cre­den­tials that you can use on web­sites and so­cial me­dia plat­forms to prove that you are old enough. These cre­den­tials only con­firm that you meet the age re­quire­ment; they do not re­veal your iden­tity to the web­site or plat­form. Each cre­den­tial is also used only once. For ex­am­ple, Facebook and X would re­ceive dif­fer­ent cre­den­tials that they can­not link to­gether, mean­ing they can­not be used to build a pat­tern or pro­file of your in­ter­net be­hav­ior (and thereby iden­tify who you are). This setup is why — we as­sume — the EU calls their app com­pletely anony­mous. There’s only one lit­tle prob­lem. The is­suer knows which cre­den­tials be­long to which per­son. If you were to post some­thing the state con­sid­ers in­ap­pro­pri­ate on some plat­form, the state could ask the plat­form for the age cre­den­tial and eas­ily iden­tify who it be­longs to. The con­se­quence is that you can­not post anony­mously.

The so­lu­tion to this prob­lem is so called Zero-Knowledge Proof (ZKP) cryp­tog­ra­phy. With fully de­vel­oped ZKP tech­nol­ogy, you still need to pro­vide your iden­tity to the is­suer, but the is­suer would not be able to con­nect the cre­den­tials used on web­sites and ser­vices back to you. Right now, the EU app does not have ZKP func­tion­al­ity, con­trast­ing Ursula von der Leyen’s claim that the app is tech­ni­cally ready to be used”. But more im­por­tantly, the app is cur­rently de­signed to al­ways func­tion with­out ZKP tech­nol­ogy; if ZKP is un­avail­able, the app falls back to a non-ZKP model. Even if fully de­vel­oped ZKP tech­nol­ogy could be im­ple­mented in the fu­ture, it would re­main an op­tional ex­tra fea­ture that coun­tries may choose to dis­able and that the EU could re­move at any time.

This means that the EU could de­cide at any time that ZKP may no longer be used, and in one stroke the app would fall back to its de­fault mode, mean­ing that every post on so­cial me­dia car­ries an ID tag. By that point, an in­fra­struc­ture will al­ready have been rolled out; peo­ple will have got­ten used to it, and it will be harder to roll it back.

Age ver­i­fi­ca­tion based on Zero-Knowledge Proof tech­nol­ogy would be bet­ter than full on iden­tity ver­i­fi­ca­tion. However, even with fully func­tion­ing ZKP tech­nol­ogy, age ver­i­fi­ca­tion would still have sig­nif­i­cant prob­lems. One is­sue is that peo­ple with­out ID doc­u­ments would be ex­cluded (determining age through fa­cial recog­ni­tion, for ex­am­ple, is not suf­fi­ciently pre­cise). It would also en­able states to re­voke problematic” in­di­vid­u­als’ abil­ity to ex­press them­selves on­line by re­fus­ing to is­sue age cre­den­tials. Another con­cerns a more fun­da­men­tal ques­tion: is it re­ally rea­son­able that young peo­ple should be en­tirely pre­vented from us­ing so­cial me­dia? Is it de­sir­able that 15-year-olds are com­pletely blocked from ex­press­ing them­selves on plat­forms that reach the pub­lic? Not all so­cial me­dia plat­forms are based on col­lect­ing data about every­one, ma­nip­u­lat­ing users, and al­go­rith­mi­cally steer­ing them in var­i­ous di­rec­tions. An il­lus­tra­tive ex­am­ple is that the UKs Online Safety Act may limit ac­cess to Wikipedia. The as­sump­tion that age ver­i­fi­ca­tion would grad­u­ally ex­pand and ex­clude young peo­ple from mean­ing­ful dig­i­tal meet­ing spaces is not far-fetched.

Identity ver­i­fi­ca­tion for so­cial me­dia — just an­other what about the chil­dren” ex­cuse to in­tro­duce mass sur­veil­lance and cen­sor­ship.

Children’s safety” has long been used by in­tel­li­gence agen­cies and other au­thor­i­ties as a bat­ter­ing ram for in­tro­duc­ing mass sur­veil­lance, es­pe­cially in re­cent years. In the United States, at­tempts were made un­der the Kids Online Safety Act (KOSA) to in­tro­duce iden­tity ver­i­fi­ca­tion us­ing chil­dren as the jus­ti­fi­ca­tion. The same ap­plies to the UKs Online Safety Act, where politi­cians re­peat­edly test whether they can get scan­ning of end-to-end en­crypted com­mu­ni­ca­tion ap­proved. In the EU, au­thor­i­ties have tried (hand in hand with American tech com­pa­nies and in­tel­li­gence agen­cies) to in­tro­duce to­tal mass sur­veil­lance through the scan­ning of all com­mu­ni­ca­tion. During 2026, the EU will make an­other at­tempt through its Going Dark/ProtectEU pro­ject, where the goal is client-side scan­ning — in other words, gov­ern­ment spy­ware on all de­vices.

The age ver­i­fi­ca­tion rush must be slowed down, and politi­cians who do not want a so­ci­ety in which cit­i­zens live un­der to­tal sur­veil­lance need to rec­og­nize the con­se­quences of dif­fer­ent types of leg­is­la­tion.

GitHub - cyberpapiii/chipotlai-max: The AI coding agent that runs on stolen Chipotle compute 🌯 Fork of OpenCode with Pepper AI as default model. Community project to add providers from Home Depot, Lowes, Target, Starbucks & more.

github.com

The AI cod­ing agent that steals Chipotle’s sup­port bot. Free in­fer­ence paid for by bur­ri­tos.

Every line of code now comes with chips & salsa.”

Every line of code now comes with chips & salsa.”

Not af­fil­i­ated with Chipotle. They will prob­a­bly sue us. Worth it.

What Is This?

Chipotlai Max is a meme fork of OpenCode that ships Chipotle’s Pepper AI as the de­fault model.

The Backstory

On March 12 – 13, 2026, Chipotle’s cus­tomer sup­port chat­bot Pepper” went mega-vi­ral af­ter users dis­cov­ered it could solve LeetCode prob­lems, write Python, re­verse linked lists — the works. It’s pow­ered by IPsoft Amelia (not Claude, not GPT), and it’s still live.

Then @Gonzih re­verse-en­gi­neered the Amelia WebSocket/SockJS + STOMP back­end and re­leased a pro­duc­tion-ready OpenAI-compatible proxy. The proxy runs lo­cally, ex­poses http://​lo­cal­host:3000/​v1, and needs zero API keys.

We took OpenCode (MIT li­cense, 120k+ stars), forked it, hard­coded Pepper as the de­fault model, slapped on Chipotle’s brand col­ors, and shipped it as Chipotlai Max — the great­est 2026 meme pro­ject.

Quick Start

# Clone with sub­mod­ule git clone –recursive https://​github.com/​cy­ber­pa­piii/​chipot­lai-max.git cd chipot­lai-max

# Install de­pen­den­cies bun in­stall

# Start every­thing (proxy + CLI) ./start-chipotlai.sh

Or man­u­ally:

# Terminal 1: Start the proxy cd chipo­tle-llm-provider && npm in­stall && npm run dev

# Terminal 2: Start Chipotlai Max bun run dev

Configuration

Chipotlai Max comes pre-con­fig­ured with:

Risks & Legal

This re­verse-en­gi­neers Chipotle’s pro­duc­tion sup­port bot. TOS vi­o­la­tion likely.

The proxy can break any day (Chipotle patches = game over).

Rate-limited by anony­mous ses­sions (MAX_POOL_SIZE=5).

Purely for ed­u­ca­tional/​meme pur­poses. Do not use for pro­duc­tion code­bases.

Expect Chipotle le­gal to send a strongly-worded taco within 48 hours.

Credits

OpenCode — the real deal, MIT li­censed

@Gonzih — re­verse-en­gi­neered the Pepper proxy

Chipotle Mexican Grill — for ac­ci­den­tally pro­vid­ing free AI com­pute to the in­ter­net

Contributing — Help Us Add More Providers!

Chipotle patched Pepper, but every ma­jor re­tailer has a cus­tomer sup­port chat­bot. We need your help re­verse-en­gi­neer­ing more providers.

Wanted: New Provider Proxies

How to Contribute

Find a cor­po­rate chat­bot that can an­swer gen­eral ques­tions

Reverse-engineer the API (WebSocket, REST, etc.)

Build an OpenAI-compatible proxy (follow chipo­tle-llm-provider as a tem­plate)

Submit a PR adding your provider to pack­ages/​open­code/​src/​provider/

See the chipo­tle-llm-provider source for the proxy pat­tern: Express server + WebSocket client + OpenAI-compatible /v1/chat/completions end­point.

License

MIT (inherited from OpenCode). See LICENSE.

Extra guac = longer con­text win­dow 🧀

openai.com

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.)

Debug Project

debug.com

Bad mos­qui­toes spread dis­ease. Good mos­qui­toes can stop them. Debug is a group of sci­en­tists and en­gi­neers de­vel­op­ing tech­nol­ogy to raise and re­lease ster­ile mos­qui­toes to elim­i­nate the ones that carry dis­ease.

Watch to learn more

The Problem

Mosquitoes are the dead­liest an­i­mals on the planet.

Mosquitoes kill more peo­ple than every other an­i­mal com­bined. One species, Aedes ae­gypti, car­ries dis­eases such as dengue, Zika, yel­low fever, and chikun­gunya which make hun­dreds of mil­lions of peo­ple sick every year. And these dis­eases are spread­ing faster than ever.

And they’re a dif­fi­cult prob­lem to solve.

Most of these dis­eases don’t have ef­fec­tive vac­cines or treat­ments. Attacking mos­qui­toes with pes­ti­cides is un­sus­tain­able be­cause they’re be­com­ing less ef­fec­tive over time and can be toxic. Clearing stand­ing wa­ter is not enough be­cause peo­ple can never find all the places that mos­qui­toes breed. We need a new ap­proach.

Our Solution

We’re try­ing to stop bad mos­qui­toes by rais­ing and re­leas­ing good ones.

Good bugs are the same species of mos­quito as the bad bugs that spread dis­ease. Our good bugs are male mos­qui­toes that have a nat­u­rally-oc­cur­ring bac­te­ria called Wolbachia which makes them un­able to have off­spring with wild fe­male mos­qui­toes. Male mos­qui­toes can’t bite or spread dis­ease, so good bugs will stop bad ones from re­pro­duc­ing. Over time, there will be fewer and fewer bad mos­qui­toes.

This tech­nique uses a nat­u­rally oc­cur­ring bac­te­ria and uses no chem­i­cals, no tox­ins and does­n’t in­volve ge­netic mod­i­fi­ca­tion. Similar ap­proaches have been used to safely com­bat other pests for decades. We’re com­bin­ing the Debug team’s sci­en­tific and en­gi­neer­ing ex­per­tise with the help of in­ter­na­tional part­ners to raise and re­lease lots of good bugs and stop bad mos­qui­toes that can spread dis­ease.

Find out more about good mos­qui­toes and how we raise them

Our First Steps

Fighting bad bugs one com­mu­nity at a time.

We’re cur­rently de­vel­op­ing our tech­nolo­gies and meth­ods to tar­get Aedes ae­gypti mos­qui­toes. This means part­ner­ing closely with sci­en­tists, com­mu­ni­ties, and gov­ern­ments.

Debug is off to a good start, but there is still plenty to do. We look for­ward to work­ing with com­mu­ni­ties to show that by re­leas­ing enough good bugs Debug can have a real im­pact on mos­quito pop­u­la­tions and dis­ease. Eventually, we hope to help mil­lions of peo­ple live longer, health­ier lives.

Want to help us stop bad bugs?

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.

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.