10 interesting stories served every morning and every evening.

Half-Baked Product

weli.dev

The Founder

A freshly minted founder de­cides to get into the oven busi­ness. He can’t bake a cake or knead bread, but he knows the kitchen ap­pli­ance mar­ket in­side and out. He’s an­a­lyzed every busi­ness in Spain and reached a con­clu­sion: if he sells a new oven to the coun­try’s pizza mak­ers, pas­try chefs, and bak­ers, he only needs to cap­ture 10% of the mar­ket to be­come a bil­lion­aire.

10% al­ways looks small when you type it into an Excel spread­sheet.

The founder is very good. He builds a plan that, on pa­per, is flaw­less and air­tight: man­u­fac­ture a more ef­fi­cient oven us­ing new tech­nol­ogy. Selling it is easy. Want to work more ef­fi­ciently? Buy our oven. End of pitch. The founder has ex­pe­ri­ence talk­ing to in­vestors and raises enough money to build an MVP.

The Engineer

The founder looks for some­one who knows how to build ovens and finds an en­gi­neer from a pres­ti­gious school. The en­gi­neer has spent 10 years build­ing ovens and knows how to make one. More than that: he’s the kind of per­son who spends all day talk­ing and ar­gu­ing about ovens. He goes to oven con­fer­ences. When he gets home at night, he ar­gues for hours on Italian fo­rums about which type of oven is best. The Italian fo­rums are, to him, the ul­ti­mate source of oven-truth.

He’s tired of build­ing ovens at Corporate Oven. Ten years mak­ing the same oven he’s told to make. He wants the free­dom to build his own.

The founder of­fers him 20% of the com­pany and to­tal free­dom to build the per­fect oven. The salary is­n’t great, but there’s the promise: if things go well, some­day he could be a mil­lion­aire. And some­thing more im­por­tant than money: he’ll fi­nally get to build the oven of his dreams.

He signs.

The MVP

With lit­tle money and lots of en­thu­si­asm, they build an MVP. Two months later it’s done. It’s a func­tional oven and, more im­por­tantly, it has one im­prove­ment over tra­di­tional ovens: you in­put the amount of flour, yeast, and wa­ter, and the oven au­to­mat­i­cally knows when to stop for a per­fect bake.

In the­ory.

In prac­tice it does­n’t work very well, but it’s good enough for an MVP. They go to mar­ket and sell 5 pro­to­types: two bak­ers the founder knows, the en­gi­neer’s mother who bakes cakes, and two oven en­thu­si­asts who buy it out of cu­rios­ity.

The feed­back is unan­i­mous:

My bread came out burnt.” The cake was raw.” Every sin­gle pizza burns.”

But all things con­sid­ered, it’s pos­i­tive: a third of the time, the pro­to­type worked and pro­duced the per­fect cake, bread, or pizza.

This is just a pro­to­type. Imagine when we ship the real prod­uct. Trust us.”

And with that, the founder goes to see an old col­league who now works at a VC: In 2 months we’ve built a pro­to­type, we al­ready have 5 cus­tomers, and it’s very promis­ing. We just need money to scale, build a bet­ter ver­sion, and sell to every bak­ery and pas­try shop in Spain.”

Nobody asks whether the 5 cus­tomers would buy again.

The founder is very good. He raises 5 mil­lion. Ovens Inc. is born.

Forum of the Bakers

They start im­prov­ing the pro­to­type. The en­gi­neer re­al­izes some­thing: build­ing an al­go­rithm that cal­cu­lates bak­ing time for cakes, piz­zas, and bread is quite a bit more com­plex than it looked. Every dough is its own uni­verse. They need to hire more en­gi­neers.

The en­gi­neer knows ex­actly where to look. On the Italian fo­rums there are two users he’s spent years ar­gu­ing with about con­vec­tion and re­frac­tory stone: Mario and Luigi. He’s never met them in per­son, but he knows their opin­ions on ovens bet­ter than his own fam­i­ly’s. He of­fers them the same deal he got: low salary, lots of free­dom, the per­fect oven.

They sign.

Meanwhile, the founder needs to sell ovens, but Facebook and Instagram ads get no trac­tion. Turns out no­body buys a fif­teen-thou­sand-euro in­dus­trial oven be­cause it popped up in their sto­ries. So he hires a leg­endary sales team: the best sales­peo­ple in all of Spain. People who have never sold ovens, who know noth­ing about ovens, but who are hun­gry to sell and very ex­cited about the com­pany.

At first it goes badly. Few peo­ple want a new oven; they’re happy with the one they have. Why switch? Most small busi­nesses don’t care about a 15% ef­fi­ciency gain: the risk of switch­ing is too high. If Juan’s Bakery swaps ovens and the new oven fails, Juan loses his cus­tomers and shuts down. For Juan, ef­fi­ciency is op­tional; to­mor­row’s bread is not. Better to stick with the old oven, even if it’s worse on pa­per. He’d only switch if Manolo’s Bakery across the street started sell­ing cheaper bread thanks to a more ef­fi­cient oven and he had no choice. But Manolo thinks ex­actly the same as Juan, so no­body moves. Perfect equi­lib­rium. Economists have a name for this; Juan and Manolo call it com­mon sense.

Big busi­nesses are an­other story. For them, 15% ef­fi­ciency means mil­lions saved every year. And one sales­per­son man­ages to make con­tact with Pepepizza.

The Decision

Meanwhile, over in en­gi­neer­ing, things aren’t go­ing any bet­ter. The al­go­rithm is un­sta­ble. They’ve got­ten the fail­ure rate down from two thirds to one third, but each point of im­prove­ment costs twice as much as the last. And then comes the un­com­fort­able dis­cov­ery: if the oven only does two of the three things (bread, cakes, or pizza), the al­go­rithm fails just 5% of the time.

The en­gi­neer brings the pro­posal to the founder: let’s sac­ri­fice one mar­ket and have a prod­uct that works.

The founder gets an­gry. He promised the VCs 10% of Spain’s oven mar­ket. The en­tire mar­ket. We can’t sac­ri­fice any of them.”

It’s not just greed. The 5 mil­lion was raised with the en­tire mar­ket on the slide. The founder is­n’t choos­ing be­tween right and wrong: he’s choos­ing which promise to break.

The en­gi­neer goes back to his desk with his three doughs and his 33% fail­ure rate.

Mallorca

Back to sales: there’s con­tact with Pepepizza, but en­ter­prise deals don’t close over email. The founder flies to Pepepizza head­quar­ters and meets the owner. They hit it off. They hit it off so well they go to Mallorca to­gether. Nobody knows what was dis­cussed there. What’s known is that when they come back, there’s a deal. Nobody has tried the oven yet. No need. Enterprise sales is­n’t about ovens.

The hand­shake comes first. The re­quire­ments come later.

And they come. Pepepizza’s op­er­a­tions team sends the list to sales: their kitchens are cus­tom-built, so they need ovens with spe­cific di­men­sions. Oh, and a ro­tat­ing base like the one they al­ready have.

Sales replies: No prob­lem.”

The founder is eu­phoric. Pepepizza wants to buy an ini­tial batch of 500 ovens. Five hun­dred. That’s more rev­enue than every­thing since they started. For Pepepizza it’s a small pi­lot, a trial in a few lo­ca­tions be­fore de­cid­ing any­thing. For Ovens Inc. it’s bet­ting the en­tire com­pany.

Engineer, we need 500 ovens for Pepepizza. They want spe­cific di­men­sions and a base that spins. Let’s make it hap­pen.”

The en­gi­neer does­n’t faint only be­cause he’s al­ready sit­ting down.

The al­go­rithm barely works for pizza. The mold di­men­sions have spent 5 months be­ing op­ti­mized in CAD for the stan­dard size. And no­body, ever, has dis­cussed ro­tat­ing bases on the Italian fo­rums. If it’s not on the Italian fo­rums, does it even ex­ist?

The en­gi­neer opens the CAD file in front of the founder. He shows him why the new di­men­sions break the en­tire ther­mal de­sign. The founder looks at the screen, looks at the blue­prints, looks at the en­gi­neer.

But this is just chang­ing a num­ber, right?”

We can’t. Not un­til we fix the al­go­rithm and re­design the in­verter for the new sizes. That’s 5 more months.”

The Miracle

It’s not 5 months.

After many lost week­ends and en­tire nights run­ning on Red Bull, in 3 weeks there’s a pro­to­type for Pepepizza. Compromises were made. The al­go­rithm still fails plenty, but at least the di­men­sions are right. The ro­tat­ing base? Doesn’t ex­ist yet. Pepepizza is promised an add-on in a cou­ple of months.” Pepepizza says fine.

The Candle Button

Sales has had a rev­e­la­tion: if you sell the oven that ex­ists to­day, you don’t sell ovens. You have to sell the oven that will ex­ist in 6 months. Promise fea­tures. It worked last time: they promised Pepepizza the im­pos­si­ble and the team de­liv­ered in 3 weeks. What could go wrong?

Sales, of course, has no idea what hap­pens af­ter the con­tract is signed. The com­mis­sion is paid at sign­ing. Whatever comes next is an­other de­part­men­t’s prob­lem.

Though there’s some­thing no­body in en­gi­neer­ing wants to look at: Ovens Inc. does­n’t live off sell­ing ovens (for now). It lives off rais­ing rounds. And rounds are raised with pro­jec­tions, and pro­jec­tions are man­u­fac­tured out of what­ever sales promises. The No prob­lem” peo­ple are also the only life raft.

And then the daily re­quests be­gin:

A lot of our po­ten­tial cus­tomers make birth­day cakes. When they ask if we have spe­cial birth­day-cake fea­tures, we have to say no, and we lose them. Can we add the fea­ture?”

The founder has no doubts. Last time a fea­ture was re­quested, they es­ti­mated 5 months and did it in 3 weeks. And this is much eas­ier. It’s just a sim­ple but­ton that adds can­dles.”

The en­gi­neer is climb­ing the walls. They still haven’t fin­ished clean­ing up the Pepepizza wreck­age. This is ab­solutely not what peo­ple dis­cuss on the Italian fo­rums. Adding a can­dle but­ton is an in­sult to the state of the art, or rather, the state of the oven.

But he caves.

Just this once.”

Sales sells 2 more ovens a month thanks to the new but­ton. Or so they be­lieve. They have no way of check­ing whether they’d have sold them any­way with­out the but­ton.

The Second-Highest Priority

Soon af­ter, more fea­ture re­quests ar­rive.

My oven at home con­nects to the fire­place. Does yours?”

I make a lot of wed­ding cakes, what have you got for me?”

Do you have a Ramadan mode?”

They build all of them.

Engineering stops try­ing to build a good oven and starts adding but­tons and fea­tures. Nobody made that de­ci­sion. It just hap­pened, one ticket at a time.

And there’s a de­tail every­one seems to ig­nore: each but­ton takes longer than the last. The can­dle but­ton took three days. The fire­place one, a week. The lat­est one took three. It’s not that the en­gi­neers are get­ting slower: it’s that every new but­ton has to co­ex­ist with all the pre­vi­ous but­tons.

Meanwhile, cus­tomers who buy the oven re­turn it within a week. The rea­son? The bread and cakes still burn 10% of the time. The MVP prob­lem. The orig­i­nal one. The one from day one. Underneath the twelve new but­tons sits the same al­go­rithm from the very first day, and a baker who loses one out of every ten batches is not con­soled by the fact that the oven does can­dles.

When a cus­tomer calls to can­cel, sup­port tries to re­tain them by of­fer­ing what’s avail­able: the new but­ton from the lat­est re­lease. The baker whose bread keeps burn­ing is of­fered Ramadan mode. The baker leaves any­way. It gets logged as feed­back. Engineering has no time to stop and re­think their ap­proach, be­cause stop­ping is­n’t in the back­log.

And then the worst day ar­rives. Pepepizza calls:

Where is the ro­tat­ing base?”

The founder swal­lows hard. The ticket has been sit­ting on the kan­ban board for a month and a half. It’s not that no­body saw it: it’s that every week some­thing jumped ahead of it. The can­dle but­ton. The fire­place thing. The Ramadan thing. The ro­tat­ing base was al­ways the sec­ond-high­est pri­or­ity, and the sec­ond-high­est pri­or­ity never gets done. So he an­swers with con­vic­tion:

Almost fin­ished.”

The Request

Guys, these next two weeks we’re go­ing to fo­cus on the ro­tat­ing base,” says the founder.

The team can’t be­lieve it. They al­ready said the ro­tat­ing base was im­pos­si­ble. They al­ready ex­plained why. Besides, Mario has va­ca­tion planned, the va­ca­tion he was promised af­ter the Pepepizza crunch. And Luigi’s per­for­mance has been slip­ping for weeks and no­body knows why.

The en­gi­neer tries one more time:

We can’t do the ro­tat­ing base right now. We need to refac­tor, con­sol­i­date, and add an ab­strac­tion layer for com­part­ments and but­tons. Otherwise, every new fea­ture takes twice as long as the last. Also, Mario has va­ca­tion planned, and I’m not sure Luigi is in a good place to be asked for more.”

The founder nods. He gets it. He gets all of it.

But this is a startup. And star­tups are built with blood and sweat. Everyone here has to sac­ri­fice. You have two weeks.”

And he’s not say­ing it from the couch: the founder takes the low­est salary in the com­pany and has­n’t had a va­ca­tion in two years (Mallorca was work). He’s the first to live the speech. That is ex­actly the prob­lem.

When Everything Is Urgent, Nothing Is

There’s a new crunch. This time with less en­thu­si­asm and less pas­sion. The first one was an epic feat; this one is pa­per­work. Mario can­cels his va­ca­tion. Luigi keeps show­ing up. Nobody asks how he’s do­ing.

Two weeks later, the re­sult: a ro­tat­ing base that re­quires three spe­cial but­ton com­bi­na­tions. It’s in­com­pat­i­ble with every other mode, but it’s not like no­body tested it.

It gets in­stalled at Pepepizza. Pepepizza’s re­sponse:

It does­n’t ro­tate clock­wise. We’re go­ing with Corporate Oven.”

The team: dev­as­tated. They just lost their most im­por­tant cus­tomer. Nobody in prod­uct ever com­mu­ni­cated that it had to ro­tate clock­wise. Somewhere be­tween sales, the founder, and the back­log, the sin­gle most im­por­tant re­quire­ment of the pro­ject sim­ply never ex­isted.

And the worst part is­n’t los­ing Pepepizza. The worst part is that the changes made for the ro­tat­ing base will haunt the oven’s de­sign un­til the end of time. The cus­tomer leaves now. Their ro­tat­ing base stays for­ever.

No Blockers

A month later, Mario leaves the com­pany. He’s not go­ing to a com­peti­tor and he has­n’t found any­thing bet­ter: he leaves be­cause it’s the only way he can see to get a va­ca­tion. In the retro, it gets writ­ten down as a learning.”

Luigi stays. He now main­tains the can­dle but­ton. It’s his spe­cialty, they say. Nobody re­mem­bers who de­cided that, but it’s his spe­cialty. He keeps show­ing up every day, keeps do­ing his work. On the Italian fo­rums, peo­ple ask why Luigi has­n’t posted in 5 months. In standups he says no block­ers” and every­one moves on to the next per­son.

Epilogue

Six months later.

Ovens Inc. is still alive. Technically. There’s money for eight more months and a new ver­sion of the pitch deck where the word oven” no longer ap­pears: it’s now an intelligent bak­ing plat­form.”

The en­gi­neer left in March. He did­n’t slam the door or write a vi­ral thread about his ex­pe­ri­ence. One day he sim­ply stopped ar­gu­ing in meet­ings, a month later he stopped show­ing up, and his farewell was a three-line email. Nobody has touched his code since. Nobody dares.

The founder has it all fig­ured out: the prob­lem was never the plan. The prob­lem was the ex­e­cu­tion. He needs an­other en­gi­neer.

And he finds one.

Young, grad­u­ated from a pres­ti­gious school, has spent years build­ing ovens at Corporate Oven and he’s tired. More than that: he’s the kind of per­son who spends all day talk­ing and ar­gu­ing about ovens. He goes to oven con­fer­ences. When he gets home at night, he ar­gues for hours on Italian oven fo­rums about which type of oven is best. On the fo­rum an old user warns Make sure that you sup­port ro­tat­ing bases day 1”. The young en­gi­neer laughs. Who uses ro­tat­ing bases in an oven?

The founder of­fers him 5% of the com­pany. It can’t be 20 any­more; there’s been di­lu­tion (funding-round stuff, it’s com­pli­cated). But the salary does­n’t mat­ter, be­cause he’s of­fer­ing the im­por­tant thing: to­tal free­dom to build the per­fect oven.

The kid smiles.

Virginia Bans Sale of Geolocation Data

www.hunton.com

On April 13, 2026, Virginia Governor Abigail Spanberger signed into law S.B. 338, which amends the Virginia Consumer Data Protection Act (“VCDPA) to pro­hibit the sale of ge­olo­ca­tion data. Notably, the VCDPA de­fines sale” more nar­rowly than other state com­pre­hen­sive pri­vacy laws, as the ex­change of per­sonal data for mon­e­tary con­sid­er­a­tion by the con­troller to a third party.”

The ban on the sale of ge­olo­ca­tion data goes into ef­fect on July 1, 2026.

Virginia fol­lows Maryland and Oregon in ban­ning the sale of ge­olo­ca­tion data. Both Maryland and Oregon more broadly de­fine sale” to mean the ex­change of per­sonal data for mon­e­tary or other valu­able con­sid­er­a­tion.” Virginia joins sev­eral other states that have re­cently pro­posed leg­is­la­tion with sim­i­lar bans, in­clud­ing California, Massachusetts, Vermont and Washington State. The leg­isla­tive ac­tiv­ity fol­lows reg­u­la­tory scrutiny on the sale of ge­olo­ca­tion data, in­clud­ing the California Attorney General’s in­ves­ti­ga­tion into the lo­ca­tion data in­dus­try in March 2025, and a 2024 FTC set­tle­ment ban­ning a data bro­ker from sell­ing ge­olo­ca­tion data.

v3.0.0 · immich-app/immich · Discussion #29439

github.com

v3.0.0

Welcome to Immich v3.0.0!

After months of hard work from the team and our amaz­ing con­trib­u­tors, we’re thrilled to an­nounce the next ma­jor ver­sion of Immich: v3.0.0! 🎉

Breaking changes

This re­lease in­cludes sev­eral break­ing changes; read the full mi­gra­tion guide here. It’s worth men­tion­ing that many of the break­ing changes are up­dates to API end­points and af­fect only third-party tools that in­te­grate with Immich’s API. For the vast ma­jor­ity of users, up­dat­ing works ex­actly as it al­ways has.

How to up­date

First, up­date the IMMICH_VERSION in your .env file to v3:

- IMMICH_VERSION=v2 + IMMICH_VERSION=v3

Then run the usual up­date com­mands:

docker com­pose pull && docker com­pose up -d

Release can­di­dates

If you missed it, v3.0.0 was the first time we used re­lease can­di­dates, also known as pre­re­leases. Release can­di­dates are tested but not yet of­fi­cial re­leases of Immich, and they al­low us to find and fix any out­stand­ing bugs be­fore a fi­nal re­lease. If you would like to be no­ti­fied about re­lease can­di­dates di­rectly through Immich, you can change the re­lease chan­nel from Stable” to Release can­di­date” in the Admin set­tings > Version check op­tions (here).

New Merch

As part of this re­lease, we’re happy to an­nounce we also have some new swag for you!

Kids cloth­ing: For those who are likely the rea­son for your Immich li­brary’s size

Colored em­broi­dery: We now have clothes with a full color em­broi­dered Immich logo

Check it out now at https://​im­mich.store!

Highlights

Now, let’s get right into all the new fea­tures in this re­lease:

Mobile non-de­struc­tive edit­ing

Workflows (preview)

Background backup im­prove­ment

Recently added page

Integrity checks

Slideshow on mo­bile app

HLS and real-time video transcod­ing (preview)

New video player for web

Open photo in Immich as gallery on Android

OCR on mo­bile app

Upload as­set di­rectly to al­bum on the mo­bile app

Option to se­lect im­age size when shar­ing on the mo­bile app

Timeline per­for­mance im­prove­ment for brows­ing a large amount of as­sets in a sin­gle month

Mobile non-de­struc­tive edit­ing

This is a fol­low-up to Image Editing on the web, which was re­leased in v2.5.0. This fea­ture al­lows you to make non-de­struc­tive ed­its to your pho­tos in­side of Immich. Until now, the mo­bile ed­i­tor used a com­pletely dif­fer­ent sys­tem that cre­ated new as­sets in­stead of edit­ing the photo in place.

With this up­date, we bring a new, eas­ier-to-use ed­i­tor to mo­bile de­vices that has the same fea­tures as the web ver­sion. You can now edit pho­tos di­rectly in the mo­bile app, in­clud­ing crop­ping, ro­tat­ing, and ad­just­ing your im­ages with­out ever touch­ing the orig­i­nal file. Similar to the web, ed­its are non-de­struc­tive, so you can re­visit or re­vert them at any time. You can even make ed­its on mo­bile and then ad­just them on the web later!

Some fea­tures from the pre­vi­ous mo­bile edit­ing im­ple­men­ta­tion have been re­moved in­clud­ing:

Recoloring pho­tos

Editing live pho­tos

Editing lo­cal as­sets

We have plans to bring some of these ca­pa­bil­i­ties back in fu­ture re­leases.

Workflows (preview)

The first pre­view of Workflows is here! Workflows let you au­to­mate ac­tions in your li­brary by chain­ing trig­gers, fil­ters, and ac­tions to­gether with a drag-and-drop builder. This is the foun­da­tion for many ex­cit­ing au­toma­tions to come, and we’d love your feed­back as we con­tinue build­ing on it.

You can ac­cess the fea­ture from Utilities > Workflows on the web.

From there, you can ei­ther cre­ate a new blank work­flow or browse the pre­made tem­plates to get a ba­sic un­der­stand­ing of how work­flows can be used.

Workflows ed­i­tor

In the work­flows ed­i­tor, you can switch be­tween the Visual or JSON ed­i­tor. The vi­sual ed­i­tor is nice for build­ing out the work­flow; the JSON ed­i­tor is nice for shar­ing and re­ceiv­ing work­flow con­tent from oth­ers.

In each work­flow, there is a trig­ger and a se­quence of steps.

Trigger: this is the en­try point of each work­flow; when the trig­ger oc­curs, the steps are eval­u­ated.

Steps: they in­clude Filters (conditions) and Actions (effects); they can be com­bined to pro­duce the de­sired ef­fect of the use case you aim for.

Sharing a work­flow

You can share the work­flow you made with oth­ers in two ways: text and JSON. Text is nice for shar­ing on a fo­rum or for show-and-tell con­tent. JSON is nice for oth­ers to make an ex­act copy of your work­flow’s con­fig­u­ra­tion.

You can copy the text in the work­flows sum­mary panel on the lower right of the screen

You can share the JSON con­tent from the copy work­flows but­ton in the app bar, switch to the JSON ed­i­tor, or use the Show schema but­ton in the con­text menu in the work­flows list

Note

Please use this dis­cus­sion thread to pro­pose new ideas of trig­gers and ac­tions. We are look­ing for ex­ten­sive feed­back and sug­ges­tions from you all.

Background backup im­prove­ments

Background backup on Android is now sig­nif­i­cantly more re­li­able. Previously, the back­ground backup on Android was lim­ited to newly taken pho­tos. Now, the app uses a new pe­ri­odic task sched­uler, which al­lows you to up­load your en­tire li­brary in the back­ground, and it plays nicer with Android’s back­ground ex­e­cu­tion lim­its, prop­erly cleans up tasks, and warns you when bat­tery op­ti­miza­tion and no­ti­fi­ca­tion set­tings might in­ter­fere with back­ups.

On iOS, the back­ground re­fresh task now runs its sync and up­load work in par­al­lel, so up­loads ac­tu­ally start within the short time win­dow iOS al­lows.

Recently added page

A new Recently Added” page on the web and mo­bile lets you browse your li­brary sorted by when as­sets were added to Immich, rather than when they were taken. This makes it eas­ier to find what’s new when brows­ing a new batch of im­ports. You can find the new page in the Explore” tab on the web and in the Search” tab on mo­bile.

Integrity checks

The main­te­nance page has got­ten a new ad­di­tion: in­tegrity re­ports! Immich will scan its di­rec­to­ries on your file sys­tem, and com­pare it to what it has stored in its data­base. If there are de­vi­a­tions, they will be sur­faced as

un­tracked, if there is a file in Immich’s di­rec­to­ries that Immich does not know of

miss­ing, if Immich ref­er­ences a file in its data­base that does not ex­ist in that place (anymore)

a check­sum mis­match, if the check­sum of the file on disk does not match the check­sum Immich has stored for that file. Typically, this would hap­pen through file cor­rup­tion but could also be the re­sult of a bad re­name.

You can con­fig­ure when and how long the job runs each night.

Slideshow (mobile)

The slideshow ex­pe­ri­ence comes to mo­bile! You can now sit back and let your pho­tos and videos play across the screen, just like on the web.

HLS and Real-Time Video transcod­ing (preview)

Immich can now transcode videos on-the-fly with­out need­ing to gen­er­ate of­fline transcodes. This has been a long-re­quested fea­ture with many ben­e­fits:

Quality switch­ing (both man­ual and au­to­matic)

Transcoding to the best codecs sup­ported by the client

Lower stor­age over­head when of­fline transcod­ing is dis­abled

HDR for com­pat­i­ble clients (not im­ple­mented yet)

Remuxing rather than transcod­ing the orig­i­nal when band­width al­lows it (not im­ple­mented yet)

Please note that this fea­ture is still ex­per­i­men­tal and can change be­hav­ior from ver­sion to ver­sion. It’s cur­rently only im­ple­mented in the web app, with the mo­bile app im­ple­men­ta­tion in progress.

To en­able real-time transcod­ing, go to the video transcod­ing set­tings (scroll down). Offline transcod­ing is­n’t di­rectly af­fected by en­abling it, so if you’d like to dis­able of­fline transcod­ing, you should also ad­just the transcode pol­icy.

Note

For as­sets im­ported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

Keep in mind that your server needs to be pow­er­ful enough to transcode in real-time for this fea­ture to work well. Hardware ac­cel­er­a­tion is rec­om­mended, but not re­quired, when us­ing this fea­ture.

New video player for web

A new cus­tom video player on the web app en­sures all your de­vices share the same con­trols and lay­out, match­ing the Immich de­sign. Some ba­sic func­tions, like chang­ing the play­back rate, are avail­able. This should also fix a lot of the prob­lems on iOS, where the OSs con­trols are hid­den be­hind the Immich navbar.

Open pho­tos in Immich as a gallery on Android

Immich can now act as a gallery/​im­age viewer app on Android. Tap a photo or video in an­other app, choose Immich, and it opens di­rectly in the as­set viewer with op­tions to share the file or up­load it to your li­brary.

This is the first it­er­a­tion of the fea­ture, and re­fine­ments to how Immich rec­og­nizes files that are al­ready in your li­brary are on the way

OCR on the mo­bile app

The as­set viewer now has a tog­gle that high­lights rec­og­nized text in a photo, and you can se­lect and copy it di­rectly from the im­age.

Upload as­sets di­rectly to an al­bum on mo­bile

You can now up­load lo­cal pho­tos di­rectly to an al­bum in the mo­bile app, in­clud­ing from the as­set bot­tom sheet, in­stead of up­load­ing first and or­ga­niz­ing later. A small change that re­moves a lot of fric­tion from the backup-and-or­ga­nize flow.

Select im­age size when shar­ing on mo­bile

When shar­ing pho­tos from the mo­bile app, you can now choose the im­age size be­fore send­ing; it is handy for keep­ing shared files small for mes­sag­ing apps while pre­serv­ing the op­tion to share at full qual­ity when needed.

You can change the de­fault be­hav­ior in the App Settings > Preferences

You can also pick the op­tion when shar­ing on-the-fly by long press­ing the Share but­ton

Timeline per­for­mance Improvements

Browsing months with a large num­ber of as­sets is now dra­mat­i­cally smoother and pre­vents the browser tab from lock­ing up when your in­stance en­coun­ters that sce­nario.

Support Immich

If you find the pro­ject help­ful, you can sup­port Immich by pur­chas­ing a prod­uct key at https://​buy.im­mich.app or our mer­chan­dise at https://​im­mich.store

What’s Changed

🚨 Breaking Changes

refac­tor!: mi­grate class-val­ida­tor to zod by @timonrieger in refac­tor!: mi­grate class-val­ida­tor to zod #26597

The Free Market Lie: Why Switzerland Has 25 Gbit Internet and America Doesn't

stefan.schueller.net

You may have heard about 25 Gbit sym­met­ri­cal in­ter­net in Switzerland. This is of­ten cited as the fastest ded­i­cated (non-shared) res­i­den­tial con­nec­tion in the world. However, did you ever won­der why Switzerland has such fast in­ter­net at a rea­son­able price while the United States and other coun­tries like Switzerland’s neigh­bor Germany are falling be­hind?

What is the fun­da­men­tal dif­fer­ence be­tween the coun­tries that leads to such a stark dif­fer­ence in in­ter­net speeds and prices?

Free mar­kets, reg­u­la­tion, tech­nol­ogy, or all three?

Let’s take a closer look at the sit­u­a­tion in Switzerland, Germany, and the United States.

Note

This ar­ti­cle is writ­ten by me and spell checked with AI. Many of the im­ages are gen­er­ated by AI. They are mostly to ex­plain cer­tain points and break up the wall of text.

This Article is also avail­able as a video (My first):

As men­tioned, in Switzerland, you can get 25 Gigabit per sec­ond fiber in­ter­net to your home, sym­met­ric and ded­i­cated. If you don’t need such ex­treme speed, you can get 1 or 10 Gigabit from mul­ti­ple com­pet­ing providers for very lit­tle money. All over a con­nec­tion that is­n’t shared with your neigh­bors. In fact, some­one could of­fer 100 Gigabit or more to­day; there is noth­ing pre­vent­ing this other than the cost of end­point equip­ment.

In the United States, if you’re lucky enough to have fiber, you might get 1 Gigabit. But of­ten it’s shared with your neigh­bors. And you usu­ally have ex­actly one choice of provider. Maybe two, if you count the ca­ble com­pany that of­fers slower speeds for the same price.

In Germany, you are in a some­what sim­i­lar sit­u­a­tion to the United States. Fiber ser­vice is lim­ited to one provider and is of­ten shared with your neigh­bors.

The United States prides it­self on free mar­kets. On com­pe­ti­tion. On let­ting busi­nesses fight it out. A dereg­u­lated mar­ket with no brakes.

Germany, on the other hand, is fa­mous for over-reg­u­la­tion, mak­ing it dif­fi­cult for busi­nesses to op­er­ate, yet it is in a sim­i­lar sit­u­a­tion to the United States.

Switzerland has a highly reg­u­lated tele­com sec­tor with strong over­sight and gov­ern­ment-backed in­fra­struc­ture pro­jects, but reg­u­la­tions in Switzerland dif­fer from those in Germany.

So why is the coun­try that wor­ships free mar­kets pro­duc­ing stag­na­tion, mo­nop­o­lies, and in­fe­rior in­ter­net, while the coun­try with heavy reg­u­la­tion is pro­duc­ing hy­per-com­pe­ti­tion, world-lead­ing speeds, and con­sumer choice?

And at the same time, the coun­try with the most reg­u­la­tion is suf­fer­ing the same prob­lems as the coun­try with the least.

The an­swer re­veals a fun­da­men­tal truth about cap­i­tal­ism and reg­u­la­tion that most peo­ple get wrong.

To un­der­stand the fail­ure, you have to un­der­stand what econ­o­mists call a natural mo­nop­oly.”

A nat­ural mo­nop­oly is an in­dus­try where the cost of build­ing the in­fra­struc­ture is so high, and the cost of serv­ing an ad­di­tional cus­tomer is so low, that com­pe­ti­tion ac­tu­ally de­stroys value.

Think about wa­ter pipes. It would be in­sane to have three dif­fer­ent wa­ter com­pa­nies each dig­ging up your street to lay their own pipes. You’d have three times the con­struc­tion, three times the dis­rup­tion, three times the cost. And at the end of it, you’d still only use one of them.

The ra­tio­nal so­lu­tion is to build the in­fra­struc­ture once, as a shared, neu­tral as­set, and let dif­fer­ent com­pa­nies com­pete to pro­vide the ser­vice over that in­fra­struc­ture.

That’s how wa­ter works. That’s how elec­tric­ity works in most places. And in Switzerland, that’s how fiber op­tic in­ter­net works.

But in the United States and Germany, they did the op­po­site.

In Germany, the free mar­ket” ap­proach meant let­ting any com­pany dig up the street to lay their own fiber. The re­sult is called overbuild.” Multiple net­works run­ning in par­al­lel trenches, of­ten just me­ters apart.

Billions of eu­ros spent on re­dun­dant con­crete and as­phalt. Money that could have been spent on faster equip­ment, lower prices, or con­nect­ing rural ar­eas, in­stead wasted on dig­ging the same hole twice, lit­er­ally.1

But is­n’t Germany heav­ily reg­u­lated? Yes, but the reg­u­la­tions fo­cus heav­ily on in­fra­struc­ture com­pe­ti­tion rather than duct shar­ing en­force­ment.

Germany cham­pi­ons in­fra­struc­ture com­pe­ti­tion, mean­ing it prefers mul­ti­ple com­pa­nies lay­ing their own ca­bles rather than shar­ing a sin­gle net­work. At the same time, the reg­u­la­tory sys­tem wastes enor­mous amounts of time on wait­ing for dig­ging per­mits and on court­room bat­tles just to ob­tain ba­sic in­for­ma­tion about ex­ist­ing ducts.

Germany also has a large in­cum­bent, Deutsche Telekom, which uses ex­ist­ing reg­u­la­tions to its com­pet­i­tive ad­van­tage against smaller ISPs. While Germany does have laws re­quir­ing Deutsche Telekom to share its ducts with com­peti­tors, in prac­tice smaller ISPs face un­rea­son­able hur­dles such as high fees, pro­ce­dural de­lays, and le­gal dou­ble bur­dens that un­der­mine ef­fec­tive ac­cess.

Sharing ducts is not as bad as dig­ging two trenches but it is still a waste of re­sources.

The United States took a dif­fer­ent path, but the re­sult is equally bad. Instead of over­build, they got ter­ri­to­r­ial mo­nop­o­lies, in some places paid for by the fed­eral gov­ern­ment.

In most American cities, you don’t have a choice of fiber providers. You have what­ever in­cum­bent hap­pens to serve your neigh­bor­hood. Comcast has one area. Spectrum has an­other. AT&T has a third.

This is mar­keted as com­pe­ti­tion. But it’s not. It’s a car­tel. Each com­pany gets its own pro­tected ter­ri­tory, and con­sumers get no choice. If you don’t like your provider, your only al­ter­na­tive is of­ten DSL from the 1990s or a cel­lu­lar hotspot.

This is what hap­pens when you let nat­ural mo­nop­o­lies op­er­ate with­out over­sight. They don’t com­pete on price or qual­ity. They ex­tract rent.

And be­cause these net­works are built on the cheap us­ing P2MP, or shared ar­chi­tec­ture, your gigabit” con­nec­tion is shared with your en­tire neigh­bor­hood. At 8 PM, when every­one streams Netflix, that gi­ga­bit be­comes 200 megabits. Or 100. Or less.

The provider still charges you for gigabit.” They just don’t tell you that you’re shar­ing it with 31 other house­holds.

And it gets worse. In the United States, even if a com­peti­tor wanted to chal­lenge the in­cum­bent, they of­ten can’t. Because the Point of Presence, the cen­tral hub where all the fiber lines from homes con­verge, is pri­vate. It be­longs to Comcast or AT&T. Your fiber ter­mi­nates in their build­ing. A com­peti­tor can’t just in­stall equip­ment there. They would have to build their own net­work from scratch, dig­ging up the same streets, to reach you.

Now look at Switzerland. Here, the phys­i­cal in­fra­struc­ture, the fiber in the ground, is treated as a neu­tral, shared as­set. It’s built once, of­ten by a pub­lic or semi-pub­lic en­tity.

Every home gets a ded­i­cated 4-strand fiber line. Point-to-Point. Not shared. Not split 32 ways.

That ded­i­cated fiber ter­mi­nates in a neu­tral, open hub. And any in­ter­net ser­vice provider can con­nect to that hub.

Init7, Swisscom, Salt, or a tiny lo­cal ISP, they all have equal ac­cess to the phys­i­cal line that goes into your home.2

This means you, the con­sumer, have gen­uine choice. When you sign up with a provider, you sim­ply give them your OTO (Optical Termination Outlet) num­ber, the unique iden­ti­fier printed on the fiber op­tic plate in your home. It tells the provider ex­actly which fiber con­nec­tion is yours. That’s it. No tech­ni­cian needs to visit. No one needs to dig up your street. You just call, give them the num­ber, and within days (not al­ways the case…), your new ser­vice is ac­tive.

And be­cause your home has four sep­a­rate fiber strands, you’re not locked into a sin­gle provider. You can have Init7 on one strand, Swisscom on an­other, and a lo­cal util­ity on a third. You can switch providers with a phone call. You can try a new provider with­out can­cel­ing your old one first. The com­pe­ti­tion hap­pens on price, speed, and cus­tomer ser­vice but not on who hap­pens to own the ca­ble in front of your house.

In Switzerland, you can get 25 Gigabit per sec­ond fiber to your home. Today. Symmetric. Dedicated. Not shared with your neigh­bors.

In Switzerland, you have a choice of a dozen or more providers in most cities. Prices are com­pet­i­tive. Customer ser­vice mat­ters be­cause you can leave at any time.

In the United States, the ma­jor­ity of house­holds have only one choice for high-speed in­ter­net. Speeds are lower. Prices are higher. And the tech­nol­ogy is of­ten a decade be­hind.

The free mar­ket” promised in­no­va­tion. It de­liv­ered rent-seek­ing. The in­cum­bents have no in­cen­tive to up­grade be­cause you have nowhere else to go.

American broad­band prices have risen faster than in­fla­tion for decades. Speeds have in­creased only when a com­peti­tor, usu­ally a mu­nic­i­pal util­ity, forces the in­cum­bent to re­spond.

Without com­pe­ti­tion, there is no in­no­va­tion. There is only profit ex­trac­tion.

Switzerland did­n’t ar­rive at this model by ac­ci­dent nor did it hap­pen be­cause tele­com com­pa­nies were feel­ing gen­er­ous. It hap­pened be­cause reg­u­la­tors forced it to hap­pen.

Back in 2008, when the in­dus­try sat down at the Round Table or­ga­nized by the Federal Communications Commission, it was Swisscom, the in­cum­bent it­self, that pushed for the four-fiber Point-to-Point model. The com­pany ar­gued that a sin­gle fiber would cre­ate a mo­nop­oly and that reg­u­la­tion would be nec­es­sary.3

So the stan­dard was set. Four fibers per home. Point-to-Point. Open ac­cess for com­peti­tors on Layer 1 - the phys­i­cal fiber it­self.4

Then, in 2020, Swisscom changed course. The com­pany an­nounced a new net­work ex­pan­sion strat­egy, this time us­ing P2MP, the shared model with split­ters. On pa­per, they ar­gued it was cheaper and faster to de­ploy.

GEPON P2MP Splitter

But the ef­fect was clear. Under the P2MP de­sign, com­peti­tors would no longer have di­rect ac­cess to the phys­i­cal fiber. Instead of plug­ging into their own ded­i­cated fiber strand, they would have to rent ac­cess from Swisscom at a higher net­work layer - ef­fec­tively be­com­ing re­sellers of Swisscom’s in­fra­struc­ture. The open, com­pet­i­tive ma­trix that had been care­fully built over years would dis­ap­pear.

The small ISP Init7 filed a com­plaint with Switzerland’s com­pe­ti­tion au­thor­ity, COMCO, which later opened an in­ves­ti­ga­tion. In December 2020, they is­sued a pre­cau­tion­ary mea­sure: Swisscom could not con­tinue its P2MP roll­out un­less it guar­an­teed the same Layer 1 ac­cess that the orig­i­nal stan­dard pro­vided.5

Swisscom fought this all the way to the Federal Court. They lost. In 2021, the Federal Administrative Court con­firmed COMCOs mea­sures, stat­ing that Swisscom had failed to demon­strate sufficient tech­no­log­i­cal or eco­nomic grounds” to de­vi­ate from the es­tab­lished fiber stan­dard.5 In April 2024, COMCO fi­nal­ized its rul­ing, fin­ing Swisscom 18 mil­lion francs for vi­o­lat­ing an­titrust law.6

Note

Swisscom is 51% owned by the Swiss Confederation. So, in sim­ple terms, 51% state-owned and 49% pri­vately/​in­sti­tu­tion­ally owned. Whether this makes the fine symbolic” is a mat­ter of opin­ion.

The re­sult? Swisscom was forced to re­turn to the four-fiber, Point-to-Point ar­chi­tec­ture it had orig­i­nally cham­pi­oned.3 Competitors re­tained their di­rect, phys­i­cal ac­cess to the fiber net­work. The walled gar­den was pre­vented.

Whether in­tended or not, the ef­fect of Swisscom’s P2MP shift was clear: com­peti­tors would have been locked out of the phys­i­cal in­fra­struc­ture.

Swisscom is a bit of a walk­ing con­tra­dic­tion. Being ma­jor­ity state-owned, it’s sup­posed to be a pub­lic ser­vice. But it’s also a pri­vate com­pany, and max­i­miz­ing profit ben­e­fits the state cof­fers. But that is some­thing for an­other blog post.

This is the para­dox that con­fuses so many peo­ple.

The American and German ap­proach of let­ting in­cum­bents build mo­nop­o­lies, al­low­ing waste­ful over­build, and re­fus­ing to reg­u­late nat­ural mo­nop­o­lies is of­ten called a free mar­ket.’

But it’s not free. And it’s not a mar­ket.

True cap­i­tal­ism re­quires com­pe­ti­tion. But in­fra­struc­ture is a nat­ural mo­nop­oly. If you treat it like a reg­u­lar con­sumer prod­uct, you don’t get com­pe­ti­tion. You get waste, or you get a mo­nop­oly.

The Swiss model un­der­stands this. They built the in­fra­struc­ture once, as a shared, neu­tral as­set, and then let the mar­ket com­pete on the ser­vices that run over it.

That’s not anti-cap­i­tal­ist. It’s ac­tu­ally bet­ter cap­i­tal­ism. It di­rects com­pe­ti­tion to where it adds value, not to where it de­stroys it.

The free mar­ket does­n’t mean let­ting pow­er­ful in­cum­bents do what­ever they want. It means cre­at­ing the con­di­tions where gen­uine com­pe­ti­tion can thrive.

So what can other coun­tries learn from Switzerland? Here are the key pol­icy changes that would help:

Mandate open ac­cess to phys­i­cal in­fra­struc­ture - re­quire in­cum­bents to share fiber ducts and dark fiber with com­peti­tors at cost-based prices. This is not socialism” - it is how elec­tric­ity and wa­ter work.

Mandate open ac­cess to phys­i­cal in­fra­struc­ture - re­quire in­cum­bents to share fiber ducts and dark fiber with com­peti­tors at cost-based prices. This is not socialism” - it is how elec­tric­ity and wa­ter work.

Enforce Point-to-Point ar­chi­tec­ture - re­quire that every home gets ded­i­cated fiber strands, not shared split­ters. This en­sures com­peti­tors can ac­cess the phys­i­cal layer, not just re­sell band­width.

Enforce Point-to-Point ar­chi­tec­ture - re­quire that every home gets ded­i­cated fiber strands, not shared split­ters. This en­sures com­peti­tors can ac­cess the phys­i­cal layer, not just re­sell band­width.

Create a neu­tral fiber stan­dard - es­tab­lish na­tional stan­dards that re­quire multi-fiber de­ploy­ment to every home, as Switzerland did in 2008.

Create a neu­tral fiber stan­dard - es­tab­lish na­tional stan­dards that re­quire multi-fiber de­ploy­ment to every home, as Switzerland did in 2008.

Empower com­pe­ti­tion au­thor­i­ties - give reg­u­la­tors like COMCO real teeth to en­force these rules. Fines must be large enough to mat­ter.

Empower com­pe­ti­tion au­thor­i­ties - give reg­u­la­tors like COMCO real teeth to en­force these rules. Fines must be large enough to mat­ter.

Support mu­nic­i­pal fiber - al­low cities and towns to build their own fiber net­works when in­cum­bents fail to serve res­i­dents ad­e­quately.

Support mu­nic­i­pal fiber - al­low cities and towns to build their own fiber net­works when in­cum­bents fail to serve res­i­dents ad­e­quately.

If you care about faster in­ter­net and lower prices, push your rep­re­sen­ta­tives to sup­port these poli­cies. The tech­nol­ogy ex­ists. The money ex­ists. What is miss­ing is the po­lit­i­cal will to de­mand real com­pe­ti­tion.

Bundesnetzagentur: Bun­desnet­za­gen­tur pub­lish­es fi­nal re­port on the mon­i­tor­ing of du­pli­cate fi­bre in­fra­struc­ture pro­jects (July 2025) - https://​www.bun­desnet­za­gen­tur.de/​Shared­Docs/​Pressemit­teilun­gen/​EN/​2025/​20250730_­Dop­pelaus­bau.html ↩︎

Bundesnetzagentur: Bun­desnet­za­gen­tur pub­lish­es fi­nal re­port on the mon­i­tor­ing of du­pli­cate fi­bre in­fra­struc­ture pro­jects (July 2025) - https://​www.bun­desnet­za­gen­tur.de/​Shared­Docs/​Pressemit­teilun­gen/​EN/​2025/​20250730_­Dop­pelaus­bau.html ↩︎

Init7: Fiber7 PoPs - Business Infrastructure - https://​www.init7.net/​de/​busi­ness-in­fra­struk­tur/​fiber7-pops/ ↩︎

Init7: Fiber7 PoPs - Business Infrastructure - https://​www.init7.net/​de/​busi­ness-in­fra­struk­tur/​fiber7-pops/ ↩︎

Computerworld.ch: Swisscom krebst zu­rueck (February 2023) - https://​www.com­put­er­world.ch/​the­men/​tech­nolo­gie-und-in­no­va­tion/​swiss­com-krebst-zu­rueck ↩︎ ↩︎

Computerworld.ch: Swisscom krebst zu­rueck (February 2023) - https://​www.com­put­er­world.ch/​the­men/​tech­nolo­gie-und-in­no­va­tion/​swiss­com-krebst-zu­rueck ↩︎ ↩︎

Swissinfo.ch: Fibre-optic stan­dards sim­plify net­work­ing (January 2013) - https://​www.swiss­info.ch/​eng/​busi­ness/​fi­bre-op­tic-stan­dards-sim­plify-net­work­ing/​31974894 ↩︎

Swissinfo.ch: Fibre-optic stan­dards sim­plify net­work­ing (January 2013) - https://​www.swiss­info.ch/​eng/​busi­ness/​fi­bre-op­tic-stan­dards-sim­plify-net­work­ing/​31974894 ↩︎

Federal Administrative Court (BVGer) me­dia re­lease: Swisscom must com­ply with fi­bre-op­tic stan­dards (December 2021) - https://​www.bvger.ch/​en/​news­room/​me­dia-re­leases/​swiss­com-must-com­ply-with-fi­bre-op­tic-stan­dards-1063 ↩︎ ↩︎

Federal Administrative Court (BVGer) me­dia re­lease: Swisscom must com­ply with fi­bre-op­tic stan­dards (December 2021) - https://​www.bvger.ch/​en/​news­room/​me­dia-re­leases/​swiss­com-must-com­ply-with-fi­bre-op­tic-stan­dards-1063 ↩︎ ↩︎

COMCO (Swiss Competition Commission): Swisscom fine for vi­o­lat­ing fi­bre-op­tic stan­dards (April 2024) - https://​www.swiss­info.ch/​eng/​sci­ence/​comco-gives-swiss­com-2025-dead­line-in-fi­bre-op­tic-dis­pute/​76393735 ↩︎

COMCO (Swiss Competition Commission): Swisscom fine for vi­o­lat­ing fi­bre-op­tic stan­dards (April 2024) - https://​www.swiss­info.ch/​eng/​sci­ence/​comco-gives-swiss­com-2025-dead­line-in-fi­bre-op­tic-dis­pute/​76393735 ↩︎

CarPlay is Additive

www.caseyliss.com

Back in March, Rivian’s Chief Software Officer, Wassym Bensaid, was in­ter­viewed by the ex­cel­lent Nilay Patel for Decoder. If you’re not a Decoder lis­tener, you should be. If you’re not a sub­scriber of The Verge, you should be. But that’s not what I’m here to talk about.

In this in­ter­view — which I greatly en­joyed! — Nilay grills Wassym on all man­ner of is­sues. The whole time, though, I was wait­ing for one topic: CarPlay.

CarPlay is a way to in­ter­act with your phone via your car’s in­fo­tain­ment. Our last three cars, the el­dest of which was from the 2017 model year, have all had CarPlay. They make the ex­pe­ri­ence of be­ing in the car way way bet­ter. Any of the apps I re­ally care about, and would want to in­ter­act with while on the road, have a be­spoke CarPlay in­ter­face.

I lit­er­ally will not buy a car that does not sup­port CarPlay.

Most of the way through the episode, Nilay asked Wassym about CarPlay. The ques­tion was long, but the gist is this:

I hear from our read­ers every time I talk to a car ex­ec­u­tive that, The rea­son I want CarPlay is be­cause there’s 5,000 apps on my phone and no car OEM is ever go­ing to sup­port them in the built-in in­fo­tain­ment.” This is when you would say, Okay, pro­ject your phone to the cen­ter stack. The car’s dri­ving it­self. Have at it. Phone pro­jec­tion all day.” Do you think the tide is turn­ing, or are you still ab­solutely com­mit­ted to not hav­ing CarPlay in Rivian ve­hi­cles?

I hear from our read­ers every time I talk to a car ex­ec­u­tive that, The rea­son I want CarPlay is be­cause there’s 5,000 apps on my phone and no car OEM is ever go­ing to sup­port them in the built-in in­fo­tain­ment.”

This is when you would say, Okay, pro­ject your phone to the cen­ter stack. The car’s dri­ving it­self. Have at it. Phone pro­jec­tion all day.” Do you think the tide is turn­ing, or are you still ab­solutely com­mit­ted to not hav­ing CarPlay in Rivian ve­hi­cles?

You can read Wassym’s full an­swer at the episode link, but here’s the part that stuck out to me:

The chal­lenge with screen mir­ror­ing so­lu­tions is that they take over every sin­gle pixel in the car, and that’s not the way we see our­selves in­ter­act­ing with our users.

The chal­lenge with screen mir­ror­ing so­lu­tions is that they take over every sin­gle pixel in the car, and that’s not the way we see our­selves in­ter­act­ing with our users.

Let me help you, Wassym:

There ex­ists a fla­vor of CarPlay — CarPlay Ultra — that does take over every screen of the car. Though even CarPlay Ultra has af­for­dances for the man­u­fac­tur­er’s user in­ter­face to poke through. But no­body is ask­ing for CarPlay Ultra. We’re ask­ing for no-ad­jec­tive CarPlay.

And CarPlay does not have to take up the en­tire screen.

Here, for ex­am­ple, is a pho­to­graph of my phone con­nected to my wife’s Volvo XC90:

See those bits above and be­low the CarPlay screen? That’s Volvo UI. CarPlay lit­er­ally does not know that por­tion of the screen ex­ists.

So, Wassym, try again.

Let’s say — for dis­cus­sion — that CarPlay did take up the en­tire screen. No mat­ter what. Let’s just live in Wassym’s fan­tasy world for a lit­tle bit.

I still have news for you: CarPlay is op­tional. CarPlay is ad­di­tive.

Drivers don’t have to use CarPlay!!

If Rivian’s na­tive UI is so great, then their cus­tomers… won’t use CarPlay. It’s that sim­ple.

Nobody is ask­ing for CarPlay to be manda­tory. We just want to have it as an op­tion.

If Rivian’s in­fo­tain­ment/​soft­ware is that great, that’s swell! Then Rivian dri­vers won’t use CarPlay.

Well, un­less they wish to use one of the thou­sands of apps that is op­ti­mized for CarPlay, but does not have a na­tive ver­sion that can be in­stalled di­rectly to their Rivian.

Like, I dunno, Overcast, for ex­am­ple.

But Casey, you see, the real prob­lem is that you can use CarPlay for nav­i­ga­tion. And fancy cars like Rivians have some of the best au­to­mated dri­ving tech­nol­ogy on the mar­ket. For the dri­ver to have the best pos­si­ble ex­pe­ri­ence, the car needs to know the route the dri­ver is dri­ving.”

A fair re­tort! Conveniently, Apple is ad­dress­ing ex­actly this in iOS 27.

Ultimately, the only thing I can con­trol is my­self, and I will not buy a car that does not of­fer CarPlay. I en­joy Rivian so much — both from afar and as some­one who has dri­ven both a R1T and R1S — that I re­ally thought about get­ting on the wait­ing list for a R2. And I don’t even want a SUV!

But I won’t.

Because it does­n’t sup­port CarPlay. CarPlay sup­port is table stakes for me.

Stop be­ing stub­born, Rivian. Stop be­ing so in­tran­si­gent and dog­matic. CarPlay is ad­di­tive, and sup­port­ing CarPlay opens you up to an ad­di­tional co­hort of cus­tomers. Get off your high horse and ship it.

When you do, I’ll be there, wait­ing. I can’t wait to get in line for a R3X. 🤤

Right to Intelligence

righttointelligence.org

An American privacy emergency: Guest post from Cynthia Dwork et al.

scottaaronson.blog

Scott’s fore­word: Cynthia Dwork is Gordon McKay Professor of Computer Science at Harvard, and a pi­o­neer in the fields of dif­fer­en­tial pri­vacy and al­go­rith­mic fair­ness. On my re­cent trav­els to the SigmaWest sci­ence camp and then STOC, there was much talk about a re­cent Trump ad­min­is­tra­tion ac­tion that would ban not only dif­fer­en­tial pri­vacy, but es­sen­tially all mod­ern tech­niques for pre­serv­ing pri­vacy in large datasets, for ex­am­ple in the 2030 US Census. I re­al­ize that many of us have outrage fa­tigue,” but this par­tic­u­lar out­rage hits ex­tremely close to home for the CS the­ory com­mu­nity. So when Cynthia ap­proached me at STOC to pro­pose a guest post on the is­sue, of course I said yes. The post that she sent me, be­low, is cosigned by many other lead­ers in the field.

On June 4, 2026, the U.S. Secretary of Commerce is­sued a di­rec­tive (DAO 216 – 26) rel­e­gat­ing con­fi­den­tial­ity pro­tec­tion in all Bureau of Economic Analysis (BEA) and U.S. Census Bureau pub­li­ca­tions to tech­niques dat­ing back to the early 1970s, turn­ing its back on over half a cen­tury of progress and pro­tec­tions for data sub­jects. Advances in con­fi­den­tial­ity pro­vi­sion had en­abled the Census Bureau to share in­creas­ing quan­ti­ties of data at more gran­u­lar de­tail. The or­der will re­sult in less use­ful (or fewer avail­able) sta­tis­tics, weaker pro­tec­tion, or both. We write to il­lus­trate the dan­ger posed by the or­der and to mo­bi­lize the sci­en­tific com­mu­nity to speak out against it.

The act­ing force be­hind this or­der is po­lit­i­cal in­ter­est, not sci­en­tific merit. DAO 216 – 26 by­passed legally re­quired ad­min­is­tra­tive pro­ce­dures. It ful­fills a promise made by the ar­chi­tects of the Heritage Foundation’s Project 2025, and re­flects both the rhetoric and mis­un­der­stand­ings of rep­re­sen­ta­tives of the Center for Renewing America (CRA), an or­ga­ni­za­tion founded by OMB Director Russell Vought. CRAs ex­plainer on the use of dif­fer­en­tial pri­vacy in the 2020 Census is up-front about the stakes: Even if the cit­i­zen­ship ques­tion is added to the Census, it will be im­pos­si­ble to as­cer­tain the sta­tus of in­di­vid­u­als so long as dif­fer­en­tial pri­vacy is used.” But mask­ing this sort of per­sonal char­ac­ter­is­tics data is legally re­quired by the Census Act (13 U.S. Code Section 9), which makes it a crime to make any pub­li­ca­tion whereby the data fur­nished by any par­tic­u­lar [individual] can be iden­ti­fied.” Confidentiality is also widely un­der­stood as crit­i­cal to en­sur­ing that peo­ple re­spond to the cen­sus.

DAO-216 – 26 bans dif­fer­en­tial pri­vacy and other mod­ern (and not so mod­ern) tech­niques. It re­stricts dis­clo­sure avoid­ance tech­niques to coarsening,” which it de­scribes as reducing the level of de­tail or speci­ficity of pub­lished sta­tis­tics, such as through round­ing, ag­gre­gat­ing (grouping), and/​or the use of ranges.” Suppression” (“expressly redact­ing cer­tain val­ues”) may also be used, but only as a last re­sort.” DAO-216 – 26 for­bids noise in­fu­sion”, de­scribed as methods that in­volve mod­i­fy­ing a dataset by adding ran­dom val­ues, or noise.”

Noise in­fu­sion was in­vented pre­cisely to ad­dress the in­creas­ing de­mand for gran­u­lar data in the face of con­fi­den­tial­ity laws that for­bid pub­lish­ing rei­den­ti­fi­able data. Coarsening and sup­pres­sion were sat­is­fac­tory for most na­tional, ag­gre­gate sta­tis­ti­cal se­ries, like the Principal Federal Economic Indicators. However, these tech­niques failed when ap­plied to busi­ness and de­mo­graphic data at fine ge­o­graphic or in­dus­trial de­tail. By for­bid­ding noise in­fu­sion, the di­rec­tive bans the dis­clo­sure avoid­ance tech­niques at the core of dozens of data re­leases over the last three decades. It bans in­put noise in­fu­sion, used in the Quarterly Workforce Indicators since 2002 and, un­til now, planned for the Bureau of Economic Analysis sta­tis­tics [1].  It bans swap­ping, used for de­cen­nial cen­sus pub­li­ca­tions since 1990. It also bans dif­fer­en­tial pri­vacy,  the best cur­rently known ap­proach for ob­tain­ing the most data util­ity for any given level of pri­vacy. Differential pri­vacy was used for shar­ing data on com­mut­ing pat­terns (OnTheMap) since 2008 and for pub­li­ca­tions based on the 2020 Census. Until the re­cent di­rec­tive, dif­fer­en­tial pri­vacy was planned for the 2030 Census too.  Many other prod­ucts and pro­ce­dures are im­pli­cated as well.

1.      Illustrations

DAO-216 – 26 is in­com­pat­i­ble with the Census Bureau’s dual man­date to pro­vide con­fi­den­tial­ity and fit­ness for use. To il­lus­trate this, we re­call and ex­pand on an ex­am­ple due to Nathan Goldschlag, in­spired by the County Business Patterns (CBP) data, which pro­vides sta­tis­tics on busi­ness ac­tiv­ity bro­ken down by in­dus­try and ge­og­ra­phy. Goldschlag de­scribes three sce­nar­ios, il­lus­trat­ing the ten­sion be­tween pro­vid­ing use­ful in­for­ma­tion and main­tain­ing con­fi­den­tial­ity of re­sponses as re­quired by the Census Act.

·       There is only one brew­ery in a small county. If the CBP pub­lished the ex­act count of brew­ery em­ploy­ees in that county, it would be dis­clos­ing the in­for­ma­tion of one busi­ness (how many work­ers it em­ploys), a clear vi­o­la­tion of the law.2

·        There are two brew­eries in a small county, and the CBP again pub­lishes the ex­act count of brew­ery em­ploy­ees. If I own one of those brew­eries, I could learn how many em­ploy­ees my com­peti­tor has, again vi­o­lat­ing the law.

·        There are more than two brew­eries in a small county, but the CBP chooses not to pub­lish the to­tal num­ber of brew­ery em­ploy­ees out of con­cern that it might com­pro­mise the pri­vacy of the busi­nesses. If I’m a prospec­tive brew­ery owner, I may deem the pro­ject too risky to pur­sue with­out in­for­ma­tion about the mar­ket I’m en­ter­ing.”

·       There is only one brew­ery in a small county. If the CBP pub­lished the ex­act count of brew­ery em­ploy­ees in that county, it would be dis­clos­ing the in­for­ma­tion of one busi­ness (how many work­ers it em­ploys), a clear vi­o­la­tion of the law.2

·        There are two brew­eries in a small county, and the CBP again pub­lishes the ex­act count of brew­ery em­ploy­ees. If I own one of those brew­eries, I could learn how many em­ploy­ees my com­peti­tor has, again vi­o­lat­ing the law.

·        There are more than two brew­eries in a small county, but the CBP chooses not to pub­lish the to­tal num­ber of brew­ery em­ploy­ees out of con­cern that it might com­pro­mise the pri­vacy of the busi­nesses. If I’m a prospec­tive brew­ery owner, I may deem the pro­ject too risky to pur­sue with­out in­for­ma­tion about the mar­ket I’m en­ter­ing.”

In Goldschlag’s ex­am­ple, coars­en­ing makes the pub­lished sta­tis­tics use­less.  We now add a fourth sce­nario, show­ing that it also fails to main­tain con­fi­den­tial­ity.  To keep things sim­ple, as­sume none of us owns any of the busi­nesses in the new ex­am­ple. The County has two towns with one brew­ery each, North Bend and South Bend. Furthermore, North Bend has a mo­bile bot­tling com­pany and South Bend has a sta­tion­ary bot­tling com­pany. That’s a to­tal of four beer-re­lated busi­ness en­ti­ties in the County.  Two of these busi­nesses, the North-Bend brew­ery and the South Bend bot­tling com­pany, are pub­licly-owned.

The CBP pub­lishes five sta­tis­tics:

(A) The to­tal num­ber of em­ploy­ees in beer-re­lated busi­nesses in North Bend: Because there is only one brew­ing com­pany in North Bend and only one bot­tling com­pany in North Bend, the cat­e­gory is coars­ened to beer-related”.

(B) The to­tal num­ber of em­ploy­ees in beer-re­lated busi­nesses in South Bend: Because there is only one brew­ing com­pany in South Bend and only one bot­tling com­pany in South Bend, the cat­e­gory is coars­ened to beer-related”.

(C) The to­tal num­ber of em­ploy­ees in brew­ing only:  Because there is only one brew­ing com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in brew­ing only in the County.

(D) The to­tal num­ber of em­ploy­ees in bot­tling only: Because there is only one bot­tling com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in bot­tling only in the County.

(E) The to­tal num­ber of em­ploy­ees at pub­licly owned com­pa­nies: Because there is only one pub­licly owned com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in pub­licly owned com­pa­nies in the County.

(A) The to­tal num­ber of em­ploy­ees in beer-re­lated busi­nesses in North Bend: Because there is only one brew­ing com­pany in North Bend and only one bot­tling com­pany in North Bend, the cat­e­gory is coars­ened to beer-related”.

(B) The to­tal num­ber of em­ploy­ees in beer-re­lated busi­nesses in South Bend: Because there is only one brew­ing com­pany in South Bend and only one bot­tling com­pany in South Bend, the cat­e­gory is coars­ened to beer-related”.

(C) The to­tal num­ber of em­ploy­ees in brew­ing only:  Because there is only one brew­ing com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in brew­ing only in the County.

(D) The to­tal num­ber of em­ploy­ees in bot­tling only: Because there is only one bot­tling com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in bot­tling only in the County.

(E) The to­tal num­ber of em­ploy­ees at pub­licly owned com­pa­nies: Because there is only one pub­licly owned com­pany in each of North Bend and South Bend, the sta­tis­tic is coars­ened to the to­tal num­ber of em­ploy­ees in pub­licly owned com­pa­nies in the County.

We now have 5 equa­tions in 4 un­knowns. Using only 4 of these (A, B, C, and E), we can solve for the ex­act num­ber of em­ploy­ees at each of the four com­pa­nies with high school al­ge­bra.

In the above (fictional but re­al­is­tic) sce­nario, the County Business Patterns were re­leased with good-faith coars­en­ings for the ge­o­graph­i­cal, busi­ness, and own­er­ship cat­e­gories.  Nonetheless, even with­out in­side knowl­edge of one of the com­pa­nies’ num­ber of em­ploy­ees, we can com­pletely re­con­struct all four num­bers.  What hap­pened?  The coars­en­ings in­ter­acted poorly.  Noise in­fu­sion per­turbs that set of equa­tions, pre­vent­ing ex­act re­con­struc­tion.

2.      Impediments to Implementation

The Commerce Department now claims the di­rec­tive’s re­turn to the out­dated tradstat” tra­di­tional sta­tis­ti­cal tech­niques of the 70s is good for data con­sumers: This up­date to our dis­clo­sure lim­i­ta­tion method pro­tects re­spon­dents and pro­vides the pub­lic with more es­sen­tial eco­nomic in­for­ma­tion.”  (Emphasis added.)  As we saw from Goldschlag’s ex­am­ple, coars­en­ing does just the op­po­site.

And it can’t be fixed. Coarsening by de­f­i­n­i­tion re­duces ac­cess to fine-grained in­for­ma­tion.  Our ex­am­ple of three poorly in­ter­act­ing coars­en­ings shows that this sac­ri­fice is for naught: with­out noise in­fu­sion, con­fi­den­tial­ity is de­stroyed by el­e­men­tary cal­cu­la­tions.  For pop­u­la­tion sur­veys, this is pre­cisely what for­mal noise in­fu­sion meth­ods, like dif­fer­en­tial pri­vacy, pro­tect against; this is the fancy math” that Goldschlag men­tions in his post and that holds per­sonal char­ac­ter­is­tics, like cit­i­zen­ship sta­tus, in con­fi­dence.

3.      Confidentiality is Critical for Federal Statistics

The sci­en­tific com­mu­nity con­tin­ues to de­bate the best tech­niques for pro­tect­ing the con­fi­den­tial­ity of re­spon­dents’ data, but DAO-216 – 26 is not dri­ven by sci­ence. It is dri­ven by po­lit­i­cal in­ter­ests. Those is­su­ing this or­der are will­ing to risk the pub­lic’s trust in the process. We think that this is wrong-headed and dan­ger­ous.

Civil ser­vants will do their best to com­ply with this or­der while still fol­low­ing the laws that re­quire them to pro­tect the con­fi­den­tial­ity of re­spon­dents’ data. To bal­ance these com­pet­ing man­dates, they may seek to pro­duce less data or coarsen data so much that it is un­us­able. Or they might be pushed by po­lit­i­cal ac­tors to pub­lish data that can be eas­ily un­masked, like in the brew­ery ex­am­ples above. Regardless of their choices, they will be hard-pressed to guar­an­tee re­spon­dents’ con­fi­den­tial­ity, which will prompt many busi­nesses and in­di­vid­u­als to sim­ply not an­swer. This is dev­as­tat­ing for an agency that de­liv­ers democ­ra­cy’s data.

Conclusion

Rather than po­lit­i­cal ac­tors over­rul­ing the gov­ern­men­t’s own sta­tis­ti­cians, we need deep in­vest­ment in our na­tion’s sta­tis­ti­cal agen­cies, en­sur­ing that agen­cies have the staff and sup­port to im­prove their meth­ods us­ing the best avail­able tools. Regardless of how the sci­en­tific com­mu­nity feels about any spe­cific pri­vacy-en­hanc­ing tech­nique, we must col­lec­tively re­ject this anti-sci­en­tific ap­proach to gov­ern­ing fed­eral sta­tis­tics. Too much is at stake.

How to Take Action

Share this post with oth­ers in your pro­fes­sional net­work and com­mu­nity.

Contact your Congressional rep­re­sen­ta­tive and voice your con­cerns. Calling or writ­ing to your rep­re­sen­ta­tive is one of the most ef­fec­tive and eas­i­est things a con­stituent can do that should only take a cou­ple min­utes of your time.

Find your rep­re­sen­ta­tive con­tact in­for­ma­tion here.

State your con­cern. Here is a sam­ple script: My name is [Name], and I am a con­stituent from [City] in your dis­trict [ZIP CODE]. I am call­ing be­cause I am con­cerned about the the U.S. Secretary of Commerce is­sued a di­rec­tive (DAO 216 – 26) that wants to rel­e­gate con­fi­den­tial­ity pro­tec­tion in all Bureau of Economic Analysis and U.S. Census Bureau data prod­ucts and sta­tis­tics to out­dated and in­ef­fec­tive sta­tis­ti­cal tech­niques. If fol­lowed, this or­der will de­stroy the Commerce pub­lic data our na­tion re­lies on for im­por­tant de­ci­sions, such as where to build nec­es­sary ser­vices for our com­mu­ni­ty’s well-be­ing. I want the DAO to be re­scinded. I want proper ad­min­is­tra­tive pro­ce­dure to be fol­lowed. I want tech­ni­cal de­ci­sions such as the choice of method used to bal­ance util­ity and con­fi­den­tial­ity to be in­formed by pro­fes­sion­als in the fed­eral sta­tis­ti­cal agen­cies, not made uni­lat­er­ally by po­lit­i­cal op­er­a­tives.”

Optional is stat­ing what kind of con­stituent, such as a re­tired teacher or a work­ing pro­fes­sional.

Optional is stat­ing what kind of con­stituent, such as a re­tired teacher or a work­ing pro­fes­sional.

Volunteer to help pre­serve Census work­ing pa­pers and doc­u­men­ta­tion. Pages ex­plain­ing noise in­fu­sion” and differential pri­vacy” are al­ready go­ing of­fline. Archive rel­e­vant method­ol­ogy pages and tech­ni­cal doc­u­men­ta­tion. You can also do this via the Internet Archive’s Wayback Machine (“Save Page Now”).

John Abowd Aloni CohenCynthia DworkJae June LeeJayshree SarathyAdam SmithSalil Vadhan

[1] BEA Working Paper WP2026 – 9, now purged by the Department of Commerce.  As of 6/22 Google re­turns:

Bureau of Economic Analysis (BEA) (.gov)https://​bea.gov › files › pa­pers › BEA-WP2026 – 9

This en­try was posted on Thursday, July 2nd, 2026 at 3:26 pm and is filed un­der Announcements, Nerd Interest. You can fol­low any re­sponses to this en­try through the RSS 2.0 feed.

You can leave a re­sponse, or track­back from your own site.

You can use rich HTML in com­ments! You can also use ba­sic TeX, by en­clos­ing it within $$ $$ for dis­played equa­tions or \( \) for in­line equa­tions.

After two decades of mostly-open com­ments, in July 2024 Shtetl-Optimized tran­si­tioned to the fol­low­ing pol­icy:

All com­ments are treated, by de­fault, as per­sonal mis­sives to me, Scott Aaronson–-with no ex­pec­ta­tion ei­ther that they’ll ap­pear on the blog or that I’ll re­ply to them.

At my leisure and dis­cre­tion, and in con­sul­ta­tion with the Shtetl-Optimized Committee of Guardians, I’ll put on the blog a cu­rated se­lec­tion of com­ments that I judge to be par­tic­u­larly in­ter­est­ing or to move the topic for­ward, and I’ll do my best to an­swer those. But it will be more like Letters to the Editor. Anyone who feels un­justly cen­sored is wel­come to the rest of the Internet.

Valve open source the Steam Machine e-ink screen so you can make your own

www.gamingonlinux.com

While Valve will not be mak­ing and pro­vid­ing their own e-ink dis­play for the Steam Machine, they have opened it up so any­one can now do it. Valve orig­i­nally teased it with the first lot of re­view­ers that got their hands on it.

All of it is avail­able on their GitLab un­der the MIT li­cense, which goes over every­thing you need to make your own and stick it on the front of your fancy new Steam Machine.

Image Credit - Gamers Nexus

They’re now call­ing it the Inkterface” and there’s a good few things you’ll need to make it in­clud­ing:

1 x Adafruit ESP32 Feather with 2MB PSRAM. 1 x Adafruit eInk Breakout Friend. 1 x Adafruit 5.83″ Monochrome eInk Panel. 13 x M2.5 x 5mm Pan Head Machine Screws. 4 x 1/4″ x 1/4″ x 3/16″ Stepped Magnet SB443-OUT.

1 x Adafruit ESP32 Feather with 2MB PSRAM.

1 x Adafruit eInk Breakout Friend.

1 x Adafruit 5.83″ Monochrome eInk Panel.

13 x M2.5 x 5mm Pan Head Machine Screws.

4 x 1/4″ x 1/4″ x 3/16″ Stepped Magnet SB443-OUT.

Valve even pro­vided a video on the GitLab show­ing it be­ing put to­gether, which we’re re-host­ing to make it eas­ily view­able for you:

Pretty cool to see.

Maybe we will see some other ven­dors ac­tu­ally do them pre-built for us. JSAUX teased they would be do­ing it back in November 2025, and check­ing back to­day they’ve said they still plan to do Ink & Pixel ver­sions”. If the Steam Machine is pop­u­lar enough - no doubt we’ll have other ac­ces­sory brands do var­i­ous ver­sions of their own.

🌐 External Sources: git­lab.steamos.cloud, x.com/​jsaux­of­fi­cial, gamer­snexus.net Article taken from GamingOnLinux.com.

GitHub - FractalFir/crustc: Entirety of `rustc`, translated to C.

github.com

crustc - rustc 1.98.0-nightly (c712ea946 2026 – 06-16), con­verted to 46 mil­lion lines of C.

This is a func­tional Rust com­piler you can build with GCC & make.

# We need to pro­vide a path to LLVM(`libLLVM.so.22.1-rust-1.98.0-nightly`) # I *could* in­clude pre-built LLVM in the pro­ject, but I’d rather not em­bed ran­dom bi­na­ries in the pro­ject. make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026 – 06-16-aarch64-unknown-linux-gnu/lib

It is just C code [1], which, when com­piled, gives you a func­tional Rust com­piler.

# It works - (library path to point to li­bLLVM.so.22.1-rust-1.98.0-nightly - rustc uses llvm) LD_LIBRARY_PATH=~/.rustup/toolchains/nightly-2026 – 06-16-aarch64-unknown-linux-gnu/lib:./rustc_driver ./rustc/rustc –version rustc 1.98.0-nightly (c712ea946 2026 – 06-16)

That Rust com­piler can com­pile code - build core, al­loc, std - you name it!

What is this?

This is a demo/​teaser for my new Rust to C com­piler tool­chain. The full cilly tool­chain com­piles your own Rust to C for ar­bi­trary tar­gets. This repo just shows the com­piler com­pil­ing it­self, as I be­lieve this is the flashiest show­case I could do.

How was this done?

For the past 3 years, I have been work­ing on com­pil­ing Rust to C. I made a few pub­lic at­tempts, like rustc_­code­gen_­clr, and a lot of pri­vate ones.

This is, by my count, the 14th at­tempt: cilly. It is a Rust li­brary for gen­er­at­ing C code and a Rust com­piler back­end (read: plu­gin) that al­lows you to com­pile Rust to C.

The main in­no­va­tion be­hind cilly is that it adapts to C com­pil­ers.

It can gen­er­ate witness” pro­grams, which check what a given com­piler and plat­form sup­port:

/* This com­piles if and only if our C com­piler sup­ports _Thread_local. */ _Thread_local int KEYWORD_TLS_SUPPORTED;

This means Cilly will gen­er­ate C code, which will make your spe­cific, weird Shminky C com­piler for Blorbo OS happy.

/* This will pass in some C com­pil­ers. */ as­sert(sizeof(float) == sizeof(dou­ble));

All type lay­outs, sizes, align­ments, char­ac­ter en­cod­ings (ASCII), and in­te­ger for­mats (two’s com­ple­ment) are queried for.

With fall­backs, where pos­si­ble.

I try my very best not to as­sume any­thing out­side of ANSI C[2] - in­clud­ing workarounds for things in modern” C stan­dards, like strict alias­ing.

Sadly, this means the out­put of cilly is com­piler-spe­cific (i.e., you can’t take the cilly C gen­er­ated for Arm64 and run it on riscv32, but you can gen­er­ate cilly C specif­i­cally for riscv32).

This build of rustc (the gen­er­ated C) is targeting” ARM64 Linux be­cause that is the ISA of my work­sta­tion.

Why was this done?

The pri­mary goal of this is sup­port for old/​ob­scure hard­ware with no LLVM/GCC sup­port. There are still some sys­tems out there that don’t sup­port Rust but sup­port C.

Whenever some pro­ject moves from Rust to C, or a Rust al­ter­na­tive of a C pro­ject is made, sup­port for those tar­gets is validly raised as a down­side of Rust [3].

The goal of this pro­ject is to re­move that prob­lem.

cilly wraps rustc and a C com­piler and trans­lates the Rust code to C on the fly. From the user per­spec­tive, this is as sim­ple as defin­ing what C com­piler to use for a given tar­get.

triple”: [ sdcc_z180-unknown-none” ], tool_def”: { kind”: local”, compile”: { base”: { executable”: /usr/bin/sdcc”, base_args”: [ -mz180”, –std-c89″, -c” ], input_arg_template”: [ {input}” ], // JSON cut off for brevity. } } }

Network trans­parency.

cilly is net­work trans­par­ent, and can talk to C com­pil­ers over TCP (may be ex­tended to weird things like UART if need be).

This is a so­lu­tion to the boot­strap para­dox / plat­forms with­out C cross com­pil­ers.

You build a small C server on your Blorbo OS, run rustc on some nor­mal plat­form like Linux, and let cilly talk over the wire.

I have suc­cess­fully used this to com­pile small Rust pro­grams for x86 Plan9 VMs, while run­ning rustc on Arm64 linux.

term% echo `{cat /dev/sysname} os­ver­sion `{cat /dev/osversion} cputype $cputype gnot os­ver­sion 2000 cputype 386 term% /tmp/hello_plan9 Hello, world! term% nm /tmp/hello_plan9 | grep rust_be­gin_un­wind 1020 T _RNvCshfEkAwg4zv6_7___rustc17rust_begin_unwind

Generating make­files.

cilly can op­tion­ally em­bed mark­ers within its ob­ject files, and save its IR to a cache di­rec­tory. It can then read those mark­ers, split func­tions / glob­als by their de­f­i­n­i­tion lo­ca­tion, and gen­er­ate a di­rec­tory with make­files - to al­low you to build Rust with a C com­piler and make.

ABI com­pat­i­bil­ity

cilly gen­er­ated code is mostly ABI com­pat­i­ble with nor­mal rustc com­piled code. I say mostly, be­cause on some plat­forms(… like ar­m64) rustc choose an ABI not rep­re­sentable from C[4].

Reproduction

Prerequisites

This rust com­piler was built on:

un­ame -a Linux spark-2773 6.17.0 – 1021-nvidia #21-Ubuntu SMP PREEMPT_DYNAMIC Wed May 27 19:14:05 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux

This is the C com­piler I used:

read­elf -p .comment ./rustc/rustc String dump of sec­tion .comment’: [ 1] GCC: (Ubuntu 13.3.0 – 6ubuntu2~24.04.1) 13.3.0 [ 2e] Linker: Ubuntu LLD 18.1.3

In or­der to build the demo, you will need to pro­vide it with the right LLVM libs. The eas­ies way to do so is to just use the LLVM rustc ships:

rustup in­stall nightly-2026 – 06-16

Build

With the right GCC(more mod­ern GCC ver­sions should work too, untested), right LLVM ver­sion, and GNU make in­stalled, run:

# We need to pro­vide a path to LLVM(`libLLVM.so.22.1-rust-1.98.0-nightly`) # I *could* in­clude pre-built LLVM in the pro­ject, but I’d rather not em­bed ran­dom bi­na­ries in the pro­ject. make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026 – 06-16-aarch64-unknown-linux-gnu/lib # CFLAGS work(CAVEAT: some flags will slow com­pi­la­tion down) make -j20 CFLAGS=-g

And… voilà!

Compilation speed

I strongly rec­om­mend not en­abling op­ti­miza­tions: both be­cause the may break stuff(this is just a demo, and it’s… ee… rough around the edges[5]) AND be­cause op­ti­miza­tions take time at this scale.

Without opts, my ma­chine builds the pro­ject in a few min­utes:

make -j20 937.98s user 123.77s sys­tem 1352% cpu 1:18.48 to­tal

With opts, ex­pect to choke on some spe­cific larger rust files. You will blitz through most code, and then get stuck on those be­he­moths.

Testing the build

Run:

LD_LIBRARY_PATH=~/.rustup/toolchains/nightly-2026 – 06-16-aarch64-unknown-linux-gnu/lib:./rustc_driver ./rustc/rustc –version

You should see the rustc ver­sion printed.

For build­ing pro­grams, you will need to build std.

LD_LIBRARY_PATH=~/.rustup/toolchains/nightly-2026 – 06-16-aarch64-unknown-linux-gnu/lib:./rustc_driver ./rustc/rustc main.rs er­ror[E0463]: can’t find crate for `std` | = note: the `aarch64-unknown-linux-gnu` tar­get may not be in­stalled = help: con­sider down­load­ing the tar­get with `rustup tar­get add aarch64-un­known-linux-gnu` = help: con­sider build­ing the stan­dard li­brary from source with `cargo build -Zbuild-std`

er­ror: abort­ing due to 1 pre­vi­ous er­ror

For more in­for­ma­tion about this er­ror, try `rustc –explain E0463`.

Read BUILDING_STD.md for that.

Known bugs

For some weird path-canon­i­cal­iza­tion-rea­sons, crustc can crash when run in the di­rec­tory it was built in(repo root, crustc). Works fine in other places.

I am con­fused too.

Can I try cilly out?

Nah, not yet. It is not ready for pub­lic con­sump­tion. I will re­lease it as soon as pos­si­ble - but

I got a job(which means I no longer write code on a lap­top with it’s G & C keys bro­ken, yay!)

I got uni(well I am on sum­mer break, but the­sis-s don’t tend to write them­selves).

I put my left hand in a blender. The blender won. (Still have all my fin­gers, just some stitches). I will not elab­o­rate fur­ther.

Notes

1 - well, C code + some C++ LLVM wrap­pers. Rust uses a bit of C++ to ex­pose some more LLVM knobs. They are shipped pre-com­piled be­cause they are LLVM-version-specific and a pain to build stand­alone.

2 - rarely, I have to make reasonable as­sump­tions” which would be goal stop­pers. E.g. (void*)(uintptr_t)(ptr) roundtrips. I doc­u­ment those AND add as­serts for them (CHAR_BIT = 8) if pos­si­ble.

3 - the weight of Rust does not sup­port Plan 9” as an ar­gu­ment against Rust de­pends on per­sonal pref­er­ences, and eval­u­at­ing that ar­gu­ment is left as an ex­er­cise to the reader.

4 - The is­sue is the struct re­turn pointer(sret). On most plat­forms, it is passed in the same reg as the first arg, so we can al­ways force to re­turn-by-sret(out pointer) by just hav­ing the first arg be the out pointer. Not on Arm64. There, sret pointer is passed in a dif­fer­ent reg­is­ter, mean­ing the na­tive C com­piler has to chose to do a re­turn-by-sret for us. Which it does not do for small structs(<16 bytes afaik). Annoying.

5 - I am chas­ing some op­ti­miza­tion re­lated bugs - part of the rea­son full cilly tool­chain is not out.

Reality has a surprising amount of detail

johnsalvatier.org

I.

My dad em­i­grated from Colombia to North America when he was 18 look­ing look­ing for a bet­ter life. For my brother and I that meant a lot of stand­ing out­side in the cold. My dad’s pre­ferred method of im­prov­ing his lot was im­prov­ing lots, and my brother and I were voluntarily” re­cruited to help work­ing on the build­ings we owned.

That’s how I came to spend a sub­stan­tial part of my teenage years re­plac­ing fences, dig­ging trenches, and build­ing floor­ing and sheds. And if there’s one thing I’ve learned from all this build­ing, it’s that re­al­ity has a sur­pris­ing amount of de­tail.

This turns out to ex­plain why its so easy for peo­ple to end up in­tel­lec­tu­ally stuck. Even when they’re lit­er­ally the best in the world in their field.

Consider build­ing some base­ment stairs for a mo­ment. Stairs seem pretty sim­ple at first, and at a high level they are sim­ple, just two long, wide par­al­lel boards (2” x 12” x 16’), some boards for the stairs and an an­gle bracket on each side to hold up each stair. But as you ac­tu­ally start build­ing you’ll find there’s a sur­pris­ing amount of nu­ance.

The first thing you’ll no­tice is that there are ac­tu­ally quite a few sub­tasks. Even at a high level, you have to cut both ends of the 2x12s at the cor­rect an­gles; then screw in some u-brack­ets to the main floor to hold the stairs in place; then screw in the 2x12s into the u-brack­ets; then at­tach the an­gle brack­ets for the stairs; then screw in the stairs.

Next you’ll no­tice that each of those steps above de­com­poses into sev­eral steps, some of which have some tricky de­tails to them due to the prop­er­ties of the ma­te­ri­als and task and the lim­i­ta­tions of your­self and your tools.

The first prob­lem you’ll en­counter is that cut­ting your 2x12s to the right an­gle is a bit com­pli­cated be­cause there’s no ob­vi­ous way to trace the cor­rect an­gles. You can ei­ther get cre­ative (there is a way to trace it), or you can bust out your trig book and fig­ure out how to cal­cu­late the an­gle and po­si­tion of the cuts.

You’ll prob­a­bly also want to look up what are rea­son­able an­gles for stairs. What looks rea­son­able when you’re cut­ting and what feels safe can be dif­fer­ent. Also, you’re prob­a­bly go­ing to want to at­tach a guide for your cir­cu­lar saw when cut­ting the an­gle on the 2x12s be­cause the cut has to be pretty straight.

When you’re ready to you will quickly find that get­ting the stair boards at all the same an­gle is non-triv­ial. You’re go­ing to need some­thing that can give you an an­gle to the main board very con­sis­tently. Once you have that, and you’ve drawn your lines, you may be dis­mayed to dis­cover that your straight look­ing board is not that straight. Lumber warps af­ter it’s made be­cause it was cut when it was new and wet and now it’s dryer, so no lum­ber is per­fectly straight.

Once you’ve gone back to the lum­ber store and got­ten some straighter 2x12s and re­drawn your lines, you can start screw­ing in your brack­ets. Now you’ll learn that de­spite start­ing aligned with the lines you drew, af­ter screw­ing them in, your an­gle brack­ets are no longer quite straight be­cause the screws did­n’t go in quite straight and now they tightly se­cure the bracket at the wrong an­gle. You can fix that by drilling guide holes first. Also you’ll have to move them an inch or so be­cause it’s more or less im­pos­si­ble to get a screw to go in dif­fer­ently than it did the first time in the same hole.

Now you’re fi­nally ready to screw in the stair boards. If your screws are longer than 2”, you’ll need dif­fer­ent ones, oth­er­wise they will poke out the top of the board and stab you in the foot.

At every step and every level there’s an abun­dance of de­tail with ma­te­r­ial con­se­quences.

It’s tempt­ing to think So what?’ and dis­miss these de­tails as in­ci­den­tal or spe­cific to stair car­pen­try. And they are spe­cific to stair car­pen­try; that’s what makes them de­tails. But the ex­is­tence of a sur­pris­ing num­ber of mean­ing­ful de­tails is not spe­cific to stairs. Surprising de­tail is a near uni­ver­sal prop­erty of get­ting up close and per­sonal with re­al­ity.

You can see this every­where if you look. For ex­am­ple, you’ve prob­a­bly had the ex­pe­ri­ence of do­ing some­thing for the first time, maybe grow­ing veg­eta­bles or us­ing a Haskell pack­age for the first time, and be­ing frus­trated by how many an­noy­ing snags there were. Then you got more prac­tice and then you told your­self man, it was so sim­ple all along, I don’t know why I had so much trou­ble’. We run into a fun­da­men­tal prop­erty of the uni­verse and mis­take it for a per­sonal fail­ing.

If you’re a pro­gram­mer, you might think that the fid­dli­ness of pro­gram­ming is a spe­cial fea­ture of pro­gram­ming, but re­ally it’s that every­thing is fid­dly, but you only no­tice the fid­dli­ness when you’re new, and in pro­gram­ming you do new things more of­ten.

You might think the fid­dly de­taili­ness of things is lim­ited to hu­man cen­tric do­mains, and that physics it­self is sim­ple and el­e­gant. That’s true in some sense — the phys­i­cal laws them­selves tend to be quite sim­ple — but the man­i­fes­ta­tion of those laws is of­ten com­plex and coun­ter­in­tu­itive.

II. Boiling A Watched Pot

Consider the boil­ing of wa­ter. That’s straight­for­ward, wa­ter boils at 100 °C, right?

Well the stairs seemed sim­ple too, so let’s dou­ble check.

Put your­self in the shoes of some­one at the start of the 1800’s, with only a crude, un­marked mer­cury ther­mome­ter, try­ing to fig­ure the physics of tem­per­a­ture.

Go to your stove, put some wa­ter in a pot, start heat­ing some wa­ter, and pay at­ten­tion as it heats.

(I sug­gest ac­tu­ally do­ing this)

The first thing you’ll prob­a­bly no­tice is a lot of small bub­bles gath­er­ing on the sur­face of the pot. Is that boil­ing? The wa­ter’s not that hot yet; you can still even stick your fin­ger in. Then the bub­bles will ap­pear faster and start ris­ing, but they some­how seem unboiling’. Then you’ll start to see lit­tle bub­ble storms in patches, and you start to hear a hiss­ing noise. Is that Boiling? Sort of? It does­n’t re­ally look like boil­ing. The bub­ble storms grow larger and start re­leas­ing big­ger bub­bles. Eventually the bub­bles get big and the sur­face of the wa­ter grows tur­bu­lent as the bub­bles be­gin to make it to the sur­face. Finally we seem to have reached real boil­ing. I guess this is the boil­ing point? That seems kind of weird, what were the things that hap­pened ear­lier if not boil­ing.

To make mat­ters worse, if you’d used a glass pot in­stead of a metal one, the wa­ter would boil at a higher tem­per­a­ture. If you cleaned the glass ves­sel with sul­fu­ric acid, to re­move any residue, you’d find that you can heat wa­ter sub­stan­tially more be­fore it boils and when it does boil it boils in lit­tle ex­plo­sions of boil­ing and the tem­per­a­ture fluc­tu­ates un­sta­bly.

Worse still, if you trap a drop of wa­ter be­tween two other liq­uids and heat it, you can raise the tem­per­a­ture to at least 300 °C with noth­ing hap­pen­ing. That kind of makes a mock­ery of the state­ment water boils at 100 °C’.

It turns out that boiling’ is a lot more com­pli­cated than you thought.

This sur­pris­ing amount of de­tail is is not lim­ited to human” or complicated” do­mains, it is a near uni­ver­sal prop­erty of every­thing from space travel to sewing, to your in­ter­nal ex­pe­ri­ence of your own mind.

III. Invisible vs. Transparent Detail And Getting Intellectually Stuck

Again, you might think So what? I guess things are com­pli­cated but I can just no­tice the de­tails as I run into them; no need to think specif­i­cally about this’. And if you are do­ing things that are rel­a­tively sim­ple, things that hu­man­ity has been do­ing for a long time, this is of­ten true. But if you’re try­ing to do dif­fi­cult things, things which are not known to be pos­si­ble, it is not true.

The more dif­fi­cult your mis­sion, the more de­tails there will be that are crit­i­cal to un­der­stand for suc­cess.

You might hope that these sur­pris­ing de­tails are ir­rel­e­vant to your mis­sion, but not so. Some of them will end up be­ing key. Wood’s ten­dency to warp means it’s more ac­cu­rate to trace a cut than to cal­cu­late its length and an­gle. The pos­si­bil­ity of su­per­heat­ing liq­uids means it’s im­por­tant to use a packed bed when boil­ing liq­uids in in­dus­trial processes lest your process be highly in­ef­fi­cient and un­pre­dictable. The mas­sive dif­fer­ence in weight be­tween a rocket full of fuel and an empty one means that a reusable rocket can’t hover if it can’t throt­tle down to a very small frac­tion of its orig­i­nal thrust, which in turn means it must plan its tra­jec­tory very pre­cisely to achieve 0 ve­loc­ity at ex­actly the mo­ment it reaches the ground.

You might also hope that the im­por­tant de­tails will be ob­vi­ous when you run into them, but not so. Such de­tails aren’t au­to­mat­i­cally vis­i­ble, even when you’re di­rectly run­ning up against them. Things can just seem messy and noisy in­stead. Spirit’ ther­mome­ters, made us­ing brandy and other liquors, were in com­mon use in the early days of ther­mom­e­try. They were even con­sid­ered as a po­ten­tial stan­dard fluid for ther­mome­ters. It was­n’t un­til the care­ful work of Swiss physi­cist Jean-André De Luc in the 18th cen­tury that physi­cists re­al­ized that al­co­hol ther­mome­ters are highly non­lin­ear and highly vari­able de­pend­ing on con­cen­tra­tion, which is in turn hard to mea­sure.

You’ve prob­a­bly also had ex­pe­ri­ences where you were try­ing to do some­thing and grow­ing in­creas­ingly frus­trated be­cause it was­n’t work­ing, and then fi­nally, af­ter some time you re­al­ize that your so­lu­tion method can’t pos­si­bly work.

Another way to see that notic­ing the right de­tails is hard, is that dif­fer­ent peo­ple end up notic­ing dif­fer­ent de­tails. My brother and I once built a set of stairs for the garage with my dad, and we ran into the prob­lem of de­ter­min­ing where to cut the long boards so they lie at the cor­rect an­gle. After strug­gling with the prob­lem for a while (and I do mean strug­gling, a 16’ long board is heavy), we got to ar­gu­ing. I re­mem­bered from trig that we could fig­ure out an­gle so I wanted to go dig up my text­book and think about it. My dad said, no, no, no, let’s just trace it’, in­sist­ing that we could fig­ure out how to do it.

I kept ar­gu­ing be­cause I thought I was right. I felt re­ally an­noyed with him and he was an­noyed with me. In ret­ro­spect, I think I saw the fun­da­men­tal dif­fi­culty in what we were do­ing and I don’t think he ap­pre­ci­ated it (look at the stairs pic­ture and see if you can fig­ure it out), he just heard let’s draw some di­a­grams and com­pute the an­gle’ and did­n’t think that was the so­lu­tion, and if he had ap­pre­ci­ated the thing that I saw I think he would have been more open to draw­ing some di­a­grams. But at the same time, he also un­der­stood that di­a­grams and math don’t ac­count for the shape of the wood, which I did not ap­pre­ci­ate. If we had been able to get these points across, we could have come to con­sen­sus. Drawing a di­a­gram was prob­a­bly a good idea, but com­put­ing the an­gle was prob­a­bly not. Instead we stayed an­noyed at each other for the next 3 hours.

Before you’ve no­ticed im­por­tant de­tails they are, of course, ba­si­cally in­vis­i­ble. It’s hard to put your at­ten­tion on them be­cause you don’t even know what you’re look­ing for. But af­ter you see them they quickly be­come so in­te­grated into your in­tu­itive mod­els of the world that they be­come es­sen­tially trans­par­ent. Do you re­mem­ber the in­sights that were cru­cial in learn­ing to ride a bike or drive? How about the de­tails and in­sights you have that led you to be good at the things you’re good at?

This means it’s re­ally easy to get stuck. Stuck in your cur­rent way of see­ing and think­ing about things. Frames are made out of the de­tails that seem im­por­tant to you. The im­por­tant de­tails you haven’t no­ticed are in­vis­i­ble to you, and the de­tails you have no­ticed seem com­pletely ob­vi­ous and you see right through them. This all makes makes it dif­fi­cult to imag­ine how you could be miss­ing some­thing im­por­tant.

That’s why if you ask an anti-cli­mate change per­son (or a cli­mate sci­en­tist) what could con­vince you you were wrong?” you’ll likely get back an an­swer like if it turned out all the data on my side was faked” or some other ex­tremely strong re­quire­ment for ev­i­dence rather than I would start doubt­ing if I no­ticed nu­mer­ous im­por­tant mis­takes in the de­tails my side’s data and my col­leagues did­n’t want to talk about it”. The sec­ond case is much more likely than the first, but you’ll never see it if you’re not pay­ing close at­ten­tion.

If you’re try­ing to do im­pos­si­ble things, this ef­fect should chill you to your bones. It means you could be in­tel­lec­tu­ally stuck right at this very mo­ment, with the ev­i­dence right in front of your face and you just can’t see it.

This prob­lem is not easy to fix, but it’s not im­pos­si­ble ei­ther. I’ve mostly fixed it for my­self. The di­rec­tion for im­prove­ment is clear: seek de­tail you would not nor­mally no­tice about the world. When you go for a walk, no­tice the un­ex­pected de­tail in a flower or what the seams in the road im­ply about how the road was built. When you talk to some­one who is smart but just seems so wrong, fig­ure out what de­tails seem im­por­tant to them and why. In your work, no­tice how that meet­ing ac­tu­ally would­n’t have ac­com­plished much if Sarah had­n’t pointed out that one thing. As you learn, no­tice which de­tails ac­tu­ally change how you think.

If you wish to not get stuck, seek to per­ceive what you have not yet per­ceived.

Comments

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.