10 interesting stories served every morning and every evening.

I discovered a large-scale malware distribution on GitHub

orchidfiles.com

18 June 2026

This is the story of how I found 10,000 repos­i­to­ries on GitHub that dis­trib­ute Trojan mal­ware. They are all from dif­fer­ent con­trib­u­tors, have dif­fer­ent names, and are not forks of other repos­i­to­ries. But they share a com­mon pat­tern, which is what al­lowed me to write a script to find such repos­i­to­ries.

Introduction

I have a pro­ject on GitHub, and I wanted to check whether search en­gines had in­dexed it. I typed the pro­ject name into Google, and my repos­i­tory ap­peared in the re­sults. I en­tered the same query into Bing, and some­one else’s repos­i­tory ap­peared in the re­sults, with the ex­act same name and de­scrip­tion. It was a copy of my repos­i­tory with all the com­mits, and I was listed as a con­trib­u­tor. But an hour ago, an­other com­mit was pushed with a change to the readme. A link to a zip archive has been added to it.

I was choos­ing ap­pro­pri­ate tags for an­other one of my pro­jects on GitHub. I clicked through those tags to look at sim­i­lar pro­jects. In the list, I found a repos­i­tory whose name and de­scrip­tion matched ex­actly those of an­other repos­i­tory on that list. It turned out that it also con­tained copies of all the com­mits from that repos­i­tory, and two hours ago, a link to a zip archive has been added to the readme.

After mon­i­tor­ing these two repos­i­to­ries, I dis­cov­ered that every few hours they delete the pre­vi­ous com­mit and push the ex­act same com­mit again. This com­mit con­tains only one change: adding a link to the archive in the readme file.

I sub­mit­ted a re­quest to GitHub sup­port ask­ing them to delete these repos­i­to­ries. Two weeks passed and noth­ing has changed; GitHub sup­port has­n’t re­sponded. I dis­cussed with an AI what else could be done about this, but it did­n’t of­fer any use­ful ad­vice. I opened a thread on GitHub, and three peo­ple replied with the same AI slop that was of no use at all.

Another month later, GitHub sup­port sent me an email say­ing that they had re­moved these repos­i­to­ries.

You can open other sim­i­lar repos­i­to­ries, look at the lat­est com­mit, and see that a link to a zip archive was added to the readme a few hours ago:https://​github.com/​lu­cash­eriq4374/​welinkhttps://​github.com/​lu­ci­olo­prey/​OcyShield-Frame­workhttps://​github.com/​luigi1973/​As­setRip­per-CLI

The zip archive con­tains 4 files:

Application.cmd or Launcher.cmd

loader.exe or lu­a­jit.exe or an­oth­er_­name.exe

ran­dom_­name.cso or ran­dom_­name.txt

lu­a51.dll

If you sub­mit a link to the archive to VirusTotal, it will find 0 viruses.If you sub­mit the zip file it­self, it will de­tect a Trojan in­side it.

Continued

It seemed like I had al­ready for­got­ten about this event, but my sub­con­scious had­n’t. And my sub­con­scious of­ten throws in­ter­est­ing ideas at me when I’m sleep­ing or wak­ing up. Recently, I woke up and in the very same sec­ond re­al­ized what I needed to do. I need to come up with a gen­eral pat­tern and then write a script that will an­a­lyze all GitHub repos­i­to­ries and find the ones that match that pat­tern.

Search pat­tern:

Every few hours the pre­vi­ous com­mit is deleted and a new one is pushed

Only the readme file is up­dated in the com­mit

The readme file con­tains a link to a zip archive

The com­mits are copied from an­other repos­i­tory

This is a new repos­i­tory, not a fork

All repos­i­to­ries have dif­fer­ent con­trib­u­tors and dif­fer­ent names

From the last two points, it be­comes clear that even if we find one such repos­i­tory, we won’t be able to find other sim­i­lar repos­i­to­ries us­ing it. But there are 500 mil­lion repos­i­to­ries on GitHub. How can we an­a­lyze all of them? GitHub al­lows 5,000 re­quests per hour with a sin­gle to­ken. For each repos­i­tory, we need to make sev­eral re­quests to get the list of com­mits, mod­i­fied files, and the con­tent of the readme file. I did­n’t want to wait a year for the script to an­a­lyze all the repos­i­to­ries.

But we don’t need all the repos­i­to­ries, we only need the ones that are up­dated every few hours. I found a ser­vice called gharchive, which lets you down­load all GitHub events for any given day. So we need to down­load the event archives for the last few days, fil­ter them to in­clude only com­mit push events, and iden­tify the repos­i­to­ries that are up­dated be­tween 2 and 10 times every 10 hours.

Over the past 5 days, there have been 16 mil­lion com­mit pushes. Of these, only 3,000 are repos­i­to­ries that are up­dated every few hours.

However, the events do not in­clude in­for­ma­tion about which spe­cific files were mod­i­fied. This means that for each rel­e­vant repos­i­tory, we need to make ad­di­tional re­quests to the GitHub API.

After run­ning the script, it re­turned a large num­ber of repos­i­to­ries. I added sev­eral pa­ra­me­ters to the fil­ters:

The com­mit must be from a user, not a bot

More than a month has passed be­tween the last com­mit and the one be­fore that

The repos­i­to­ries have more than one con­trib­u­tor

After that, only 14 repos­i­to­ries were found that fully matched the pat­tern. And I could­n’t stop won­der­ing: why were there so few repos­i­to­ries? What are the odds that I stum­bled upon these repos­i­to­ries two months ago and there are only 14 of them on the en­tire GitHub? There should be many more. Imagine what the head­line of this ar­ti­cle would have been if I’d found a mil­lion such repos­i­to­ries or even just a thou­sand.

But I ac­cepted the fact that there were only 14 of them and started writ­ing this ar­ti­cle. I de­cided to dou­ble-check them one more time so I would­n’t ac­ci­den­tally in­clude any un­nec­es­sary repos­i­to­ries in the ar­ti­cle. Imagine my sur­prise when I saw that they had all been up­dated 20 hours ago. So the updated every few hours” pa­ra­me­ter was com­pletely wrong. The fil­ter had dis­carded all repos­i­to­ries that are up­dated in­fre­quently.

During my man­ual check, I also no­ticed repos­i­to­ries that con­tained a link to a zip archive and had a re­cent com­mit, but that com­mit had zero changes. The fil­ter, how­ever, only con­sid­ered repos­i­to­ries where a sin­gle readme file had been mod­i­fied in the lat­est com­mit.

I also no­ticed that the last com­mit in all of these repos­i­to­ries had the same name: Update README.md”.

I changed the fil­ter. Now the script searched for repos­i­to­ries that were up­dated be­tween 1 and 24 times every 24 hours. It found 40,000 such repos­i­to­ries.

There were 10,000 repos­i­to­ries that ex­actly matched the pat­tern. That’s 25% of the to­tal.

Each of these repos­i­to­ries con­tains a zip archive with a Trojan.

These repos­i­to­ries have been around for many months, some even for over a year, and GitHub does not au­to­mat­i­cally de­tect and delete them.

I’ve pub­lished a com­plete list of these repos­i­to­ries on GitHub.A script for find­ing such repos­i­to­ries: Git Malware Finder

Open Questions

Why do they only clone new repos­i­to­ries, rather than pop­u­lar ones?

Why do they delete a com­mit and push a new one every few hours?

Why does­n’t GitHub au­to­mat­i­cally de­tect such repos­i­to­ries?

What ex­actly does the ex­e­cutable exe file from the archive do?

What is the ac­tual scale of this cam­paign?

My Hypotheses

The hack­ers’ goal is to un­der­stand how the sys­tem works, find its lim­i­ta­tions and vul­ner­a­bil­i­ties, and ex­ploit that in­for­ma­tion. If over­writ­ing com­mits helps by­pass GitHub’s se­cu­rity al­go­rithms, then that’s what they did. Perhaps that’s also why every com­mit is named Update README.md”.

The sec­ond goal is to spread the virus. How do they get peo­ple to find and down­load it? I think they do this by cloning only new repos­i­to­ries, which im­me­di­ately ap­pear at the top of search en­gine re­sults for low-vol­ume search terms. They also add these repos­i­to­ries to pop­u­lar GitHub tags to in­crease the chances of in­dex­ing and to help peo­ple find them through those tags.

But why do they copy all the com­mits and con­trib­u­tors? After all, they could have just copied the en­tire source code. This is likely done to build trust. When some­one vis­its a repos­i­tory, they see the con­trib­u­tors, can click through to their pro­files, and see that these aren’t one-day ac­counts. And the com­mit his­tory is pre­served so it’s clear that the repos­i­tory did­n’t just ap­pear yes­ter­day. But per­haps this is also done to by­pass GitHub’s al­go­rithms.

These are just my as­sump­tions, but the re­al­ity may be com­pletely dif­fer­ent.

Conclusion

I was sub­ject to GitHub’s API limit of 5,000 re­quests per hour. I op­ti­mized the script to search only for rel­e­vant repos­i­to­ries, and I think that be­cause of the fil­ter, the script found only a small per­cent­age of repos­i­to­ries. The GitHub team does not have such lim­i­ta­tions. They can an­a­lyze all 500 mil­lion repos­i­to­ries, find any archives or ex­e­cutable files within them, and scan them for viruses.

This time, I won’t be send­ing a re­quest to GitHub. There are sim­ply too many repos­i­to­ries. If any of you have di­rect con­tact with GitHub’s se­cu­rity team, please send them a link to this ar­ti­cle.

* UpdateI found this ar­ti­cle from April 18: How 109 Fake GitHub Repositories Delivered SmartLoader and StealCIt ex­plains in de­tail how this Trojan mal­ware works. At that time, the au­thor had found 109 such repos­i­to­ries.

* Update 2GitHub has started delet­ing all the repos­i­to­ries that the script found. Most of these repos­i­to­ries have al­ready been deleted.

* Update 3I found a post on Reddit that men­tioned this scheme. It was posted in February 2025, al­most 1.5 years ago: If you’re cre­at­ing new repos­i­to­ries, they are be­ing spoofed to host mal­ware

* Update 4GitHub deleted only the repos­i­to­ries I listed in the com­plete list in a txt file. Then I ran the script again, it found new repos­i­to­ries, and I added them to this ar­ti­cle. Almost a day has passed, and these repos­i­to­ries have not been deleted. GitHub has no way to search for these repos­i­to­ries. They did­n’t run my script, and they did­n’t write their own script. They did­n’t even open this ar­ti­cle to see if the list of repos­i­to­ries had changed. They only delete repos­i­to­ries that are re­ported to them, but they don’t do any­thing else. That’s why this scheme has been go­ing on for sev­eral years now, and will most likely con­tinue.

I also pub­lish all new es­says and notes on Telegram, Bluesky and X.

Parliament Lifts Ban on New Nuclear Power Plants

www.bluewin.ch

Until June 19, the Federal Palace in Bern will once again be bustling with ac­tiv­ity. Numerous im­por­tant is­sues will be on the agenda dur­ing the sum­mer ses­sion of the National Council and Council of States.

No time? blue News sum­ma­rizes for you

From June 1 to 19, 2026, the Federal Parliament’s sum­mer ses­sion will take place at the Federal Palace.

Topics up for de­bate in­clude the 13th AHV pen­sion, the armed forces, and fed­eral fi­nances.

blue News is pro­vid­ing up­dates from the Federal Palace here in this live feed.

Liveticker New posts

Liveticker

New posts

Liveticker closed

Liveticker closed

Thursday, June 18, 10:47 a.m.

Parliament Lifts Ban on New Nuclear Power Plants After Marathon Debate

The con­struc­tion of new nu­clear power plants is set to be­come pos­si­ble again in Switzerland. Following the Federal Council and the Council of States, the National Council now shares this view. On Thursday, it ap­proved the coun­ter­pro­posal to the Blackout Initiative. The fi­nal de­ci­sion will rest with the peo­ple.By a vote of 100 to 98, the National Council re­jected a mo­tion to re­fer the mat­ter back to the Federal Council for clar­i­fi­ca­tion of fi­nanc­ing is­sues. On Monday, the lower house had voted 100 to 97, with 2 ab­sten­tions, in fa­vor of re­fer­ring the mat­ter back to the Federal Council. The Council of States sub­se­quently re­jected this by a clear mar­gin.

Thursday, June 18, 10:47 a.m.

Parliament Lifts Ban on New Nuclear Power Plants After Marathon Debate

The con­struc­tion of new nu­clear power plants is set to be­come pos­si­ble again in Switzerland. Following the Federal Council and the Council of States, the National Council now shares this view. On Thursday, it ap­proved the coun­ter­pro­posal to the Blackout Initiative. The fi­nal de­ci­sion will rest with the peo­ple.

By a vote of 100 to 98, the National Council re­jected a mo­tion to re­fer the mat­ter back to the Federal Council for clar­i­fi­ca­tion of fi­nanc­ing is­sues. On Monday, the lower house had voted 100 to 97, with 2 ab­sten­tions, in fa­vor of re­fer­ring the mat­ter back to the Federal Council. The Council of States sub­se­quently re­jected this by a clear mar­gin.

10:50 a.m.

Parliaments Raise VAT for 13th AHV Pension

Value-added tax will be in­creased for the 13th AHV pen­sion, but not the pay­roll con­tri­bu­tion rates. This is be­cause the National Council ap­proved only one of the two parts of the fi­nanc­ing bill on Wednesday. Additional pay­roll de­duc­tions for the AHV are thus off the table for the time be­ing.

10:50 a.m.

Parliaments Raise VAT for 13th AHV Pension

Value-added tax will be in­creased for the 13th AHV pen­sion, but not the pay­roll con­tri­bu­tion rates. This is be­cause the National Council ap­proved only one of the two parts of the fi­nanc­ing bill on Wednesday. Additional pay­roll de­duc­tions for the AHV are thus off the table for the time be­ing.

4:35 a.m.

Financing of the 13th AHV pen­sion to be de­cided

The National Council will de­cide to­day whether or not the 13th AHV pen­sion will be paid out with­out fund­ing. The is­sue of fund­ing is con­tro­ver­sial. The Conciliation Conference is propos­ing a mixed fund­ing model in­volv­ing higher VAT and higher pay­roll con­tri­bu­tions. The Council of States has al­ready ap­proved this pro­posal. However, the National Council had pre­vi­ously in­sisted on fi­nanc­ing solely through the value-added tax. Regarding the Conciliation Conference’s pro­posal, it can now only vote yes” or no”—or, more specif­i­cally, ap­prove the ad­di­tional per­cent­age points of the value-added tax. If the Council votes no” on both par­tial pro­pos­als, the fi­nanc­ing plan will have failed.

4:35 a.m.

Financing of the 13th AHV pen­sion to be de­cided

The National Council will de­cide to­day whether or not the 13th AHV pen­sion will be paid out with­out fund­ing. The is­sue of fund­ing is con­tro­ver­sial. The Conciliation Conference is propos­ing a mixed fund­ing model in­volv­ing higher VAT and higher pay­roll con­tri­bu­tions. The Council of States has al­ready ap­proved this pro­posal. However, the National Council had pre­vi­ously in­sisted on fi­nanc­ing solely through the value-added tax. Regarding the Conciliation Conference’s pro­posal, it can now only vote yes” or no”—or, more specif­i­cally, ap­prove the ad­di­tional per­cent­age points of the value-added tax. If the Council votes no” on both par­tial pro­pos­als, the fi­nanc­ing plan will have failed.

Wednesday, June 17, 2026, 4:32 a.m.

National Council to Decide on the Mercosur Free Trade Agreement

The National Council will vote on the Mercosur free trade agree­ment to­day, Wednesday. Although the ma­jor­ity of the rel­e­vant com­mit­tee sup­ports it, dis­cus­sions are ex­pected, as mi­nor­ity groups wish to pro­pose sev­eral amend­ments.The agree­ment was ne­go­ti­ated by the EFTA states—Switzer­land, Iceland, Liechtenstein, and Norway—with the Mercosur states—Ar­gentina, Brazil, Paraguay, and Uruguay—which have a com­bined pop­u­la­tion of ap­prox­i­mately 270 mil­lion. In 2024, Swiss ex­ports to the Mercosur coun­tries to­taled over 4 bil­lion Swiss francs.Un­der the agree­ment, 96 per­cent of Swiss ex­ports to Mercosur are to be­come duty-free. In re­turn, Switzerland grants the Mercosur coun­tries 25 bi­lat­eral im­port quo­tas for sen­si­tive agri­cul­tural prod­ucts, in­clud­ing meat and wine. Most of the quo­tas are lim­ited, and Switzerland can man­age them au­tonomously.The ma­jor­ity of the rel­e­vant National Council com­mit­tee sees the agree­ment as an op­por­tu­nity to di­ver­sify Switzerland’s trade re­la­tions. By a vote of 15 to 3, with 7 ab­sten­tions, the Foreign Policy Committee (APK-N) en­dorsed the agree­ment. However, the ma­jor­ity is call­ing for an amend­ment: The ad­di­tional ar­ti­cle they pro­posed re­quires the Federal Council to adopt the pro­vi­sions of the EUs Deforestation Regulation. This would be ef­fec­tive in pre­vent­ing de­for­esta­tion, they stated.

Wednesday, June 17, 2026, 4:32 a.m.

National Council to Decide on the Mercosur Free Trade Agreement

The National Council will vote on the Mercosur free trade agree­ment to­day, Wednesday. Although the ma­jor­ity of the rel­e­vant com­mit­tee sup­ports it, dis­cus­sions are ex­pected, as mi­nor­ity groups wish to pro­pose sev­eral amend­ments.

The agree­ment was ne­go­ti­ated by the EFTA states—Switzer­land, Iceland, Liechtenstein, and Norway—with the Mercosur states—Ar­gentina, Brazil, Paraguay, and Uruguay—which have a com­bined pop­u­la­tion of ap­prox­i­mately 270 mil­lion. In 2024, Swiss ex­ports to the Mercosur coun­tries to­taled over 4 bil­lion Swiss francs.

Under the agree­ment, 96 per­cent of Swiss ex­ports to Mercosur are to be­come duty-free. In re­turn, Switzerland grants the Mercosur coun­tries 25 bi­lat­eral im­port quo­tas for sen­si­tive agri­cul­tural prod­ucts, in­clud­ing meat and wine. Most of the quo­tas are lim­ited, and Switzerland can man­age them au­tonomously.

The ma­jor­ity of the rel­e­vant National Council com­mit­tee sees the agree­ment as an op­por­tu­nity to di­ver­sify Switzerland’s trade re­la­tions. By a vote of 15 to 3, with 7 ab­sten­tions, the Foreign Policy Committee (APK-N) en­dorsed the agree­ment. However, the ma­jor­ity is call­ing for an amend­ment: The ad­di­tional ar­ti­cle they pro­posed re­quires the Federal Council to adopt the pro­vi­sions of the EUs Deforestation Regulation. This would be ef­fec­tive in pre­vent­ing de­for­esta­tion, they stated.

5 a.m.

Council of States Debates Expansion of Sunday Sales

The Council of States is de­bat­ing to­day, Tuesday, whether the can­tons could in the fu­ture au­tho­rize up to twelve Sunday sales per year. Currently, the max­i­mum is four. The bill is in­tended to ad­dress chang­ing shop­ping needs and com­pe­ti­tion from on­line re­tail.The bill stems from a can­tonal ini­tia­tive by the Canton of Zurich, which was re­cently en­dorsed by both rel­e­vant par­lia­men­tary com­mit­tees. The Federal Council also sup­ports the pro­posal. The bill pre­sented by the Council of States’ Economic Affairs and Taxation Committee (WAK-S) in­tro­duces moderate flex­i­bil­ity,” leav­ing it up to the can­tons to de­cide how to han­dle Sunday work.The ma­jor­ity of the WAK-N wants to give can­tons and mu­nic­i­pal­i­ties more lee­way in au­tho­riz­ing Sunday sales. The ma­jor­ity be­lieves that the dis­cre­tionary word­ing al­lows for flex­i­ble adap­ta­tion to lo­cal needs with­out re­quir­ing an over­all amend­ment to the Labor Act.

5 a.m.

Council of States Debates Expansion of Sunday Sales

The Council of States is de­bat­ing to­day, Tuesday, whether the can­tons could in the fu­ture au­tho­rize up to twelve Sunday sales per year. Currently, the max­i­mum is four. The bill is in­tended to ad­dress chang­ing shop­ping needs and com­pe­ti­tion from on­line re­tail.

The bill stems from a can­tonal ini­tia­tive by the Canton of Zurich, which was re­cently en­dorsed by both rel­e­vant par­lia­men­tary com­mit­tees. The Federal Council also sup­ports the pro­posal. The bill pre­sented by the Council of States’ Economic Affairs and Taxation Committee (WAK-S) in­tro­duces moderate flex­i­bil­ity,” leav­ing it up to the can­tons to de­cide how to han­dle Sunday work.

The ma­jor­ity of the WAK-N wants to give can­tons and mu­nic­i­pal­i­ties more lee­way in au­tho­riz­ing Sunday sales. The ma­jor­ity be­lieves that the dis­cre­tionary word­ing al­lows for flex­i­ble adap­ta­tion to lo­cal needs with­out re­quir­ing an over­all amend­ment to the Labor Act.

Tuesday, June 9, 2026, 4:30 a.m.

National Council to Decide on Lifting the Ban on New Nuclear Power Plants

The National Council plans to de­cide to­day on lift­ing the ban on the con­struc­tion of new nu­clear power plants. On Monday, mem­bers of the National Council al­ready spent sev­eral hours dis­cussing the coun­ter­pro­posal to the Blackout Initiative.” This coun­ter­pro­posal would lift the ban on the con­struc­tion of new nu­clear power plants at the leg­isla­tive level. The SVP and FDP clearly sup­ported the coun­ter­pro­posal, while the SP, GLP, and the Greens were firmly op­posed. Ultimately, the ex­act bal­ance of power within the cen­trist bloc is likely to be de­ci­sive. The is­sue had al­ready caused quite a stir on Monday evening. The en­vi­ron­men­tal or­ga­ni­za­tion Greenpeace pro­jected im­ages onto the Federal Palace in protest against the pro-nu­clear de­bate.

On Monday evening, Greenpeace ac­tivists pro­jected an im­age onto the fa­cade of the Federal Palace that re­sem­bled Edvard Munch’s paint­ing The Scream”: the eyes and mouth were de­picted us­ing the sym­bol for ra­dioac­tiv­ity. Image: Keystone/Alessandro della Valle

Tuesday, June 9, 2026, 4:30 a.m.

National Council to Decide on Lifting the Ban on New Nuclear Power Plants

The National Council plans to de­cide to­day on lift­ing the ban on the con­struc­tion of new nu­clear power plants. On Monday, mem­bers of the National Council al­ready spent sev­eral hours dis­cussing the coun­ter­pro­posal to the Blackout Initiative.” This coun­ter­pro­posal would lift the ban on the con­struc­tion of new nu­clear power plants at the leg­isla­tive level. The SVP and FDP clearly sup­ported the coun­ter­pro­posal, while the SP, GLP, and the Greens were firmly op­posed. Ultimately, the ex­act bal­ance of power within the cen­trist bloc is likely to be de­ci­sive. The is­sue had al­ready caused quite a stir on Monday evening. The en­vi­ron­men­tal or­ga­ni­za­tion Greenpeace pro­jected im­ages onto the Federal Palace in protest against the pro-nu­clear de­bate.

Image: Keystone/Alessandro della Valle

Monday, June 8, 2026, 4:30 a.m.

National Council to Debate Ban on New Nuclear Power Plants Today

The National Council is de­bat­ing to­day whether to lift the ban on the con­struc­tion of new nu­clear power plants. It is be­gin­ning its de­lib­er­a­tions on the coun­ter­pro­posal to the Blackout Initiative. The Federal Council and the Council of States would like to make it pos­si­ble once again to grant frame­work per­mits for new nu­clear power plants. A nar­row ma­jor­ity of the pre­lim­i­nary re­view com­mit­tee shares this view. A sig­nif­i­cant mi­nor­ity op­poses the leg­isla­tive changes and is mov­ing to dis­miss the pro­posal. Ultimately, the bal­ance of power within the cen­trist fac­tion is likely to be de­ci­sive. A de­bate last­ing sev­eral hours is ex­pected.

Monday, June 8, 2026, 4:30 a.m.

National Council to Debate Ban on New Nuclear Power Plants Today

The National Council is de­bat­ing to­day whether to lift the ban on the con­struc­tion of new nu­clear power plants. It is be­gin­ning its de­lib­er­a­tions on the coun­ter­pro­posal to the Blackout Initiative. The Federal Council and the Council of States would like to make it pos­si­ble once again to grant frame­work per­mits for new nu­clear power plants. A nar­row ma­jor­ity of the pre­lim­i­nary re­view com­mit­tee shares this view. A sig­nif­i­cant mi­nor­ity op­poses the leg­isla­tive changes and is mov­ing to dis­miss the pro­posal. Ultimately, the bal­ance of power within the cen­trist fac­tion is likely to be de­ci­sive. A de­bate last­ing sev­eral hours is ex­pected.

12:33 p.m.

Council of States Rejects the Center Initiative Against the Marriage Penalty

Voters ap­proved the in­tro­duc­tion of in­di­vid­ual tax­a­tion in March, and that is how it should re­main. The Council of States has de­cided by a nar­row ma­jor­ity to rec­om­mend that vot­ers re­ject the Center Party’s ini­tia­tive against the marriage penalty” in tax­a­tion.The ini­tia­tive calls for the elim­i­na­tion of the marriage penalty” in di­rect fed­eral tax­a­tion. However, it does not pro­pose in­di­vid­ual tax­a­tion re­gard­less of mar­i­tal sta­tus; rather, it aims to con­tinue tax­ing mar­ried cou­ples jointly, as is cur­rently the case.Leg­isla­tive pro­vi­sions would then pre­vent mar­ried cou­ples from be­ing dis­crim­i­nated against com­pared to co­hab­it­ing cou­ples. For the Council of States, this is not a vi­able ap­proach: On Thursday, it voted 24 to 21 to re­ject the ini­tia­tive. The National Council and the Federal Council also re­ject the pro­posal.

12:33 p.m.

Council of States Rejects the Center Initiative Against the Marriage Penalty

Voters ap­proved the in­tro­duc­tion of in­di­vid­ual tax­a­tion in March, and that is how it should re­main. The Council of States has de­cided by a nar­row ma­jor­ity to rec­om­mend that vot­ers re­ject the Center Party’s ini­tia­tive against the marriage penalty” in tax­a­tion.

The ini­tia­tive calls for the elim­i­na­tion of the marriage penalty” in di­rect fed­eral tax­a­tion. However, it does not pro­pose in­di­vid­ual tax­a­tion re­gard­less of mar­i­tal sta­tus; rather, it aims to con­tinue tax­ing mar­ried cou­ples jointly, as is cur­rently the case.

Legislative pro­vi­sions would then pre­vent mar­ried cou­ples from be­ing dis­crim­i­nated against com­pared to co­hab­it­ing cou­ples. For the Council of States, this is not a vi­able ap­proach: On Thursday, it voted 24 to 21 to re­ject the ini­tia­tive. The National Council and the Federal Council also re­ject the pro­posal.

Thursday, June 4, 4:30 a.m.

Council of States Debates Marriage Penalty” Again

The marriage penalty” in tax­a­tion is back on the agenda af­ter the pub­lic ap­proved in­di­vid­ual tax­a­tion in March. The Council of States is dis­cussing to­day, Thursday, a pop­u­lar ini­tia­tive by the Center Party call­ing for the abo­li­tion of the marriage penalty” in fed­eral taxes.How­ever, the Mitte ini­tia­tive does not pro­pose in­di­vid­ual tax­a­tion re­gard­less of mar­i­tal sta­tus. Instead, it aims to tax mar­ried cou­ples jointly, as is cur­rently the case. Legal pro­vi­sions would then pre­vent mar­ried cou­ples from be­ing dis­crim­i­nated against com­pared to co­hab­it­ing cou­ples.Fol­low­ing the yes” vote on in­di­vid­ual tax­a­tion, the Center Party stood by its pop­u­lar ini­tia­tive, which con­tra­dicts this law. The Center Party and the SVP had re­jected the sep­a­rate tax­a­tion of mar­ried cou­ples. Representatives of these two par­ties pro­posed a yes” vote on the ini­tia­tive in the Economic Affairs Committee of the Council of States (WAK-S).However, the com­mit­tee rec­om­mends a no” vote on the ini­tia­tive by a vote of 7 to 6 and does not wish to pro­pose a counter-pro­posal. The ma­jor­ity be­lieves that in­di­vid­ual tax­a­tion should now be im­ple­mented fol­low­ing its ap­proval by the elec­torate.

Thursday, June 4, 4:30 a.m.

Council of States Debates Marriage Penalty” Again

The marriage penalty” in tax­a­tion is back on the agenda af­ter the pub­lic ap­proved in­di­vid­ual tax­a­tion in March. The Council of States is dis­cussing to­day, Thursday, a pop­u­lar ini­tia­tive by the Center Party call­ing for the abo­li­tion of the marriage penalty” in fed­eral taxes.

However, the Mitte ini­tia­tive does not pro­pose in­di­vid­ual tax­a­tion re­gard­less of mar­i­tal sta­tus. Instead, it aims to tax mar­ried cou­ples jointly, as is cur­rently the case. Legal pro­vi­sions would then pre­vent mar­ried cou­ples from be­ing dis­crim­i­nated against com­pared to co­hab­it­ing cou­ples.

Following the yes” vote on in­di­vid­ual tax­a­tion, the Center Party stood by its pop­u­lar ini­tia­tive, which con­tra­dicts this law. The Center Party and the SVP had re­jected the sep­a­rate tax­a­tion of mar­ried cou­ples. Representatives of these two par­ties pro­posed a yes” vote on the ini­tia­tive in the Economic Affairs Committee of the Council of States (WAK-S).

However, the com­mit­tee rec­om­mends a no” vote on the ini­tia­tive by a vote of 7 to 6 and does not wish to pro­pose a counter-pro­posal. The ma­jor­ity be­lieves that in­di­vid­ual tax­a­tion should now be im­ple­mented fol­low­ing its ap­proval by the elec­torate.

12:47 p.m.

National Council Wants to Better Support Victims of Violence

Victims of vi­o­lence in Switzerland should have eas­ier ac­cess to emer­gency med­ical care. The National Council has ap­proved a bill to that ef­fect. It also wants to re­quire the can­tons to pro­vide suf­fi­cient shel­ters.On Wednesday, the lower house ap­proved the re­vi­sion of the Victim Assistance Act by a vote of 139 to 55, with no ab­sten­tions. Next, the Council of States must con­sider the bill.With this leg­isla­tive re­vi­sion, the Federal Council is im­ple­ment­ing man­dates from Parliament. Another key pro­vi­sion re­quires the can­tons to pro­vide shel­ters for vic­tims of vi­o­lence—most of whom are women—and their fam­ily mem­bers.The ma­jor­ity of the com­mit­tee re­spon­si­ble for the pre­lim­i­nary re­view wanted to ex­plic­itly stip­u­late that the num­ber of shel­ters must be suf­fi­cient. A mi­nor­ity of the com­mit­tee, con­sist­ing of mem­bers of the SVP, how­ever, wanted to delete the pro­vi­sion en­tirely.The Council ul­ti­mately re­jected the mo­tion to delete the pro­vi­sion by a vote of 131 to 63, with two ab­sten­tions.

12:47 p.m.

National Council Wants to Better Support Victims of Violence

Victims of vi­o­lence in Switzerland should have eas­ier ac­cess to emer­gency med­ical care. The National Council has ap­proved a bill to that ef­fect. It also wants to re­quire the can­tons to pro­vide suf­fi­cient shel­ters.

On Wednesday, the lower house ap­proved the re­vi­sion of the Victim Assistance Act by a vote of 139 to 55, with no ab­sten­tions. Next, the Council of States must con­sider the bill.

With this leg­isla­tive re­vi­sion, the Federal Council is im­ple­ment­ing man­dates from Parliament. Another key pro­vi­sion re­quires the can­tons to pro­vide shel­ters for vic­tims of vi­o­lence—most of whom are women—and their fam­ily mem­bers.

The ma­jor­ity of the com­mit­tee re­spon­si­ble for the pre­lim­i­nary re­view wanted to ex­plic­itly stip­u­late that the num­ber of shel­ters must be suf­fi­cient. A mi­nor­ity of the com­mit­tee, con­sist­ing of mem­bers of the SVP, how­ever, wanted to delete the pro­vi­sion en­tirely.

The Council ul­ti­mately re­jected the mo­tion to delete the pro­vi­sion by a vote of 131 to 63, with two ab­sten­tions.

12:44 p.m.

Council of States Seeks Equal Treatment in Electronics Disposal

Electrical and elec­tronic de­vices orig­i­nat­ing from abroad should be sub­ject to the same take-back and dis­posal oblig­a­tions as those ap­plic­a­ble to Swiss man­u­fac­tur­ers. This is what the Council of States is call­ing for in a mo­tion adopted on Wednesday.It ap­proved a mo­tion by Andrea Gmür-Schönenberger by a vote of 39 to 4; the mo­tion will now go to the National Council. In her mo­tion, the Lucerne-based Center Party mem­ber of the Council of States states that there are cur­rently un­fair cost ad­van­tages and dis­tor­tions of com­pe­ti­tion.On­line plat­forms are cur­rently able to dis­trib­ute these for­eign prod­ucts with­out be­ing bound by the take-back and dis­posal oblig­a­tions that ap­ply to Swiss man­u­fac­tur­ers. It is es­sen­tial to level the play­ing field be­tween do­mes­tic and for­eign mar­ket par­tic­i­pants.Fed­eral Councilor Albert Rösti moved to re­ject the mo­tion. Work is al­ready un­der­way to spec­ify the pro­vi­sions for on­line mail-or­der com­pa­nies and on­line plat­forms at the or­di­nance level. In ad­di­tion, a par­lia­men­tary mo­tion with a sim­i­lar fo­cus has al­ready been sub­mit­ted.

12:44 p.m.

Council of States Seeks Equal Treatment in Electronics Disposal

Electrical and elec­tronic de­vices orig­i­nat­ing from abroad should be sub­ject to the same take-back and dis­posal oblig­a­tions as those ap­plic­a­ble to Swiss man­u­fac­tur­ers. This is what the Council of States is call­ing for in a mo­tion adopted on Wednesday.

It ap­proved a mo­tion by Andrea Gmür-Schönenberger by a vote of 39 to 4; the mo­tion will now go to the National Council. In her mo­tion, the Lucerne-based Center Party mem­ber of the Council of States states that there are cur­rently un­fair cost ad­van­tages and dis­tor­tions of com­pe­ti­tion.

Online plat­forms are cur­rently able to dis­trib­ute these for­eign prod­ucts with­out be­ing bound by the take-back and dis­posal oblig­a­tions that ap­ply to Swiss man­u­fac­tur­ers. It is es­sen­tial to level the play­ing field be­tween do­mes­tic and for­eign mar­ket par­tic­i­pants.

Federal Councilor Albert Rösti moved to re­ject the mo­tion. Work is al­ready un­der­way to spec­ify the pro­vi­sions for on­line mail-or­der com­pa­nies and on­line plat­forms at the or­di­nance level. In ad­di­tion, a par­lia­men­tary mo­tion with a sim­i­lar fo­cus has al­ready been sub­mit­ted.

9:30 a.m.

National Council Wants to Push Through VAT Increase

The fi­nanc­ing of the 13th AHV pen­sion re­mains a con­tentious is­sue. The National Council nar­rowly ap­proved a tem­po­rary in­crease in the value-added tax—against the wishes of the SP, the Greens, and the Center.

9:30 a.m.

Microsoft’s new Outlook takes 10 seconds to do what Outlook Classic does instantly on Windows

www.windowslatest.com

Microsoft’s Outlook for Windows has a no­ti­fi­ca­tion prob­lem that is hard to ig­nore. Clicking a Windows 11 no­ti­fi­ca­tion for a new email is sup­posed to take you straight to that mes­sage. Instead, the new Outlook makes you wait, and the num­bers are em­bar­rass­ing.

Windows 11 ships with two ver­sions of Outlook. There is Outlook Classic, the long-run­ning Win32 desk­top app built for power users, and there is the new Outlook, which Microsoft is push­ing as the fu­ture of email on Windows. The newer one is built on WebView2 and is, in essence, a browser win­dow that loads Outlook.com. If you have ever used both side by side, you al­ready know which one feels faster and which one does not.

Outlook has had a com­pli­cated rep­u­ta­tion for years. The orig­i­nal Win32 app be­came in­fa­mous for be­ing bloated and dif­fi­cult to con­fig­ure. Microsoft’s an­swer was to ditch na­tive code and re­build from the web up. The re­sult, called the new Outlook, re­placed the light­weight UWP Mail and Calendar apps that some Windows users had grown used to. Windows Latest re­ported back in 2023 how users protested when Microsoft an­nounced plans to re­tire those UWP apps in fa­vor of a web wrap­per. The com­pany pushed ahead any­way, and by late 2024, the Mail and Calendar apps were of­fi­cially shut down.

Microsoft has also been push­ing the new Outlook at en­ter­prises, though it post­poned the forced opt-out dead­line to March 2027 from the orig­i­nally planned April 2026. A de­lay of a full year shows that even Microsoft knows the app is not fully ready for every work­load. New Outlook has im­proved in real ways since launch, but the per­for­mance story is still a mixed one, and nowhere is that more ap­par­ent than in how it han­dles no­ti­fi­ca­tions.

New Outlook takes 10 sec­onds to go from no­ti­fi­ca­tion to the re­spec­tive mail

Before get­ting to the frus­trat­ing part, credit where it’s due, New Outlook used to be no­tice­ably slow to launch from scratch, but not any­more.

Outlook (classic) vs New Outlook:

https://​www.win­dowslat­est.com/​wp-con­tent/​up­loads/​2026/​06/​Out­look-clas­sic-vs-New-Out­look-open­ing-speed-com­par­i­son.mp4

New Outlook now opens al­most as fast as Outlook Classic, which is still slightly quicker of the two. But I would say both are neck and neck, at least when it comes to open­ing speeds.

However, when a new email ar­rives in Windows 11, a no­ti­fi­ca­tion ban­ner ap­pears at the bot­tom right of your screen, and that’s where the prob­lem starts. Clicking that ban­ner, or from the Notification Center, is sup­posed to take you di­rectly to the email that trig­gered it.

With Outlook Classic, it opens that spe­cific email al­most in­stantly.

https://​www.win­dowslat­est.com/​wp-con­tent/​up­loads/​2026/​06/​Out­look-Clas­sic-opens-from-no­ti­fi­ca­tions-in­stantly.mp4

With the new Outlook, click­ing the no­ti­fi­ca­tion opens the app, loads the full in­box, and then takes around 10 sec­onds be­fore the spe­cific email from the no­ti­fi­ca­tion shows up on screen.

https://​www.win­dowslat­est.com/​wp-con­tent/​up­loads/​2026/​06/​Out­look-takes-10-sec­onds-to-show-the-e-mail-from-no­ti­fi­ca­tion.mp4

What makes this even more ab­surd is that if you ig­nore the no­ti­fi­ca­tion ban­ner and in­stead open Outlook di­rectly from the Start menu, you can find and click the new email from within the app and be done with it, all be­fore the no­ti­fi­ca­tion ban­ner even dis­ap­pears from the screen.

https://​www.win­dowslat­est.com/​wp-con­tent/​up­loads/​2026/​06/​Open­ing-new-e-mail-di­rectly-from-Out­look-in­stead-of-no­ti­fi­ca­tion.mp4

Five sec­onds to open Outlook and click an email man­u­ally. Ten sec­onds wait time to see that same email if we click the no­ti­fi­ca­tion di­rectly. This is ridicu­lous, even for Microsoft.

And, as it turns out, this is­n’t a prob­lem Microsoft can eas­ily fix with an app up­date.

Outlook is based on WebView2, and like all web apps, it’s slow

New Outlook is built on Microsoft Edge’s WebView2 run­time, which is a Chromium-based ren­der­ing en­gine. Every time you in­ter­act with the app, in­clud­ing click­ing a no­ti­fi­ca­tion, a browser-like process chain has to do the work. The app has to ini­tial­ize or re­sume its web layer, au­then­ti­cate, load the rel­e­vant mail thread, and ren­der it, all through that web en­gine.

As Windows Latest re­ported in December 2025, Microsoft ac­knowl­edged this slow­ness and was test­ing a new API called Delayed Message Timing” to help di­ag­nose per­for­mance is­sues in WebView2 apps. However, we haven’t seen any use of that API while click­ing Outlook no­ti­fi­ca­tions.

New Outlook runs as 10 sep­a­rate processes in Task Manager, com­pared to Outlook Classic, which runs as a sin­gle com­pact process. The list in­side the new Outlook in­cludes WebView2 Manager, mul­ti­ple WebView2 Utility processes, a WebView2 GPU Process, a WebView2 Service Worker, and more. Each of those is es­sen­tially a browser com­po­nent. They all con­sume mem­ory in­di­vid­u­ally, and they all take time to re­sume from a sus­pended state when you click a no­ti­fi­ca­tion.

Speaking of mem­ory, the new Outlook uses be­tween 490 MB and 636 MB of RAM while idle, with in­di­vid­ual ses­sions vary­ing based on mail­box size. Outlook Classic, do­ing the same job, uses around 117 MB to 148 MB at idle. A roughly four­fold dif­fer­ence.

As for CPU, new Outlook uses around 4% at idle while Outlook Classic uses less than 1%. These num­bers are from my own mea­sure­ments us­ing Task Manager with both apps open si­mul­ta­ne­ously.

Of course, these is­sues are com­mon to all web apps. As we re­ported, WhatsApp now con­sumes 1.2 GB of RAM do­ing noth­ing af­ter Meta re­placed its na­tive WinUI app with a WebView2 wrap­per.

Microsoft has been aware of the of­fline and per­for­mance lim­i­ta­tions of new Outlook for some time. The com­pany spent much of 2024 try­ing to make the app work prop­erly with­out an in­ter­net con­nec­tion, some­thing Outlook Classic han­dles na­tively by caching mail lo­cally. A web app, by de­sign, is al­ways reach­ing out to a server.

New Outlook is im­prov­ing, but the gap with Classic is­n’t clos­ing any­time soon

In fair­ness, the new Outlook has come a long way since its rocky de­but. The March 2026 up­date added bet­ter folder search op­tions and im­proved shared mail­box ac­cess, two ar­eas where the app lagged be­hind Classic for a long time. The May 2026 up­date brought au­tomapped cal­en­dar sup­port, so switch­ing from Classic to new Outlook no longer drops your shared cal­en­dars. Teammate cal­en­dars now show up au­to­mat­i­cally in the nav­i­ga­tion pane.

More re­cently, Microsoft con­firmed a June 2026 up­date with five no­table ad­di­tions, in­clud­ing an all-ac­counts in­box view (also called Unified Inbox) ar­riv­ing in August 2026, im­proved mail merge, and ex­panded .PST sup­port. The .PST im­port up­date in July 2026 will let users bring in cal­en­dar items and con­tacts from lo­cal archive files, which was a long-stand­ing pain point for any­one switch­ing from Classic.

The push to get peo­ple to switch is get­ting louder too. Microsoft listed 15 pro­duc­tiv­ity fea­tures in early June 2026 as rea­sons to make the move from Classic. The list in­cludes of­fline ac­cess, richer Copilot in­te­gra­tion, faster search, im­proved cal­en­dar con­trols, and more. Many of those fea­tures are things Classic users have had for years, which makes the fram­ing a bit odd, but the di­rec­tion is clear. Microsoft wants new Outlook to be­come the de­fault ex­pe­ri­ence for every­one.

We were also told in late 2025 that a cal­en­dar agenda view in the Notification Center was com­ing, bring­ing back a Windows 10 fea­ture that went miss­ing with Windows 11. The agenda view, when it ar­rives, will also be pow­ered by WebView2. Whether it in­tro­duces sim­i­lar de­lays re­mains to be seen.

A web app can­not fix per­for­mance is­sues

Microsoft cel­e­brated growth for new Outlook in 2024, but a sig­nif­i­cant por­tion of that growth came from forced mi­gra­tion. People did not choose the web app be­cause it was faster. They were moved to it be­cause the apps they pre­vi­ously used (Mail + Calendar) were shut down.

New Outlook open­ing fast from the Start menu is a real im­prove­ment. The work be­ing done on new fea­tures shows that Microsoft is lis­ten­ing to com­plaints. But un­til the no­ti­fi­ca­tion ex­pe­ri­ence matches what Outlook Classic has been do­ing with­out is­sue for years, the new Outlook is still work­ing around a fun­da­men­tal con­straint im­posed by the WebView2 ar­chi­tec­ture.

The only so­lu­tion, as you might’ve guessed, is the move to WinUI. We al­ready re­ported that Microsoft is now fully com­mit­ted to WinUI, with Rudy Huyn prepar­ing a team to make na­tive Windows apps, and so we may see a na­tive Outlook too…

For now, if fast no­ti­fi­ca­tion han­dling is im­por­tant to your work­flow, Outlook Classic is the more re­li­able choice. Classic Outlook is still avail­able to down­load and is sup­ported un­til April 2029. The new Outlook will keep im­prov­ing, but some of its lim­i­ta­tions are baked into how it is built, and those are harder to fix with a fea­ture up­date.

Emacs 31 Is Around the Corner: The Changes I'm Already Daily Driving

www.rahuljuliato.com

Karthik Chikmagalur re­cently pub­lished an­other of his ex­cel­lent Even More Batteries Included with Emacs” posts, dig­ging into lesser-known fea­tures that al­ready ship with Emacs to­day. I wanted to write its mir­ror im­age. His post cov­ers the bat­ter­ies al­ready in the box. Mine cov­ers the ones ar­riv­ing in Emacs 31.

Emacs 31 is­n’t out yet, but I’ve been build­ing it from both emacs-31 branch and mas­ter and daily dri­ving it for months. Every time some­thing new and use­ful lands, I fold it into Emacs Solo, my no-ex­ter­nal-pack­ages con­fig, and mark it with a small ; EMACS-31 com­ment so I re­mem­ber to re­visit it once the re­lease is of­fi­cial.

This post walks those bread­crumbs. Every change be­low is one I’m touch­ing in my con­fig right now, with a note on what it does and why I keep it. None of it re­quires a pack­age. It’s all ei­ther on mas­ter al­ready or close be­hind.

One dis­claimer: Emacs 31 is still in de­vel­op­ment (actually in pre-re­lease phase), so names and de­faults can shift be­fore fi­nal re­lease. Everything be­low is what I’m run­ning as of mid-2026. If you’re not build­ing from emacs-31 branch or mas­ter, treat this as a pre­view of what’s com­ing.

Tree-sitter that just works

If I had to pick the sin­gle change I’m hap­pi­est about, it’s this one. For years, get­ting a *-ts-mode go­ing meant man­u­ally pop­u­lat­ing treesit-lan­guage-source-al­ist, call­ing treesit-in­stall-lan­guage-gram­mar, and pray­ing your tool­chain was set up to com­pile the gram­mar. In Emacs 31 a lot of that cer­e­mony goes away:

treesit-en­abled-modes set to t switches the ma­jor modes that have a tree-sit­ter vari­ant over to it, and treesit-auto-in­stall-gram­mar makes Emacs of­fer to fetch and build the gram­mar when it’s miss­ing in­stead of er­ror­ing out. This is the treesit-auto pack­age ex­pe­ri­ence, ex­cept now the core does the work.

The knock-on ef­fect shows up all over my con­fig. I used to keep lines like these around to teach Emacs where each gram­mar lives:

In Emacs 31 the gram­mar sources for lan­guages like TypeScript, TSX, Rust, TOML, YAML and Dockerfile live in­side the modes them­selves, so I’ve got a trail of ;; EMACS-31 this is now de­fined on mode code com­ments mark­ing every block I get to delete once 31 ships. I’ll take less con­fig that does the same job any day.

One foot-gun worth flag­ging if you share your Emacs di­rec­tory tree across ma­chines of dif­fer­ent ar­chi­tec­tures: the auto-in­stalled gram­mars are not seg­re­gated by ar­chi­tec­ture. An x86_64 .so and an ar­m64 one land un­der the same name, so the bi­nary built on one ma­chine won’t load on the other. Something to keep in mind.

There are many more tree-sit­ter im­prove­ments com­ing to Emacs. The de­vel­op­ers have been work­ing tire­lessly on it, Yuan Fu, along with many oth­ers, have been con­tin­u­ously im­prov­ing the tree-sit­ter ex­pe­ri­ence across mul­ti­ple ar­eas. From bet­ter lan­guage sup­port to us­abil­ity and per­for­mance en­hance­ments, tree-sit­ter in Emacs con­tin­ues to evolve at a re­mark­able pace.

A built-in mark­down-ts-mode (experimental)

Emacs 31 ships a mark­down-ts-mode in the box, and this one is close to my heart. I started it. It grew out of a pro­posal I sent to emacs-de­vel back in early 2025, where the idea and the first ver­sion of the code were mine.

I’d be do­ing the mode a dis­ser­vice if I let you think it’s a solo ef­fort. Stéphane Marks came along a bit later, rolled up his sleeves, and has since be­come a co-au­thor of the mode. He’s the en­ergy be­hind much of what makes it nice to use to­day. He did­n’t send a patch or two and move on; he stayed, push­ing the mode well past what I’d sketched out and sweat­ing the de­tails that turn it works” into it’s a plea­sure.” Much of the pol­ish I’m about to brag about is his. The mode is ours now, and it’s bet­ter for it.

Watching an idea make the round trip from a mail­ing-list mes­sage to core code, and pick­ing up a great col­lab­o­ra­tor on the way, is one of the most re­ward­ing things about hang­ing around the Emacs com­mu­nity.

It gives you more than col­ors, and these are the parts I want to show off:

✔️ Org users will feel at home. The key­bind­ings and edit­ing feel stay close to Org: nav­i­gat­ing head­ings, fold­ing sec­tions, mov­ing be­tween struc­tural el­e­ments. If your fin­gers know Org, you won’t have to re­learn Markdown.

✔️ Live, col­ored code blocks, even for non-tree-sit­ter lan­guages. This is my fa­vorite trick. A fenced code block gets fonti­f­ied us­ing the real ma­jor mode for that lan­guage, not dumped as flat mono­space. It reaches Emacs’ own in­ter­nal modes too, so an ```elisp block lights up with true Emacs Lisp font-lock­ing, and the other built-in modes do the same. You get proper syn­tax high­light­ing in­side your code sam­ples with no ex­tra setup.

And it’s not just col­ors: the code-block edit­ing com­mands largely work too, so you can edit a fenced block with the tar­get lan­guage’s mode rather than fight­ing plain text. Completion in­side blocks is still the rough spot, that in­fra­struc­ture is won­der­fully twisty and we haven’t fully cracked it yet, so if you go pok­ing, that’s where the bugs hide.

✔️ Inline im­age view­ing. Image links ren­der in the buffer, so a Markdown doc with screen­shots or di­a­grams reads like a doc­u­ment, not a wall of ![](path) noise.

And many more fea­tures dis­cov­er­able and be­ing de­vel­oped.

Together these make it feel like a com­fort­able place to write and read Markdown in­side Emacs, not a syn­tax high­lighter bolted onto .md files.

One caveat I want to be up­front about: mark­down-ts-mode is still ex­per­i­men­tal, and you have to opt into it. As the header of mark­down-ts-mode.el notes, it is­n’t wired up to auto-mode-al­ist yet, so it won’t take over .md files on its own. For now you pull in the li­brary with M-x load-li­brary RET mark­down-ts-mode, then turn it on in a bufferf, or add it to auto-mode-al­ist your­self if you’re feel­ing brave.

Stéphane and I are work­ing to get it con­sid­ered ready by the next Emacs re­lease, and that’s where you come in. If you try it and hit rough edges, or it works great, we want to hear about it. Send feed­back to the bug list with M-x re­port-emacs-bug, or reach out to me and Stéphane di­rectly. Real-world use is what moves a mode from experimental” to done”, so don’t be shy.

Many more screen­shots here.

Eglot ren­der­ing docs with mark­down-ts (also, still ex­per­i­men­tal)

Speaking of Markdown, Eglot in Emacs 31 can ren­der LSP doc­u­men­ta­tion us­ing that same in­ter­nal mode in­stead of falling back to plain text:

mark­down-ts-view-mode gives you for­mat­ted hover docs with­out pulling in any­thing ex­tra. The same ex­per­i­men­tal caveat ap­plies here, since it leans on mark­down-ts-mode, so treat it as some­thing to opt into rather than a fin­ished de­fault. I also turn off eglot-code-ac­tion-in­di­ca­tions. The new in­line you can do a code ac­tion here” hints are clever, but some lan­guage servers make them noisy, so I keep them off.

There’s also some churn here: eglot-events-buffer-size is on its way out in fa­vor of eglot-events-buffer-con­fig, so I’ve left a ;; EMACS-31 — do we still need it? note on the old vari­able to clean up later.

el­doc at point

A small one I’m fond of:

With this on, el­doc shows the help text for what­ever sits un­der the cur­sor, with­out me in­vok­ing any­thing. Paired with el­doc-echo-area-pre­fer-doc-buffer, it makes wan­der­ing through un­fa­mil­iar code feel more guided.

Smarter, ea­ger com­ple­tion

The minibuffer and com­ple­tion ma­chin­ery picked up a few new tog­gles:

com­ple­tion-ea­ger-up­date and com­ple­tion-ea­ger-dis­play re­fresh the com­ple­tion UI as you type in­stead of wait­ing for you to ask. If you don’t run some­thing like icom­plete, set­ting ea­ger dis­play to t gives you a sharp out-of-the-box ex­pe­ri­ence on its own. And minibuffer-vis­i­ble-com­ple­tions set to up-down lets you move through the vis­i­ble can­di­dates with the ar­row keys, which feels nat­ural at last.

icom­plete got at­ten­tion too, and this is an­other one I had a di­rect hand in. Emacs 31 in­cludes the patch from bug#75784, which I pro­posed and worked on. It brings ver­ti­cal in-buffer be­hav­ior and pre­fix in­di­ca­tors to icom­plete. The side ef­fect I like: a big com­pat­i­bil­ity block I’d been car­ry­ing in my con­fig can fi­nally go away:

Window lay­out gym­nas­tics

This is a fun set of new com­mands for re­ar­rang­ing your win­dow lay­out with­out man­u­ally split­ting and killing win­dows:

Transpose swaps your hor­i­zon­tal and ver­ti­cal arrange­ment, ro­tate spins the whole lay­out around, and the flip com­mands mir­ror it left-to-right or top-to-bot­tom. If you’ve ever built a three-win­dow lay­out and then wished the ed­i­tor pane were on the other side, these do the job and keep every buffer in place while they’re at it.

A Speedbar that lives in a side win­dow

Speedbar has been around for­ever, but in Emacs 31 it learned to live in a proper side win­dow in­stead of a sep­a­rate frame:

speed­bar-win­dow docks it to the side like a mod­ern file tree. On a tiling setup or a sin­gle-mon­i­tor lap­top, that beats the old float­ing-frame be­hav­ior by a mile. A width cap keeps it from fight­ing my other win­dows.

VC niceties

A few ver­sion-con­trol im­prove­ments I’ve hap­pily turned on:

vc-dir-auto-hide-up-to-date is the one I’m most pleased about. Refreshing a vc-dir buffer now hides the up-to-date files on its own, so I no longer need my g-key hack that called vc-dir-re­fresh fol­lowed by vc-dir-hide-up-to-date. Another block marked for dele­tion. vc-al­low-rewrit­ing-pub­lished-his­tory nods to work­flows like Jujutsu and force-push­ing fea­ture branches, where rewrit­ing al­ready-pushed his­tory is a de­lib­er­ate move.

Editable xref buffers

This one is­n’t a vari­able, it’s a com­ment in my con­fig re­mind­ing me to re­move a cus­tom hack:

I’m go­ing to in­dulge my­self and tell the longer ver­sion of this one, be­cause I was part of it and it shows how fea­tures find their way into Emacs.

The itch was this. Both Dired and grep buffers have long had an edit” work­flow. In Dired you tog­gle into wdired-mode; in a grep buffer you press e for grep-edit-mode. Bulk re­nam­ing and bulk search-and-re­place feel nat­ural there. Xref buffers had no such thing. The only edit­ing op­er­a­tion was r (xref-query-replace-in-results), which is regex-only and won’t let you edit in­di­vid­ual lines. I lean hard on pro­ject.el and xref for nav­i­gat­ing and refac­tor­ing, and I kept catch­ing my­self re-run­ning the same search with M-x grep to get an ed­itable buffer. An an­noy­ing de­tour, since xref al­ready held all the in­for­ma­tion needed.

So in March 2026 I sent a patch to bug-gnu-emacs propos­ing a small com­mand, xref-ex­port-to-grep, bound to E in *xref* buffers. It re-fetched the xref items, for­mat­ted them as file:line:con­tent, and dropped them into a grep-mode buffer where you could press e and edit as usual. Nothing fancy. It bridged two things that al­ready ex­isted, and I’d car­ried it as a per­sonal snip­pet for a while.

What hap­pened next is the part I love about this com­mu­nity. Dmitry Gutov, who main­tains xref, looked at it and pushed back on the UI of my ap­proach. My com­mand cre­ated a hop be­tween buffers, and once you landed in the grep buffer you still had to know which key to press. He asked a sharper ques­tion than the one I’d an­swered: did I care about the grep ex­port, or would it be bet­ter if xref buffers let you edit in­line?

That re­fram­ing was right. I told him I had no at­tach­ment to the grep de­tour. Inline edit­ing in the xref buffer it­self, with multi-line ed­its across matches, would kill the whole roundtrip. A few days later he’d writ­ten and pushed xref-edit-mode. It drops the ex­tra step and runs faster on large xref buffers. My orig­i­nal xref-ex­port-to-grep could still go in as an op­tional com­mand with­out a de­fault bind­ing, but the in­line mode is the bet­ter an­swer and it’s what I use now.

The thread did­n’t stop there. It spun off into a wider de­sign chat with Juri Linkov about the *-edit-mode fam­ily (occur/grep/xref, which write each buffer nor­mally) ver­sus wdired’s queue-every­thing-then-C-x C-s model, and whether a fu­ture live” search UI might pre­sent re­sults dif­fer­ently. For the record, here’s the safety net I men­tioned in that thread, a trick I picked up from Protesilaos that lets me hit d to diff a buffer against its file be­fore sav­ing dur­ing save-some-buffers:

Back to the topic, the end re­sult: Emacs 31 ships ed­itable xref buffers, my con­fig drops a home­grown workaround, and the fea­ture that landed beats the one I pro­posed, be­cause the main­tainer asked the right ques­tion. Getting to play a small part in that loop is a big chunk of why I en­joy liv­ing on mas­ter. The full back-and-forth is pub­lic in bug#80616 if you’re cu­ri­ous.

So, if you would like to try it. After C-x p g, grep for some­thing like FontAwesomeIcon. Now e starts the edit mode, make your ed­its, C-c C-c to con­firm.

ERC gets ti­dier

A cou­ple of IRC im­prove­ments, since I live in ERC:

This makes ERC in­sert pren­vi­ous logs only for newly opened tar­get buffers, the be­hav­ior I want when re­join­ing chan­nels. And one of my fa­vorite small fixes: in Emacs 31 the scroll­to­bot­tom mod­ule no longer de­pends on erc-fill-wrap, so I can drop the con­di­tional that used to add it by hand for older ver­sions. Thank you to who­ever un­tan­gled that.

The grab bag of qual­ity-of-life knobs

And then there’s the long tail of tiny im­prove­ments that don’t each de­serve a sec­tion but ab­solutely earn their place:

A few of these are worth a sen­tence:

✔️ kill-re­gion-dwim fixes a decades-old pa­per­cut. Set it to emacs-word and hit­ting C-w with no ac­tive re­gion kills a word back­wards in­stead of sig­nalling an er­ror. No more the mark is not ac­tive” in­ter­rup­tions.

✔️ view-los­sage-auto-re­fresh turns C-h l into a live view of your last key­strokes. When I’m screen-shar­ing or teach­ing, peo­ple can watch the keys I press in real time.

✔️ ielm-his­tory-file-name lets my IELM scratch ses­sions sur­vive a restart, the way comint and the shell al­ready do.

✔️ na­tive-comp-async-on-bat­tery-power nil saves the lap­top: no sur­prise fan spin-ups from back­ground na­tive com­pi­la­tion while I’m un­plugged on a train.

✔️ tty-tip-mode brings tooltips to the ter­mi­nal, a nice touch for those of us who run Emacs in -nw.

Honorable men­tion: term stops eat­ing lines

This one gets no con­fig line, be­cause there’s noth­ing to con­fig­ure. A bug got fixed, and it makes me hap­pier than it has any right to.

For a long time, term (and ansi-term) had a nasty habit of swal­low­ing lines. Full-screen, cur­sor-ad­dress­ing pro­grams left the dis­play gar­bled, with rows eaten or mis­placed as the pro­gram re­drew. That hit the ex­act pro­grams you most want a real ter­mi­nal for: htop, nethack, any­thing curses-based was close to un­us­able in­side Emacs’ ter­mi­nal.

Emacs 31 fixes it. term re­draws cor­rectly now, and I can run htop to watch processes or fire up nethack for a quick” break with­out the buffer turn­ing into con­fetti. It sounds small, and it re­moves one of the last rea­sons I had to reach for an ex­ter­nal ter­mi­nal em­u­la­tor.

Honorable men­tion 2: Modus 5 themes!

Thanks to Protesilaos, Emacs now ships with sev­eral modus themes:

✔️ modus-operandi-deuter­a­nopia — Deuteranopia-optimized theme with a white back­ground.

✔️ modus-operandi — Elegant, highly leg­i­ble theme with a white back­ground.

✔️ modus-operandi-tinted — Elegant, highly leg­i­ble theme with a light ochre back­ground.

✔️ modus-operandi-tri­tanopia — Tritanopia-optimized theme with a white back­ground.

✔️ modus-vivendi-deuter­a­nopia — Deuteranopia-optimized theme with a black back­ground.

✔️ modus-vivendi — Elegant, highly leg­i­ble theme with a black back­ground.

✔️ modus-vivendi-tinted — Elegant, highly leg­i­ble theme with a night sky back­ground.

✔️ modus-vivendi-tri­tanopia — Tritanopia-optimized theme with a black back­ground.

Why bother run­ning mas­ter?

People ask why I daily drive an un­re­leased Emacs. Same rea­son I run a no-pack­ages con­fig: I want to know what’s in the box, and the way to learn what’s com­ing is to live in it. Most of these changes are small, yet they add up to an ed­i­tor that needs less of my glue code each re­lease. Watching my con­fig get shorter as the core ab­sorbs things I used to hand-roll is one of the quiet joys of be­ing an Emacs user.

For the other side of this coin, the bat­ter­ies al­ready there wait­ing to be found, go read Karthik’s post. It’s a great com­pan­ion to this one. And to see every snip­pet above in con­text, they’re all in the Emacs Solo init.el, each marked with that small ; EMACS-31 bread­crumb.

See you when 31 ships, at which point I get to go delete a pile of code. Happy hack­ing.

Edit

2026 – 06-18: Thanks to Stéphane Marks for the care­ful read and cor­rec­tions. He flagged the tree-sit­ter ar­chi­tec­ture foot-gun for shared con­fig di­rec­to­ries (now noted above), pointed out that mark­down-ts-mod­e’s code-block edit­ing com­mands work and not just the high­light­ing, and caught that the VC vari­able is now vc-dir-auto-hide-up-to-date, not the name I’d writ­ten.

AMD silently removes memory encryption from consumer Ryzen CPUs, leaving users unaware that they may be vulnerable — security feature vanishes after newer AGESA firmware, AMD engineers go radio silent when pressed about the change

www.tomshardware.com

According to a re­port by Ars Technica, AMD has qui­etly stripped a crit­i­cal se­cu­rity fea­ture from its lower-end CPUs, leav­ing un­aware users po­ten­tially vul­ner­a­ble to phys­i­cal at­tacks. Following a months-long in­ves­ti­ga­tion tracked on GitHub, Ben Kilpatrick con­firmed that the Transparent Secure Memory Encryption (TSME) fea­ture — which pro­tects CPUs against phys­i­cal ex­ploits that siphon data from con­nected mem­ory chips — was sud­denly no longer avail­able on AMD CPUs out­side the com­pa­ny’s Pro lineup.

As the ex­haus­tive in­quiry, which in­volved con­ver­sa­tions with AMD en­gi­neers, board ven­dors, and other CPU users, was com­ing to a head, an AMD en­gi­neer abruptly cut dis­cus­sions short, stat­ing, My apolo­gies, but I don’t have any more in­for­ma­tion to share on this topic.” As of this re­port, AMD has nei­ther of­fi­cially ac­knowl­edged nor ex­plained the dis­ap­pear­ance of the se­cu­rity fea­ture.

TSME is a pro­tec­tion fea­ture that en­crypts the data stored in mem­ory, mak­ing it un­us­able to phys­i­cal at­tack­ers. AMD ini­tially added this fea­ture to its high-end CPUs, then later ex­tended it to lower-end CPUs. Eventually, the fea­ture be­came a given, leav­ing lower-end chip users as­sured in its avail­abil­ity as part of the chip pack­age. However, with­out prior no­tice, AMD ap­pears to have scrapped the se­cu­rity fea­ture in these proces­sors.

According to the Ars re­port, the com­pa­ny’s only of­fi­cial re­ac­tion to the mat­ter — not count­ing the GitHub dis­cus­sions — is an email re­sponse stat­ing that TSME is a se­cu­rity fea­ture only ap­plied to PRO CPUs as part of AMD PRO Technologies,” no­tably the first time the com­pany has pub­licly stated such a re­stric­tion, de­spite the fea­ture hav­ing worked on con­sumer chips for years. However, it re­mains un­clear whether the dis­ap­pear­ance is an in­ten­tional pol­icy de­ci­sion by AMD to re­serve TSME for Pro chips or an un­in­ten­tional re­gres­sion that was in­tro­duced in AGESA 1.2.7.0, a newer firmware re­lease.

Another con­cern­ing as­pect of the re­moval is that the fea­ture’s dis­ap­pear­ance is com­pletely un­de­tectable on Windows ma­chines and re­quires sig­nif­i­cant tech­ni­cal work to iden­tify on Linux. That means the se­cu­rity fea­ture was re­moved, leav­ing users un­aware that any­thing had changed.

Kilpatrick, a self-de­scribed privacy-conscious Linux hob­by­ist” who first re­ported the change, was in­stalling a new op­er­at­ing sys­tem on his ma­chine run­ning a Ryzen 7 9700X from the Zen 5 ar­chi­tec­ture. To con­firm that all his se­cu­rity pro­tec­tions were en­abled, he ran Host Security ID (HSI), an au­dit­ing fea­ture that eval­u­ates a sys­tem’s firmware and hard­ware se­cu­rity con­fig­u­ra­tions. To his sur­prise, HSI re­ported that TSME was no longer sup­ported — even though he had en­abled it in his BIOS set­tings all along. The con­tra­dic­tion sent him search­ing for an­swers.

His first in­stinct was to reach out to MSI, his moth­er­board’s man­u­fac­turer, but the com­pany did­n’t ini­tially pro­vide a de­fin­i­tive ex­pla­na­tion. He also filed a bug re­port on AMDs pub­lic en­gi­neer­ing GitHub repos­i­tory, where two AMD en­gi­neers even­tu­ally re­sponded: Tom Lendacky, an AMD fel­low soft­ware en­gi­neer, and Mario Limonciello, an AMD se­nior prin­ci­pal soft­ware en­gi­neer.

Get Tom’s Hardware’s best news and in-depth re­views, straight to your in­box.

Interestingly, nei­ther en­gi­neer ap­peared to have a clear an­swer for why the fea­ture had dis­ap­peared. Their ad­vice was ba­si­cally the same: dis­able and re-en­able the op­tion in the BIOS, and if that did­n’t work, take it up with the moth­er­board man­u­fac­turer, mak­ing it clear that peo­ple di­rectly at AMD were just as in the dark as the user re­port­ing it.

It was only af­ter this that Kilpatrick pressed MSI harder, even­tu­ally con­vinc­ing its en­gi­neers to run con­trolled tests. They found that con­sumer Ryzen chips had TSME en­abled un­der an older firmware ver­sion but showed it as not sup­ported” un­der a newer one (AGESA 1.2.7.0), while Pro ver­sions of the CPU sup­ported the fea­ture re­gard­less of the firmware or moth­er­board used.

This leaves the big ques­tion of whether AMD de­lib­er­ately re­stricted TSME to its Pro chips, or whether the change was an ac­ci­den­tal re­gres­sion — a firmware bug in­tro­duced in that newer AGESA ver­sion. Either way, the sil­i­con ap­pears to have been ca­pa­ble of run­ning the fea­ture. The dif­fer­ence is whether users are look­ing at a bug that AMD should fix or a quiet prod­uct-seg­men­ta­tion de­ci­sion that AMD has not prop­erly ex­plained.

Kilpatrick took these MSI find­ings back to the AMD en­gi­neers and re­sumed the dis­cus­sion six weeks later. MSIs prod­uct mar­ket­ing team, he re­ported, had been told di­rectly by AMD that TSME is ex­clu­sively sup­ported on Pro se­ries proces­sors. He also re­layed MSIs test re­sults: an in­ter­nal AGESA flag that con­trols whether TSME ac­ti­vates dur­ing boot re­turned FALSE on con­sumer chips re­gard­less of the BIOS set­ting, but TRUE on Pro proces­sors when the fea­ture was en­abled.

Kilpatrick then brought up some­thing es­pe­cially awk­ward. He re­minded Lendacky of a com­ment that the en­gi­neer had made back in 2020, con­firm­ing that a Ryzen 3700X, a con­sumer CPU, should sup­port TSME.” In a later 2025 com­ment in the same dis­cus­sion, Lendacky again rec­om­mended us­ing TSME, while not­ing that the moth­er­board BIOS provider had to ex­pose the op­tion. So there it was, AMDs own en­gi­neer, years ear­lier, ac­knowl­edg­ing the fea­ture work­ing on ex­actly the kind of lower-end chip now stripped of it, prov­ing that Ryzen sup­port was not some fan­tasy users in­vented.

After some more back-and-forth, Kilpatrick asked bluntly whether the flag be­ing set to FALSE on con­sumer chips was a sil­i­con-level lim­i­ta­tion or a firmware pol­icy de­ci­sion — since one is per­ma­nent and the other is po­ten­tially re­versible. Limonciello’s re­ply ef­fec­tively closed the chap­ter. My apolo­gies, but I don’t have any more in­for­ma­tion to share on this topic,” he wrote.

To be fair to AMD, there is no clear in­di­ca­tion that the com­pany ever pub­licly ad­ver­tised TSME as a con­sumer Ryzen fea­ture. AMD has long said that a re­lated mem­ory pro­tec­tion, Secure Memory Encryption (SME), is avail­able only in the Pro and EPYC CPU tiers. SME is OS-managed, us­ing a sin­gle key and al­low­ing the OS to se­lec­tively en­crypt in­di­vid­ual mem­ory pages. TSME, by con­trast, is firmware-man­aged, en­crypt­ing all RAM with no OS in­volve­ment. When ac­tive, it guards against phys­i­cal at­tacks such as cold-boot ex­ploits, DRAM in­ter­face snoop­ing, and mem­ory mod­ule re­moval, and it ac­ti­vates silently once en­abled in the BIOS, mak­ing it the more prac­ti­cally use­ful of the two pro­tec­tions.

For now, AMD has said noth­ing of­fi­cial. It has­n’t con­firmed what hap­pened, why it hap­pened, whether any­thing ac­tu­ally changed, or what users of its con­sumer chips should now ex­pect. Given the years of TSME qui­etly do­ing its job on these lower-cost proces­sors — and the AMD en­gi­neers’ sup­posed own past com­ments treat­ing it as sup­ported — users had every rea­son to re­gard it as part of the pack­age.

For most con­sumer Ryzen users, the prac­ti­cal im­pact of the change is nar­row. TSME pro­tects against phys­i­cal at­tacks, mean­ing sce­nar­ios in which some­one has phys­i­cal ac­cess to the ma­chine or its mem­ory hard­ware and at­tempts to ex­tract se­crets di­rectly from RAM. The fea­ture is more im­por­tant for peo­ple car­ry­ing sen­si­tive lap­tops, han­dling con­fi­den­tial work, re­ly­ing on full-disk en­cryp­tion, or op­er­at­ing in en­vi­ron­ments where seizure, theft, or hard­ware tam­per­ing is a re­al­is­tic con­cern. Anyone who gen­uinely needs mem­ory en­cryp­tion on AMD hard­ware now ap­pears to need a Ryzen Pro or EPYC sys­tem, un­less AMD clar­i­fies the sit­u­a­tion or re­stores sup­port.

Follow Tom’s Hardware on Google News, or add us as a pre­ferred source, to get our lat­est news, analy­sis, & re­views in your feeds.

Etiido Uko is a news con­trib­u­tor for Tom’s Hardware cov­er­ing the lat­est up­dates in big tech and the PC in­dus­try. He is a me­chan­i­cal en­gi­neer and se­nior tech­ni­cal writer with over nine years of ex­pe­ri­ence in doc­u­men­ta­tion and re­port­ing. He is deeply pas­sion­ate about all things en­gi­neer­ing and tech­nol­ogy, and is an ex­pert in gad­gets, man­u­fac­tur­ing, ro­bot­ics, au­to­mo­tive, and aero­space.

Submission.Directory · Find where to submit your website.

www.submission.directory

A hand-picked di­rec­tory of web­site sub­mis­sion sites. Find the best places to sub­mit your web­site, startup, or prod­uct, earn qual­ity back­links, and rank higher across search en­gines and AI an­swers.

High-authority pub­lish­ing plat­form. Links are no­fol­low, but reach and re­post­ing po­ten­tial are large.

The canon­i­cal com­pany pro­file. Investors, jour­nal­ists, and ag­gre­ga­tors pull from it, so a com­plete pro­file pays off well be­yond the link.

Show HN your pro­ject. A front-page hit is one of the high­est-sig­nal launches on the web. Links are no­fol­low but the traf­fic is real.

The de­fault launch stage for new prod­ucts. A strong launch day dri­ves a traf­fic spike, first users, and durable re­fer­ral links from cov­er­age.

Active sub­red­dit for launch­ing side pro­jects. Nofollow, but a hit thread dri­ves real, en­gaged traf­fic.

Legacy tech au­thor­ity; its SourceForge-linked soft­ware list­ing car­ries se­ri­ous do­main weight.

The biggest soft­ware re­view mar­ket­place. A claimed list­ing with re­views ranks for [category] soft­ware’ and feeds com­par­i­son pages.

Premier web-de­sign awards. A nom­i­na­tion is a strong cred­i­bil­ity sig­nal and a pro­file on a high-au­thor­ity de­sign do­main; sub­mis­sion fee ap­plies.

Gartner-owned soft­ware di­rec­tory with high com­mer­cial-in­tent traf­fic. Free ven­dor list­ing; paid for place­ment.

Write a launch post or tu­to­r­ial for a large de­vel­oper read­er­ship. Canonical-friendly and in­dexes fast.

Crowdsourced al­ter­na­tives di­rec­tory with enor­mous long-tail reach. Add your app as an al­ter­na­tive to in­cum­bents.

Tech pub­li­ca­tion that ac­cepts con­trib­u­tor sto­ries. Editorial re­view, big read­er­ship, con­tex­tual links.

Gartner Digital Markets sis­ter to Capterra. One ven­dor signup syn­di­cates across the net­work.

Third Gartner prop­erty. Buyer-intent traf­fic and a pro­file link; ba­sic list­ing is free.

Founder net­work, ac­cel­er­a­tor deals, and a com­pany pro­file. High DR and use­ful for fundrais­ing vis­i­bil­ity.

Post your prod­uct and mile­stones to a com­mu­nity of founders. Great for feed­back, ac­count­abil­ity, and a pro­file back­link.

Gallery for one-page web­sites. Editorial cu­ra­tion; paid re­view op­tion for faster, guar­an­teed place­ment.

Publish your tech stack and tools. Developer au­di­ence and a pro­file link; good fit for dev-fac­ing prod­ucts.

Developer blog­ging plat­form with cus­tom-do­main blogs. Good for tech­ni­cal con­tent mar­ket­ing.

The high­est-traf­fic AI tools di­rec­tory. Free sub­mis­sion queue is long; paid fast-tracks re­view.

Curated land­ing-page gallery. A fea­ture sends de­sign-con­scious traf­fic and a do­fol­low link.

Early-stage star­tups in front of an au­di­ence of early adopters. Free queue is slow; paid skips the line.

Large AI-tool cat­a­log with cat­e­gory browse. Free tier avail­able; fea­tured slots are paid.

Kagi’s Small Web sur­faces fresh posts from per­sonal blogs and in­de­pen­dent sites. Getting your blog into the Small Web feed sends cu­ri­ous read­ers your way.

Invite-only, high-sig­nal com­put­ing com­mu­nity. Quality-gated, so sub­mis­sions need gen­uine tech­ni­cal merit.

Professional net­work for mak­ers with a Launchpad. Quality au­di­ence; a good Show-and-Tell venue.

Curated AI-tool col­lec­tion by Matt Wolfe. Hand-reviewed, so list­ings carry cred­i­bil­ity.

Curated di­rec­tory of startup tools and re­sources. Dofollow list­ing; paid re­view op­tion.

AI tools di­rec­tory with strong pro­gram­matic-SEO sur­face area. Free and paid sub­mis­sion paths.

Inspiration gallery of clean, mod­ern sites. Selective cu­ra­tion and a pro­file back­link.

Software al­ter­na­tives and com­par­i­son site. Listings rank for [competitor] al­ter­na­tives’ and put your prod­uct in front of buy­ers ac­tively com­par­ing tools.

Five best de­sign links each day. Extremely se­lec­tive; a pick is high-sig­nal and do­fol­low.

SaaS mar­ket­place and re­view plat­form with pod­casts and roundups. Free list­ing plus paid pro­mo­tion.

Startup blog and sub­mis­sion di­rec­tory. Paid fea­ture gets you a writeup plus a do­fol­low link.

Software dis­cov­ery and com­par­i­son plat­form with cat­e­gory rank­ings. Free list­ing avail­able.

Gallery fo­cused on SaaS land­ing pages. Niche-relevant de­sign au­di­ence and a fea­ture on a re­spected gallery.

Daily startup dis­cov­ery plat­form. Free list­ing with a do­fol­low link; paid for top place­ment.

Directory of new and up­com­ing star­tups. Free sub­mis­sion with a do­fol­low link; paid for fea­tured.

An in­de­pen­dent search en­gine that fa­vors small, text-first, non-com­mer­cial sites. Getting in­dexed puts your site in front of peo­ple de­lib­er­ately seek­ing the hu­man web.

A search en­gine for the clas­sic, hand-made web of per­sonal pages and hobby sites. Submit a page to be in­dexed and found by peo­ple who miss the old in­ter­net.

Launch plat­form for de­vel­oper tools, run by the Hacker News-adjacent dev com­mu­nity.

AI tools di­rec­tory and newslet­ter. Dofollow list­ing with a real au­di­ence for launches.

Marketplace to show­case or sell side pro­jects. Niche but rel­e­vant au­di­ence and a pro­file link.

Launch di­rec­tory with a do­fol­low link, but the free tier re­quires em­bed­ding their badge on your site. Skip it if you won’t add the back­link.

Community-driven startup di­rec­tory. Upvote-based dis­cov­ery and a pro­file back­link.

Daily prod­uct launch plat­form for tools and re­sources. Free queue plus paid pre­mium place­ment.

Directory of AI-powered SaaS. Dofollow list­ing aimed squarely at AI/SaaS launches.

Describe your prod­uct in ten words. Minimalist di­rec­tory with a sur­pris­ingly en­gaged au­di­ence.

Product Hunt-style launch board with a gen­er­ous free tier and a do­fol­low link on ap­proval.

A com­mu­nity-main­tained di­rec­tory of per­sonal web­sites be­long­ing to Hacker News users. Add yours to reach a tech­ni­cal au­di­ence with a do­fol­low link.

Discover the in­die web one blog post at a time with a ran­dom-blog but­ton. Suggest your blog for a free list­ing and a do­fol­low link to your home­page.

Launch plat­form for in­die and mi­cro-SaaS prod­ucts. Lightweight re­view and a pro­file link.

Launch and up­vote plat­form for star­tups. Free sub­mis­sion and a pro­file link.

A cu­rated di­rec­tory of com­mand-line and TUI tools for de­vel­op­ers and en­gi­neers. Submit your ter­mi­nal app to reach peo­ple hunt­ing for new CLI tools, with a do­fol­low link back to your repo or site.

Fast, no-frills launch board pop­u­lar with in­die hack­ers. Quick ap­proval and a back­link.

A hand-cu­rated blogroll of per­sonal blogs across every topic. Submit your blog for a free list­ing and a do­fol­low link in a di­rec­tory built to help read­ers re­dis­cover in­de­pen­dent writ­ing.

A di­rec­tory of per­sonal blogs run by Hacker News users. A sim­ple way to get a de­vel­oper and founder blog dis­cov­ered, with a do­fol­low link to your site.

A cu­rated blog reader and search en­gine for high-qual­ity in­de­pen­dent blogs. Submit a blog to be read, in­dexed, and linked for a niche au­di­ence of read­ers.

An AI tools di­rec­tory where founders list their prod­ucts and AI work­flows. A free list­ing puts your tool in front of buy­ers hunt­ing for new AI tools, with paid fea­tured slots avail­able.

A live feed of fresh posts from in­de­pen­dent blogs across the web. Submit your blog to ap­pear in the feed with a do­fol­low link to your home­page.

A hand-picked di­rec­tory of stand­out web­sites and tools, billed as the best of the in­ter­net. Submit your site for a re­viewed list­ing with a do­fol­low link, or pay to fea­ture it for ex­tra reach.

A cu­rated in­dex of in­de­pen­dent web­sites and per­sonal cor­ners of the in­ter­net. A place to sub­mit your in­die site and find oth­ers build­ing out­side the big plat­forms.

A di­rec­tory of per­sonal /top4 pages, where peo­ple share a ranked list of their top three fa­vorites and an hon­or­able men­tion on any topic. Add your /top4 page for a free list­ing and a do­fol­low link.

.gitignore Isn’t the Only Way To Ignore Files in Git

nelson.cloud

I’ve been us­ing Git for so long and I just re­al­ized you can ig­nore files at three dif­fer­ent lev­els and not just with .gitignore. The three files you can use to ig­nore files are:

.gitignore

.git/info/exclude

~/.config/git/ignore

.gitignore is the usual file where you write files you want to ig­nore. It’s checked into Git along with the rest of the code. Whatever files you add to it will not get taken into ac­count when run­ning git com­mands.

.git/info/exclude

The ex­clude file lives in the .git di­rec­tory of every Git repos­i­tory but changes to it are not checked into Git. It usu­ally has a few com­ment lines on a fresh Git repos­i­tory. This file is use­ful for ig­nor­ing things on a per-repo ba­sis. For ex­am­ple, you may have a per­sonal notes.txt file in a repos­i­tory that you don’t want to check into git but you also don’t want to add to .gitignore be­cause it’s unique to your work­flow. In that case you would add notes.txt to .git/info/exclude.

~/.config/git/ignore

The ig­nore file lives in your ma­chine’s home di­rec­tory in ~/.config/git/ignore. Whatever file­names are added to this file are ig­nored glob­ally at a ma­chine-level. This file is not checked into Git and is­n’t as­so­ci­ated with any par­tic­u­lar repos­i­tory. It’s a great place to add files that you want to ig­nore in every git repos­i­tory on your com­puter. For ex­am­ple, if you’re on ma­cOS, adding .DS_Store here would be ideal.

You can cus­tomize the global ig­nore file to be a dif­fer­ent file. For ex­am­ple, if you want your global git ig­nore file to be .gitignore_global you would run the com­mand:

Shell

git con­fig –global core.ex­cludes­File ~/.gitignore_global

And if you ever want to re­turn to the de­fault set­ting, run:

Shell

git con­fig –global –unset core.ex­cludes­File

Checking Which File Is Ignoring a Specific File

When adding file­names to any of these, you can use this com­mand to check how a file­name is be­ing ig­nored. For ex­am­ple, if you want to check how .DS_Store is be­ing ig­nored, run git check-ig­nore -v .DS_Store in any Git repos­i­tory.

Here is the out­put when the repos­i­to­ry’s .gitignore is ig­nor­ing .DS_Store:

Console

$ git check-ig­nore -v .DS_Store .gitignore:1:.DS_Store .DS_Store

Here is the out­put when the repos­i­to­ry’s .git/info/exclude is ig­nor­ing .DS_Store:

Console

$ git check-ig­nore -v .DS_Store .git/info/exclude:7:.DS_Store .DS_Store

Here is the out­put when the global ~/.config/git/ignore file is ig­nor­ing .DS_Store:

Console

$ git check-ig­nore -v .DS_Store /Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store

And here is the out­put when a cus­tom global ig­nore file .gitignore_global is ig­nor­ing .DS_Store:

Console

$ git check-ig­nore -v .DS_Store /Users/nelson/.gitignore_global:1:.DS_Store .DS_Store

If there is noth­ing ig­nor­ing a file, the git check-ig­nore -v com­mand pro­duces no out­put.

The founder of Craigslist has given away half a billion dollars. He fears for an America where generosity is trolled

www.independent.co.uk

Craig Newmark, mul­ti­mil­lion­aire founder of Craigslist, has long had trou­ble keep­ing his mouth shut — lead­ing to some influential mis­takes”, he read­ily ad­mits.

But he does­n’t con­sider it a lapse in judge­ment that he’s given away half a bil­lion dol­lars to char­ity since found­ing the clas­si­fied ads site 30 years ago — nor voic­ing his hope that oth­ers with vast for­tunes will take a sim­i­lar tack.

There has been a shift away from phil­an­thropy to­ward hard-edged in­di­vid­u­al­ism and os­ten­ta­tious dis­plays of wealth in America in re­cent years, even in the high­est of­fice. President Donald Trump has in­creased his net worth from $4.3 bil­lion to $7.3 bil­lion dur­ing his sec­ond term, plans to spend $600 mil­lion on the White House ball­room and is gild­ing the cap­i­tal at every turn.

Billionaire ven­ture cap­i­tal­ist Peter Thiel told The New York Times ear­lier this year that he had been en­cour­ag­ing wealthy peers to undo com­mit­ments to The Giving Pledge, a long­stand­ing phil­an­thropic cam­paign that en­cour­ages the ul­tra-rich to give away vast sums dur­ing their life­time to causes of their choos­ing. Thiel claimed con­tri­bu­tions would go to left-wing” non­prof­its, ac­cord­ing to an au­dio tran­script pro­vided to Reuters, and dubbed it an Epstein-adjacent fake Boomer club.”

Newmark signed The Giving Pledge last year and re­cently wrote aNew York Times op-ed on how he was dumb­founded by Thiel and some other bil­lion­aires’ po­si­tions.

When I started Craigslist in the mid-1990s, I never thought I’d be­come rich. But I did. A lot of peo­ple in tech around that time also got lucky. Millions — even bil­lions — were made sim­ply by be­ing in the right place at the right time,” he wrote. That’s too much money for any­one to have, so I’m giv­ing most of it away to peo­ple and causes that need it. It makes no sense to me that oth­ers with this kind of money would crit­i­cize any­one do­ing this.”

Newmark, 74, told The Independent that he does­n’t judge other wealthy peo­ple who don’t want to give their money away but nev­er­the­less finds their de­ci­sions hard to fathom.

Everyone has to make their own moral de­ci­sions,” he said. There are some highly vis­i­ble, su­per-rich peo­ple who’ve made their own de­ci­sions, and it’s their right to make those de­ci­sions. I just don’t re­ally un­der­stand.”

His own fi­nan­cial de­ci­sions are rooted in a class­room at the Jewish Community Center in Morristown, New Jersey. It’s there that six-year-old Newmark at­tended the Sunday school of Holocaust sur­vivors Rafael and Rachel Levin in the late Fifties, and never for­got the les­son that kind­ness was more im­por­tant than riches.

They told me that I should treat peo­ple like I want to be treated,” he said. I should know when enough is enough. And they told me I should be my broth­er’s keeper or my sis­ter’s keeper. And that made sense to me.”

The sen­ti­ment re­mained with him early in his ca­reer when he was a soft­ware en­gi­neer at Bank of America and Charles Schwab, and even af­ter he launched his un­ex­pect­edly pop­u­lar clas­si­fieds site Craigslist in 1996.

The site started as a weekly email de­tail­ing up­com­ing events that Newmark would send to friends while liv­ing in San Francisco. Over time, the email trans­formed into a clas­si­fieds site with list­ings for every­thing from cars and free couches to jobs and events.

In 1999, Craigslist took off and Newmark re­al­ized he had to turn it into a real” com­pany. But he did­n’t know how to man­age the grow­ing site with a team mainly made up of vol­un­teers, and he needed paid staff, such as pro­gram­mers and cus­tomer ser­vice. Newmark had a choice — get cozy with ven­ture cap­i­tal­ists and bankers for fund­ing, change the busi­ness model and get rich, or do it his way.

The VCs and bankers I met at in­dus­try events said they wanted to throw huge amounts of money at me — bil­lions,” he said. But I’d have to do the usual Silicon Valley thing and they would then mon­e­tize the site thor­oughly, and it would be­come a very dif­fer­ent place.”

Rather than suc­cumb to a model that likely would have charged peo­ple for list­ings, Newmark chose to charge busi­nesses for their posts but kept Craigslist free for the av­er­age user.

Craigslist grew into an amaz­ing suc­cess story, loved for its sim­ple de­sign and quirky list­ings, and re­mains among the top-500 most vis­ited web­sites in the world. More than 100 mil­lion users vis­ited Craiglist in April, ac­cord­ing to web an­a­lyt­ics firm Semrush.

While Newmark said he was never a bil­lion­aire, his wealth could have bought a fleet of lux­ury ve­hi­cles, su­pery­acht and homes on each con­ti­nent. But aside from an oc­ca­sional lav­ish meal, he says the trap­pings of ex­treme wealth held lit­tle pull for him. He does­n’t own a car and takes pub­lic trans­porta­tion in New York City.

His typ­i­cal day con­sists of work meet­ings, cof­fee with friends, feed­ing a pair of neigh­bor­hood pi­geons he’s named Mr. and Mrs. Hatbird, read­ing sci­ence fic­tion and watch­ing TV at night with his wife of 14 years, Eileen, who runs an apart­ment co-op in New York City.

I re­al­ized I [didn’t] have to make much money to be happy,” Newmark said. As a nerd, I was obliv­i­ous to the so­cial cues peo­ple use to in­di­cate what they’re about. had no in­ter­est in pres­tige or sta­tus items. Even now, I’m not com­fort­able with pres­tige or sta­tus.”

In 2015, he started Craig Newmark Philanthropies. Through the or­ga­ni­za­tion, Newmark do­nates to causes in ar­eas that in­ter­est him, such as cy­ber­se­cu­rity, jour­nal­ism, mil­i­tary fam­i­lies and vet­er­ans, and even pi­geon res­cue.

His work with or­ga­ni­za­tions like Blue Star Families, which helps mil­i­tary fam­i­lies find sup­port and build re­la­tion­ships wher­ever they’re sta­tioned, is a way to honor his dad, who served in the Army in Second World War and died from can­cer when Newmark was 13.

Newmark also joined The Giving Pledge, started by Microsoft bil­lion­aire Warren Buffet and Bill and Melinda Gates in 1996, to en­cour­age the world’s rich­est peo­ple to give away at least half of their for­tunes dur­ing their life­time. Members of the pledge in­clude OpenAI founder Sam Altman and hus­band Oliver Mulherin, phil­an­thropist MacKenzie Scott, and LinkedIn co-founder Reid Hoffman and wife Michelle Yee.

At first, Newmark could­n’t sign the pledge be­cause he was­n’t a bil­lion­aire, he said, but the ini­tia­tive sub­se­quently ex­panded its mem­ber­ship and he joined in 2025. He de­scribed it as a sur­real mo­ment, be­cause he never set out to be rich, but he was stand­ing up for regular peo­ple who want to share,” he said.

The Giving Pledge matched my val­ues,” Newmark said. I could make a state­ment putting my money where my mouth is, and that would be a good thing.“

Altruistic as the ini­tia­tive may seem, it’s re­ceived a fair amount of crit­i­cism over the past few years. Coinbase co­founder Brian Armstrong took the un­prece­dented step of with­draw­ing his pledge, ac­cord­ing to Forbes, while Oracle co­founder Larry Ellison had amended his pledge to in­clude for-profit work.

Thiel, in par­tic­u­lar, has openly dis­cour­aged peo­ple from sign­ing the pledge and has pushed par­tic­i­pants to leave it, ac­cord­ing to The New York Times. Thiel claimed in au­dio tran­scripts pro­vided to Reuters in March that he told Elon Musk, the world’s rich­est man, not to sign the pledge be­cause his con­tri­bu­tions would go to left-wing” non­prof­its of Bill Gates’ choos­ing.

Thiel’s claim con­tra­dicts the The Pledge’s poli­cies, which state that donors choose where the money goes and they pur­sue their phil­an­thropy in­de­pen­dently.”

Newmark ex­pressed con­cern about the back­lash in a opin­ion piece for The Times a few weeks later.

It’s bizarre to me that the pledge has now come un­der at­tack by some tech bil­lion­aires who say we’re giv­ing our money away fool­ishly, or com­plain that the money is go­ing to left-wing non­prof­its. I don’t un­der­stand the crit­ics’ logic, but pol­i­tics and that sort of crit­i­cism have never re­ally made much sense to me,” he wrote.

The piece touched a nerve with peo­ple across so­cial me­dia. Always grate­ful for your moral clar­ity, as ever,” LinkedIn user Anil Dash wrote in re­sponse to Newmark’s op-ed. There’s some­thing pro­found in just telling the truth and re­mind­ing peo­ple that do­ing the right thing, the good thing, can be *obvious*.”

Newmark says he was­n’t aware of the piece’s im­pact as he has no idea how much in­flu­ence I have.”

He added: Friends tell me that I have more than I know. But for me to see and re­al­ize the ef­fect re­quires the so­cial skills that I lack.”

His phil­an­thropy has been at the end of a long road, he said. Looking back on his pre-Craigslist days, he said he could be a real jerk” at work.

I would … cor­rect peo­ple in front of other peo­ple when there is no point in do­ing so,” he said. And that’s stu­pid. But I did­n’t know it un­til years af­ter.”

Newmark says he started to change dur­ing his years at Charles Schwab and when he han­dled cus­tomer ser­vice queries in his early days at Craigslist.

Doing cus­tomer ser­vice at Craigslist — re­ally in­tense, com­mit­ted cus­tomer ser­vice — helped me un­der­stand that, yeah, I needed to lis­ten to peo­ple bet­ter,” he said. I needed to treat them like I wanted to be treated.”

He ad­mit­ted that he still does­n’t care for small talk, com­par­ing him­self to Jackson Lamb, a fic­tional MI5 in­tel­li­gence of­fi­cer in the Slow Horses nov­els and TV se­ries known for his dis­taste of sur­face-level con­ver­sa­tion.

And he’s tak­ing his mes­sage of giv­ing back on the road. In May, he par­tic­i­pated in award-win­ning jour­nal­ist Tina Brown’s Truth Tellers Summit, an event that pushes back on the lies and mis­in­for­ma­tion that threaten pub­lic trust. He of­ten makes ap­pear­ances as a con­fer­ence speaker and guest on pod­casts.

All I know is to move for­ward,” Newmark said. I mean, I am an old guy. Limited time. I have to fig­ure out how to best use my re­sources, mean­ing time left plus money.”

CS 6120: The Self-Guided Course

www.cs.cornell.edu

CS 6120: Advanced Compilers: The Self-Guided Online Course

CS 6120 is a PhD-level Cornell CS course by Adrian Sampson on pro­gram­ming lan­guage im­ple­men­ta­tion. It cov­ers uni­ver­sal com­pil­ers top­ics like in­ter­me­di­ate rep­re­sen­ta­tions, data flow, and classic” op­ti­miza­tions as well as more re­search-fla­vored top­ics such as par­al­leliza­tion, just-in-time com­pi­la­tion, and garbage col­lec­tion. The work con­sists of read­ing pa­pers and open-source hack­ing tasks, which use LLVM and an ed­u­ca­tional IR in­vented just for this class.

This page lists the cur­ricu­lum for fol­low­ing this course at the uni­ver­sity of your imag­i­na­tion, for four imag­i­na­tion cred­its (ungraded). There’s a lin­ear time­line of lessons in­ter­spersed with pa­pers to read. Each les­son has videos and writ­ten notes, and some have im­ple­men­ta­tion tasks for you to com­plete. Tasks are all open-ended, to one de­gree or an­other, and are meant to so­lid­ify your un­der­stand­ing of the ab­stract con­cepts by turn­ing them into real code. The or­der rep­re­sents a sug­gested in­ter­leav­ing of video-watch­ing and pa­per-read­ing.

Some dif­fer­ences with the real” CS 6120 are that you can ig­nore the task dead­lines and you can’t par­tic­i­pate in our dis­cus­sion threads on Zulip. Real 6120 also has an end-of-se­mes­ter course pro­ject—in the self-guided ver­sion, your end-of-se­mes­ter as­sign­ment is to change the world through the magic of com­pil­ers.

The in­struc­tor is a video pro­duc­tion neo­phyte, so please ex­cuse the pro­duc­tion val­ues, es­pe­cially in the early lessons. CS 6120 is open source and on GitHub, so please file bugs if you find prob­lems.

When you fin­ish the course, please fill out this feed­back form.

Lesson 1: Welcome & Overview

video

Producing Wrong Data Without Doing Anything Obviously Wrong!

Todd Mytkowicz, Amer Diwan, Matthias Hauswirth, and Peter F. Sweeney. ASPLOS 2009.

SIGPLAN Empirical Evaluation Guidelines

Lesson 2: Representing Programs

rep­re­sent­ing pro­grams

get­ting started with Bril

Lesson 3: Local Analysis & Optimization

sim­ple dead code elim­i­na­tion

lo­cal value num­ber­ing

Lesson 4: Data Flow

data flow

im­ple­men­ta­tion task

Lesson 5: Global Analysis

global analy­sis & op­ti­miza­tion

Efficient Path Profiling

Thomas Ball and James R. Larus. MICRO 1996.

Lesson 6: Static Single Assignment

sta­tic sin­gle as­sign­ment

Provably Correct Peephole Optimizations with Alive

Nuno P. Lopes, David Menendez, Santosh Nagarakatte, and John Regehr. PLDI 2015.

Lesson 7: LLVM

in­tro­duc­tion to LLVM

writ­ing an LLVM pass

Lesson 8: Loop Optimization

video

Lesson 9: Interprocedural Analysis

video

Type-Based Alias Analysis

Amer Diwan, Kathryn S. McKinley, and J. Eliot B. Moss.

Lesson 10: Alias Analysis

video

A Unified Theory of Garbage Collection

David F. Bacon, Perry Cheng, and V. T. Rajan. OOPSLA 2004.

Fast Conservative Garbage Collection

Rifat Shahriyar, Stephen M. Blackburn, and Kathryn S. McKinley. OOPSLA 2014.

Lesson 11: Memory Management

video

An Efficient Implementation of SELF, a Dynamically-Typed Object-Oriented Language Based on Prototypes

C. Chambers, D. Ungar, and E. Lee. OOPSLA 1989.

Trace-Based Just-in-Time Type Specialization for Dynamic Languages

Andreas Gal, Brendan Eich, Mike Shaver, David Anderson, David Mandelin, Mohammad R. Haghighat, Blake Kaplan, Graydon Hoare, Boris Zbarsky, Jason Orendorff, Jesse Ruderman, Edwin W. Smith, Rick Reitmaier, Michael Bebenita, Mason Chang, and Michael Franz. PLDI 2009.

Lesson 12: Dynamic Compilers

Dynamic Compilers

Tracing via Speculation

Superoptimizer: A Look at the Smallest Program

Alexia Massalin. ASPLOS 1987.

Chlorophyll: Synthesis-Aided Compiler for Low-Power Spatial Architectures

Phitchaya Mangpo Phothilimthana, Tikhon Jelvis, Rohin Shah, Nishant Totla, Sarah Chasins, and Rastislav Bodik. PLDI 2014.

Lesson 13: Concurrency & Parallelism

video

Threads Cannot Be Implemented as a Library

Hans-J. Boehm. PLDI 2005.

Exploiting Superword Level Parallelism with Multimedia Instruction Sets

Samuel Larsen and Saman Amarasinghe. PLDI 2000.

A Type and Effect System for Deterministic Parallel Java

Robert L. Bocchino, Vikram S. Adve, Danny Dig, Sarita V. Adve, Stephen Heumann, Rakesh Komuravelli, Jeffrey Overbey, Patrick Simmons, Hyojin Sung, and Mohsen Vakilian. OOPSLA 2009.

Formal Verification of a Realistic Compiler

Xavier Leroy. CACM in 2009.

Lesson 14: Fast Compilers

I told them forced consent was unlawful. Five years later it cost Elkjop €1.8 million

www.thatprivacyguy.com

Back in the sum­mer of 2021 I was a mem­ber of the Elgiganten Kundklubb, the cus­tomer club the Elkjop group runs across the Nordics, and like a lot of mem­bers I was buried un­der mar­ket­ing emails. So I did the ob­vi­ous thing and went look­ing for a way to switch them off. What I found in­stead was the prob­lem that has taken five years to put right - the only way to stop the mar­ket­ing was to can­cel my mem­ber­ship of the club al­to­gether.

I wrote to their Data Protection Officer on 30th July and set out, in plain terms, why that arrange­ment breaks the law. Under Article 21(2) of the GDPR every per­son has an ab­solute right to ob­ject to di­rect mar­ket­ing. Under the ePri­vacy Directive, mar­ket­ing by email is only law­ful where I have given my con­sent, or where there is an ex­ist­ing cus­tomer re­la­tion­ship and I am of­fered a sim­ple way to opt out both at the point my de­tails are col­lected and in every mes­sage af­ter that. And con­sent, to be worth any­thing at all, has to be freely given - which un­der Article 4(11) and Article 7 means it can­not be bun­dled into, or made a con­di­tion of, some­thing else. Forcing me to sur­ren­der my mem­ber­ship and the ben­e­fits that come with it, just to ex­er­cise a right I al­ready hold, is the text­book ex­am­ple of con­sent that is not freely given.

They put the vi­o­la­tion in writ­ing

The re­ply I re­ceived a few days later did me the favour of putting the vi­o­la­tion on the record. Their po­si­tion, in their own words, was that in or­der to re­ceive mar­ket­ing / of­fers, it is a con­di­tion to be a mem­ber of the cus­tomer club.” That one sen­tence is the whole case. They had taken a right I am en­ti­tled to ex­er­cise for free and turned it into the price of ad­mis­sion.

So I es­ca­lated. I served a for­mal re­stric­tion of pro­cess­ing un­der Article 18, I sent a full sub­ject ac­cess re­quest un­der Article 15 - the le­gal ba­sis they were re­ly­ing on, the le­git­i­mate in­ter­est bal­anc­ing test, the re­cip­i­ents, the sub-proces­sors, the in­ter­na­tional trans­fers, the pro­fil­ing, all of it - and I filed a com­plaint with the Swedish su­per­vi­sory au­thor­ity, Integritetsskyddsmyndigheten (IMY), which is­sued the ref­er­ence DI-2021 – 6660. The com­pa­ny’s an­swer to all of this was to point me at a vague pri­vacy pol­icy, and then, when that did not wash, to stretch the dead­line on my ac­cess re­quest out to ninety days while cit­ing complexity” and limited in­ter­nal re­sources”.

How a Swedish com­plaint be­came a Norwegian fine

This is where the ma­chin­ery of the GDPR comes in. The cus­tomer club is run by the Norwegian par­ent, Elkjop Nordic AS, and on the facts it is the par­ent that holds the real de­ci­sion mak­ing power over the pur­poses and the means of the pro­cess­ing. So in September 2022 IMY de­cided it was not the right au­thor­ity to deal with this at all. Under the one-stop-shop in Article 56(1), the com­pe­tent reg­u­la­tor is the one for the con­troller’s main es­tab­lish­ment, and that es­tab­lish­ment sits in Norway. IMY handed the in­ves­ti­ga­tion and my com­plaint to Datatilsynet, the Norwegian DPA, which ac­cepted the case. And then, as these things tend to, it went quiet for a very long time.

On 1 June 2026 it stopped be­ing quiet. Datatilsynet fined the Elkjop group NOK 20 mil­lion, a lit­tle over €1.8 mil­lion, and it found pre­cisely what I had told them in 2021. The con­sent the com­pany was re­ly­ing on for its cus­tomer club was not valid - it was forced, it was not spe­cific, and mem­bers were not prop­erly in­formed. On top of that, the com­pany had taken the per­sonal data it gath­ered through the club and put it to fur­ther use for ad­ver­tis­ing and con­ver­sion track­ing, with­out ever car­ry­ing out the com­pat­i­bil­ity as­sess­ment that Article 6(4) de­mands be­fore you re­pur­pose peo­ple’s data like that. The de­ci­sion runs through Articles 4(11), 5(1)(a), 5(2), 6(1)(a), 6(1)(f) and 6(4) - the law­ful­ness, the fair­ness, the trans­parency and the ac­count­abil­ity of the en­tire arrange­ment.

I want to be clear about why this mat­ters well be­yond one re­tailer and one fine. Forced con­sent, pay-or-con­sent, bun­dled con­sent, the whole agree to every­thing or you can­not use the ser­vice” model - it is every­where, and it is the de­fault way an enor­mous part of the dig­i­tal econ­omy op­er­ates. It is also un­law­ful, for the same sim­ple rea­son every sin­gle time - if you can­not say no with­out los­ing some­thing you are en­ti­tled to keep, you have not freely con­sented to any­thing. Five years and a seven fig­ure fine later, that point is now sit­ting in a pub­lished de­ci­sion for any­one to read.

I had to read about it on a wiki

And yet there is a part of this story I am not will­ing to let slide, be­cause it is its own small scan­dal.

I did not find out about this de­ci­sion from IMY. I did not find out from Datatilsynet. I found out from GDPRhub, a vol­un­teer-run wiki, on a ran­dom Thursday morn­ing, nearly five years af­ter I filed my com­plaint and well af­ter the de­ci­sion had al­ready been made.

Under Article 77(2) of the GDPR a su­per­vi­sory au­thor­ity is un­der a bind­ing le­gal oblig­a­tion to keep a com­plainant in­formed of the progress and the out­come of their com­plaint. It is not a cour­tesy and it is not dis­cre­tionary - it is writ­ten into the law. I filed my com­plaint with IMY, IMY passed it on, the case ended in a multi-mil­lion euro en­force­ment ac­tion, and not one of the au­thor­i­ties in­volved thought to tell the per­son who started it.

So this morn­ing I wrote to IMY and asked them, in writ­ing, to ex­plain them­selves. I have given them five work­ing days. If the an­swer is what I sus­pect it will be, I will be fil­ing un­der the European Union’s in­fringe­ment pro­ce­dure, be­cause a su­per­vi­sory au­thor­ity that can­not meet its most ba­sic oblig­a­tion to the peo­ple it ex­ists to pro­tect is ex­actly the sort of thing the Commission is sup­posed to look at. I have walked the Commission down this road be­fore, over Phorm and the United Kingdom’s fail­ure to prop­erly im­ple­ment the EU rules on the con­fi­den­tial­ity of com­mu­ni­ca­tions, and I am en­tirely will­ing to do it again.

I have been say­ing for years that pri­vacy is per­sonal, and I mean it in the most lit­eral way I can. This was my club mem­ber­ship, my in­box, my data and my com­plaint. The law was on my side in 2021 and it is on my side now. The com­pany that told me to leave or put up with it has paid for that choice.

The only things still out­stand­ing are an ex­pla­na­tion from the Regulator that was meant to have my back the whole way through and civil lit­i­ga­tion against Elkjop group now that the reg­u­la­tory process has run its course - a lit­i­ga­tion that is go­ing to be so much more ex­ten­sive now we have fur­ther de­tails of fur­ther il­le­gal pro­cess­ing of that per­sonal data.

If they had lis­tened to me in 2021, they would have avoided the fine, they would have made their pro­cess­ing law­ful, they would have avoided the brand dam­age and the re­sult­ing lit­i­ga­tion.

When I write to you as DPO with a com­plaint, it would be wise for you to take note. I am not a layper­son, I am an ex­pert on this law that I helped to cre­ate and I do not stop just be­cause these ac­tions are in­con­ve­nient, it is my life’s work. Pay at­ten­tion, when I write to you I am giv­ing you free ad­vice and you should treat as such in­stead of get­ting de­fen­sive and re­fus­ing to change.

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.