10 interesting stories served every morning and every evening.

openai.com

Debian votes to allow 'responsible use of generative AI'

lwn.net

Debian nei­ther en­dorses nor pro­hibits the use of gen­er­a­tive AI tools in the de­vel­op­ment, main­te­nance, or doc­u­men­ta­tion of soft­ware, pack­ag­ing, doc­u­men­ta­tion, and other me­dia pub­lished within the Debian Project. We rec­og­nize that such tools can sub­stan­tially im­prove the pro­duc­tiv­ity of con­trib­u­tors when used re­spon­si­bly, al­low­ing vol­un­teers to spend more of their lim­ited time on work that re­quires tech­ni­cal ex­per­tise, judg­ment, re­view, and col­lab­o­ra­tion.

The Debian Project nev­er­the­less ex­pects that all con­tri­bu­tions sub­mit­ted to Debian, re­gard­less of how and with which tools they were pro­duced, sat­isfy the same stan­dards of qual­ity, cor­rect­ness, main­tain­abil­ity, and le­gal com­pli­ance. The use of a gen­er­a­tive AI tool does not di­min­ish the con­trib­u­tor’s re­spon­si­bil­ity for the work they sub­mit. Contributors are ex­pected to un­der­stand, re­view, test, and, where ap­pro­pri­ate, mod­ify AI-assisted out­put be­fore in­cor­po­rat­ing it into Debian.

The Debian Project nev­er­the­less ex­pects that all con­tri­bu­tions sub­mit­ted to Debian, re­gard­less of how and with which tools they were pro­duced, sat­isfy the same stan­dards of qual­ity, cor­rect­ness, main­tain­abil­ity, and le­gal com­pli­ance. The use of a gen­er­a­tive AI tool does not di­min­ish the con­trib­u­tor’s re­spon­si­bil­ity for the work they sub­mit. Contributors are ex­pected to un­der­stand, re­view, test, and, where ap­pro­pri­ate, mod­ify AI-assisted out­put be­fore in­cor­po­rat­ing it into Debian.

GitHub - Lakr233/vphone-cli

github.com

Boot a vir­tual iPhone via Apple’s Virtualization.framework us­ing PCC re­search VM in­fra­struc­ture.

Prerequisites

Host:

Apple Silicon

ma­cOS 15+ (Sequoia)

Xcode + iOS SDK (cross-compiles the guest dae­mon)

SIP/AMFI re­lax­ation to al­low pri­vate PV=3 en­ti­tle­ments with un­signed-bi­nary

Dependencies:

brew in­stall python@3.13 aria2 wget gnu-tar openssl@3 ldid-procur­sus ssh­pass key­stone cmake libusb ipsw zstd

Install

brew in­stall zqxwce/​tap/​vphone-cli

Build

git clone –recurse-submodules https://​github.com/​Lakr233/​vphone-cli.git

./scripts/setup_tools.sh # in­stall deps, build tool­chain sub­mod­ules, cre­ate the Python venv ./scripts/build.sh # build + sign vphone-cli, bun­dle the .app, cross-com­pile vphoned

cd .build/vphone-cli.app/​Con­tents/​Ma­cOS/ vphone-cli –help

Quick Start

One com­mand cre­ates a VM end-to-end (download → patch → DFU re­store → CFW in­stall → first boot):

vphone-cli vm cre­ate my­phone -V jb # -V / –variant

vphone-cli vm launch my­phone

Commands

vphone-cli vm cre­ate runs the whole pipeline; the in­di­vid­ual steps be­low let you drive it man­u­ally or re-run one stage.

Manage

vphone-cli vm list # list VMs (–json for script­ing) vphone-cli vm info my­phone # show one VM vphone-cli vm new my­phone # cre­ate an empty bun­dle (cpu/mem/disk op­tions) vphone-cli vm con­fig my­phone –cpu 8 –memory 8192 vphone-cli vm clone my­phone my­phone-2 # fast APFS clone, fresh de­vice iden­tity vphone-cli vm ex­port my­phone –out my­phone.tzst # zstd fast by de­fault (–max = xz -9); –out may be a dir (auto-names <vm>.tzst/.txz); skips re­store dir + stag­ing files vphone-cli vm im­port my­phone.tzst –name re­stored vphone-cli vm re­name my­phone iphone16 vphone-cli vm delete iphone16

Build a VM man­u­ally (what vm cre­ate au­to­mates)

vphone-cli vm new my­phone # 1. empty bun­dle vphone-cli fw pre­pare my­phone –iphone-version 26.1 # 2. down­load + merge IPSWs vphone-cli fw patch my­phone –variant jb # 3. patch the boot chain

vphone-cli vm launch my­phone –dfu & # 4. boot into DFU (background) vphone-cli re­store my­phone –get-shsh # fetch SHSH vphone-cli re­store my­phone # DFU re­store vphone-cli vm stop my­phone # stop the DFU boot

vphone-cli cfw in­stall my­phone –variant jb # 5. in­stall CFW (host-mount; asks for sudo) vphone-cli vm launch my­phone # 6. first boot

Update to a newer iOS by point­ing fw pre­pare at an IPSW: –iphone-source /path/to.ipsw –cloudos-source /path/to.ipsw.

Firmware Variants

Five patch vari­ants with in­creas­ing se­cu­rity by­pass — pass one to –variant:

See re­search/​0_bi­na­ry_­patch_­com­par­i­son.md for the per-com­po­nent break­down.

Running & Connecting

SSH (jailbreak): ssh -p 22222 mo­bile@<vm-ip> (password alpine)

SSH (regular/dev): ssh -p 22222 root@<vm-ip>

VNC: vnc://&​lt;vm-ip>:5901

Locations

Everything vphone-cli cre­ates lives un­der ~/.vphone/ — kept out­side the repo and the .app so the signed bun­dle stays portable. Redirect the whole tree with $VPHONE_ROOT:

Precedence: the per-item over­rides ($VPHONE_LIBRARY_ROOT, $VPHONE_VENV_DIR) win over $VPHONE_ROOT, which wins over the ~/.vphone de­fault. The ip­sws/, tools/, and debs/ caches al­ways sit di­rectly un­der whichever root is ac­tive.

SIP/AMFI Relaxation

Option A — fully dis­able SIP, then dis­able AMFI via boot-arg (most per­mis­sive).

In Recovery (long-press power → Terminal):

csru­til dis­able csru­til al­low-re­search-guests en­able

Then re­boot into ma­cOS and set the AMFI boot-arg (needs SIP fully off to take ef­fect):

sudo nvram boot-args=“am­fi_get_out­_of_my_way=1 -v” # re­boot af­ter

Option B — keep SIP on (debug-only re­laxed), then al­lowlist the bi­nary with am­fi­dont (leaves AMFI en­abled sys­tem-wide).

In Recovery:

csru­til en­able –without de­bug csru­til al­low-re­search-guests en­able

Then re­boot into ma­cOS and:

vphone-am­fi­dont # .build/vphone-cli.app/​Con­tents/​Re­sources/​vphone-am­fi­dont for lo­cal builds

Tested Environments

FAQ

zsh: killed ./vphone-cli — AMFI/debug re­stric­tions aren’t by­passed; see Prerequisites (amfi_get_out_of_my_way=1 or am­fi­dont).

Virtualization is not avail­able on this hard­ware — your Mac is it­self a VM; PV=3 guest boot can’t nest. Use a non-nested ma­cOS 15+ host.

Stuck on Press home to con­tinue” — con­nect via VNC and right-click (two-finger click) to sim­u­late the home but­ton.

System apps won’t in­stall — dur­ing iOS setup, don’t pick Japan or the EU as your re­gion (extra reg­u­la­tory checks the VM can’t sat­isfy); pick e.g. United States.

App crashes on launch with EXC_GUARD / GUARD_TYPE_MACH_PORT — re-patch with vphone-cli fw patch <name> –variant <v> –force-exc-guard, then re-re­store/​in­stall (#291). Always on for iOS 18 bases.

Install a .ipa/.tipa — use the run­ning VMs Install menu (drag-drop or file picker).

cfw in­stall hangs re-sign­ing a sys­tem bi­nary (e.g. Campo), mem­ory climb­ing un­bounded — known bug in ldid-procur­sus up to 2.1.5-procursus7 (the cur­rent Homebrew sta­ble): bytes(uin­t64_t) calls __builtin_clzll(0) with no zero-guard, which is un­de­fined be­hav­ior, and on this build re­solves to a 0-length that un­der­flows an un­signed loop counter — ldid spins writ­ing one byte at a time into a grow­ing buffer in­stead of ter­mi­nat­ing. Triggered by any en­ti­tle­ments plist con­tain­ing an in­te­ger value of ex­actly 0 (some real Apple sys­tem bi­na­ries have these). Fixed up­stream but not yet in a tagged re­lease; re­build from source: brew in­stall –HEAD ldid-procur­sus && brew link –overwrite ldid-procur­sus. Kill the hung ldid process first (sudo kill -9 <pid>) if you al­ready hit it.

Automation

vphone-cli ex­poses a host con­trol socket (<bundle>/vphone.sock) for pro­gram­matic con­trol — screen­shots, touch, swipes, hard­ware keys, clip­board — each ac­tion re­turn­ing an in­line screen­shot for AI-driven E2E test­ing. See vphone-mcp for an MCP server wrap­ping it.

Acknowledgements

wh1te4ever/​su­per-tart-vphone-writeup

The Internet Is Kind of a Predatory Cesspit Now

www.stephendiehl.com

I’m a kid of the 90s, and I still re­mem­ber the early in­ter­net. It was slow, ugly, un­re­li­able, and full of cranks, a strange world of wheez­ing dial-up modems, Usenet flame­wars, <marquee> tags, and danc­ing ba­bies. It was also stub­bornly alive and hu­man. People built web­sites about Babylon 5, model rock­ets, train timeta­bles, share­ware, and what­ever else had colonised their minds. Most of it had no busi­ness model. That was the lit­eral point. The web felt like a pub­lic square as­sem­bled by ob­ses­sive am­a­teurs.

None of this was en­tirely in­no­cent. There were scams, viruses, Nazis, pornog­ra­phy, and chain emails from de­posed Nigerian princes. But then pre­da­tion moved from the pe­riph­ery to the cen­tre. It used to be an abuse of the net­work. Now it is the net­work’s or­gan­is­ing prin­ci­ple. The scam­mer once had to find a vic­tim. The plat­form now finds one, pro­files the weak­ness, op­ti­mises the pitch, processes the pay­ment, and rec­om­mends the next scam. What was once an aber­ra­tion has be­come the norm.

The mod­ern in­ter­net is now a highly op­ti­mised ma­chine for de­tect­ing hu­man vul­ner­a­bil­ity, am­pli­fy­ing it, and plac­ing a pay­ment link be­side it. Any in­se­cu­rity can be­come a com­mer­cial niche, in­clud­ing the de­sire to es­cape com­mer­cial life it­self. There is al­ways a course, a newslet­ter, a pri­vate com­mu­nity, or a re­fer­ral code wait­ing at the end of the fun­nel.

The bleak part is not that grifters ex­ist. Every so­ci­ety has huck­sters. It is that much of the pop­u­la­tion has been con­scripted into the down­line. Ordinary peo­ple now spend their lives pro­mot­ing in­vest­ments they barely un­der­stand, prod­ucts that do not work, and po­lit­i­cal claims they have never ex­am­ined. Many earn noth­ing. They are un­paid dis­trib­u­tors for some­one far­ther up the pyra­mid. The con­sumer, sales­man, and prod­uct have col­lapsed into the same ex­hausted per­son.

People in­creas­ingly be­have like ad­dicts be­cause ad­dic­tion is the busi­ness model. The feed sup­plies al­ter­nat­ing doses of out­rage, fear, envy, lust, and hope. Each feel­ing ar­rives with some­thing to buy. People doom­scroll un­til they ac­quire the anx­i­ety that the next in­flu­encer will mon­e­tise. Then they pur­chase a bet, a coin, a sup­ple­ment, a course, or an en­emy. Finally, they re­post the pitch. Consumption be­comes dis­tri­b­u­tion. The mark be­comes the sales­man.

This is an in­dus­trial sys­tem for man­u­fac­tur­ing weak­ness at scale. A le­git­i­mate busi­ness can sur­vive a sat­is­fied cus­tomer. A grift can­not. It needs the cus­tomer fright­ened, ag­grieved, lonely, sick, or greedy for­ever.

When I started writ­ing about cryp­tocur­rency in 2020, I still car­ried a naive as­sump­tion about the size of this econ­omy. I thought peo­ple were gen­er­ally de­cent and the grifter class was a small pool of de­gen­er­ates with rot­ten moral char­ac­ter, prey­ing on those made vul­ner­a­ble by the ma­te­r­ial con­di­tions of our time.

I was very wrong. The grift econ­omy is mas­sive. More dis­turb­ing still, it is par­tic­i­pa­tory. A large and grow­ing share of the pop­u­la­tion now ap­pears will­ing to de­vote every wak­ing hour to fleec­ing their fel­low man as a ca­reer choice. They stream, post, re­cruit, pro­mote, re­fer, as­tro­turf, and close. They turn every friend­ship into a lead and every con­ver­sa­tion into a qual­i­fy­ing call. They do not clock out be­cause the mar­ket fol­lows them into bed. The smart­phone is a shop counter that sleeps be­side their head.

Obviously most of these peo­ple are not suc­ceed­ing. The maths sim­ply can never work out. That is part of the trick. The as­pir­ing in­flu­encer with forty-seven fol­low­ers is not an en­tre­pre­neur in any mean­ing­ful sense. He is free labour for the plat­form and cheap dis­tri­b­u­tion for the per­son sell­ing him the dream. The af­fil­i­ate mar­keter buys a course about af­fil­i­ate mar­ket­ing, then re­cov­ers the cost by sell­ing the same course to the next af­fil­i­ate mar­keter. The life coach coaches new life coaches. The drop­ship­per sells tu­to­ri­als to failed drop­ship­pers. The pyra­mid is so­cial be­fore it is fi­nan­cial. Everyone stands on some­one else while in­sist­ing they are about to es­cape.

This arrange­ment blurs the use­ful moral dis­tinc­tion be­tween preda­tor and prey. Many on­line grifters are them­selves marks. They be­lieve the rub­bish they sell be­cause be­lief makes the sell­ing bear­able. They have sunk money, time, iden­tity, and pub­lic dig­nity into the scheme. Admitting the prod­uct is worth­less would mean ad­mit­ting that years of their life were worth­less too. It is psy­cho­log­i­cally cheaper to re­cruit an­other vic­tim. The fraud sus­tains the faith, and the faith sus­tains the fraud.

A nor­mal trade ends when a need is sa­ti­ated. You need a chair. Someone sells you a chair. You sit down and stop think­ing about chairs. However, an on­line grift can never sa­ti­ate. It must pre­serve the need that feeds it. The griev­ance mer­chant can­not re­solve your griev­ance. The well­ness in­flu­encer can­not let you feel well. The trad­ing guru can­not let you be­come fi­nan­cially se­cure. The manos­phere pod­caster can­not let young men be­come calm, loved, and so­cially com­pe­tent. Satisfaction is churn. Misery is re­cur­ring rev­enue.

The plat­forms did not in­vent fear, greed, lone­li­ness, or sta­tus anx­i­ety. They in­dus­tri­alised their ex­trac­tion. Their rec­om­men­da­tion sys­tems are vast re­in­force­ment-learn­ing loops that con­tin­u­ously ex­per­i­ment on hu­man weak­ness. Each ob­jec­tive is a mov­ing com­pos­ite of high-di­men­sional sig­nals for at­ten­tion, re­ten­tion, and con­ver­sion, dis­persed across mod­els, met­rics, tests, and feed­back sys­tems. The sub­ject can­not see the ex­per­i­ment. The op­er­a­tor can­not fully ex­plain it. The reg­u­la­tor can barely com­pre­hend it. The loop knows only that one stim­u­lus keeps a per­son scrolling while an­other lets them leave. Calm ac­cu­racy loses. Threat, trans­gres­sion, hu­mil­i­a­tion, and im­pos­si­ble promises win. The re­sult­ing so­cial dam­age ap­pears nowhere in the ob­jec­tive func­tion. It ar­rives as an ex­ter­nal­ity.

This cre­ates a bru­tal se­lec­tion en­vi­ron­ment. The hon­est fi­nan­cial ad­viser ex­plains di­ver­si­fi­ca­tion and gets twelve views. The crypto lu­natic pre­dicts a thou­sand­fold re­turn and gets twelve mil­lion. The physi­cian says a chronic con­di­tion re­quires care­ful man­age­ment. The well­ness crank says seed oils are poi­son­ing your soul. The his­to­rian de­scribes an am­bigu­ous event with con­tin­gent causes. The po­lit­i­cal in­flu­encer iden­ti­fies a se­cret ca­bal and gives you the ad­dress of a pizza par­lour. One of these peo­ple has the bet­ter busi­ness model. It is not the one bur­dened by re­al­ity.

The sys­tem is dopamin­er­gic in the most ba­nal and me­chan­i­cal sense. It runs on an­tic­i­pa­tion, un­cer­tainty, and vari­able re­ward. The next re­fresh might bring ap­proval, out­rage, profit, or vin­di­ca­tion. Usually it brings noth­ing, which makes the next re­fresh more ur­gent. Social me­dia fused the Skinner box with the com­mis­sion struc­ture. The ad­dict is handed a re­fer­ral code and told he is now a small busi­ness owner.

Crypto has be­come the sub­ject of my ver­bal ire so of­ten be­cause it is the apoth­e­o­sis of the grift econ­omy. It takes alien­ation, pre­car­ity, gam­bling ad­dic­tion, tech­no­log­i­cal mys­ti­fi­ca­tion, and a thick slurry of lib­er­tar­ian derp, then syn­the­sises them into the ul­ti­mate preda­tory in­vest­ment prod­uct.

Crypto also per­fected the re­cur­sive struc­ture of the mod­ern on­line grift. Promotion cre­ates price move­ment. Price move­ment is pre­sented as proof of adop­tion. That proof re­cruits new buy­ers. Their money cre­ates more price move­ment. Every par­tic­i­pant has a di­rect fi­nan­cial in­cen­tive to be­come a pub­li­cist for his own po­si­tion. The as­set comes with its own vol­un­teer pro­pa­ganda net­work. It is a pyra­mid scheme with a pod­cast de­part­ment.

Much to my dis­may, the rest of the in­ter­net has learned the same les­son. The cheap­est prod­uct is empty promises un­teth­ered to re­al­ity. The most scal­able labour force is the ad­dict. The best mar­ket­ing con­ceals it­self in­side iden­tity. Sell peo­ple a world­view, and they will ad­ver­tise it for free be­cause crit­i­cism of the prod­uct now feels like crit­i­cism of the self.

Language mod­els will make this cheaper and worse. The cost of pro­duc­ing plau­si­ble lies has been dri­ven to pre­cisely zero. One per­son can gen­er­ate a land­fill of ar­ti­cles, videos, tes­ti­mo­ni­als, in­vest­ment analy­sis, and syn­thetic ex­perts be­fore break­fast. The grift no longer needs con­vic­tion, charisma, or even a pulse. It needs a lan­guage model, an af­fil­i­ate ac­count, and ac­cess to a pop­u­la­tion whose crit­i­cal fac­ul­ties have been sand­blasted by twenty years of al­go­rith­mic me­dia.

There is a temp­ta­tion to re­gard the peo­ple caught in this ma­chine with sim­ple con­tempt. Some de­serve it. A per­son who know­ingly ru­ins strangers for com­mis­sion has made a moral choice. But con­tempt is not an analy­sis. Precarity sup­plies the re­cruits. Alienation sup­plies the au­di­ence. The col­lapse of sta­ble work, af­ford­able hous­ing, lo­cal in­sti­tu­tions, and plau­si­ble routes to ma­te­r­ial se­cu­rity is what makes the pitch of the grift econ­omy so se­duc­tive. The grift of­fers agency where or­di­nary life of­fers de­lay. It of­fers com­mu­nity where so­ci­ety of­fers iso­la­tion. It of­fers a jack­pot where work of­fers a per­for­mance re­view and an­other year of rent in­creases.

Then it metabolises those in­juries into new in­juries. The lonely man buys a doc­trine that makes him in­tol­er­a­ble to women. The in­debted worker gam­bles his re­main­ing sav­ings on a crypto to­ken. The fright­ened pa­tient aban­dons med­i­cine for sup­ple­ments. The po­lit­i­cally pow­er­less per­son spends four­teen hours a day scream­ing at strangers while the peo­ple with power qui­etly cut his wages and pub­lic ser­vices. The promised es­cape re­pro­duces the con­di­tion that made es­cape de­sir­able.

It is a des­per­ately sad way to live. There is no craft in it, no sol­i­dar­ity, and no com­ple­tion. No com­pas­sion or joy. Every re­la­tion­ship be­comes an au­di­ence. Every in­ter­est just be­comes grist for the con­tent mill. Every con­vic­tion be­comes a con­tent strat­egy. The grifter can never rest be­cause ab­sence kills en­gage­ment. The mark can never rest be­cause the next post might con­tain the se­cret. Both wake to the same no­ti­fi­ca­tions, trapped on a dopamine tread­mill dri­ven by opaque al­go­rithms that can never slow down.

The worst ad­vice from the 90s, just say no,” starts to look less stu­pid when our great­est tech­ni­cal in­no­va­tion learns to turn dis­tress into in­ven­tory. Disconnection is not Luddism in that en­vi­ron­ment. It is the re­fusal to mis­take a preda­tory sys­tem for a so­cial world.

Complete dis­con­nec­tion is nearly im­pos­si­ble. Modern life no longer per­mits it. But an ap­pli­ance is used for a bounded pur­pose and then put away. Emails, train times, ar­ti­cles, and files all have end­points. Infinite feeds of dri­vel do not. They carry the casino into bed and let an opaque RL loop se­lect the emo­tions that ar­rive be­fore break­fast.

The in­ter­net is in­dis­putably an in­hu­man place. Not be­cause it con­tains no hu­mans. Billions of us are in here, scream­ing fran­ti­cally at each other while feel­ing ut­terly alone. It is in­hu­man be­cause the sys­tems gov­ern­ing it are ut­terly alien al­go­rithms that can­not recog­nise hu­man ends. They recog­nise en­gage­ment, con­ver­sion, re­ten­tion, and growth. Grief is a mar­ket seg­ment. Loneliness is a tar­get­ing sig­nal. Friendship is a re­ten­tion mech­a­nism. Political con­vic­tion is ad in­ven­tory. Nothing can sim­ply mat­ter. It must per­form.

Life in­side this en­vi­ron­ment means adopt­ing its cat­e­gories. Thoughts are as­sessed by their reach, ex­pe­ri­ences by their share­abil­ity, and peo­ple by their use­ful­ness to an iden­tity. A per­son be­comes leg­i­ble to the ma­chine by be­com­ing less leg­i­ble to him­self. Eventually the sys­tem no longer needs to im­pose its val­ues. Its sub­jects carry them in their pock­ets and en­force them on their own minds.

The phys­i­cal world is not pure. It con­tains sales­men, casi­nos, dem­a­gogues, fa­nat­ics, and bores. It also con­tains stub­born lim­its. A con­ver­sa­tion ends. A pub closes. A book runs out of pages. Your friend gets tired of hear­ing you talk and tells you to shut up. Reality sup­plies fric­tion, and fric­tion is one of the few re­main­ing de­fences against ap­petite with­out limit.

We are not go­ing back to the early in­ter­net. Nor should we ro­man­ti­cise it. The old web had plenty of sewage. What it also had was space be­yond the mar­ket. A per­son could make some­thing with­out be­com­ing a brand. A con­ver­sa­tion could end with­out a con­ver­sion. A com­mu­nity could ex­ist with­out turn­ing its mem­bers into marks for an in­vest­ment scheme.

The ques­tion is not whether the in­ter­net con­tains use­ful things. It does. The ques­tion is whether hu­man ex­is­tence should be or­gan­ised around alien and in­hu­man ob­jec­tive func­tions no hu­man chose and no­body can in­spect or un­der­stand. An RL loop can op­ti­mise en­gage­ment, re­ten­tion, and con­ver­sion. It can­not tell us what a hu­man life is for. The fi­nal grift is let­ting the loop de­cide what your life should be.

Close race as Iceland votes on whether to restart talks on joining EU

www.bbc.com

21 hours ago

Paul KirbyEurope dig­i­tal ed­i­tor

AFP via Getty Images

Icelanders are vot­ing in a ref­er­en­dum to de­cide whether to re­sume talks on join­ing the European Union, 13 years af­ter they were bro­ken off.

In an in­di­ca­tion of how tight the re­sult is ex­pected to be, the lat­est opin­ion poll put the No cam­paign in the lead with 51.6%. An ear­lier poll had put the Yes cam­paign ahead.

Prime Minister Kristrún Frostadóttir’s cen­tre-left gov­ern­ment had al­ready in­tended to hold a ref­er­en­dum, but tur­bu­lent in­ter­na­tional af­fairs prompted her to bring it for­ward.

But the de­bate was fought less over Nato mem­ber Iceland’s se­cu­rity con­cerns than over its vi­tal fish­ing in­dus­try and sov­er­eignty.

Voting is due to go on from 09:00 to 22:00 GMT on Saturday and the re­sult is ex­pected in the early hours of Sunday.

Iceland has a pop­u­la­tion of un­der 400,000. More than one in five vot­ers had al­ready cast their bal­lots in early vot­ing be­fore Saturday, ac­cord­ing to Iceland’s pub­lic broad­caster RUV.

What is the vote about?

Although Iceland is al­ready part of the EUs sin­gle mar­ket and Schengen bor­der-free zone as part of the European Economic Area, EU mem­ber­ship would bring it into the cus­toms union and even­tu­ally the euro.

Iceland’s ap­pli­ca­tion to join the EU was al­ready well ad­vanced when it put talks on hold in 2013, and European Commission of­fi­cials have in­di­cated that talks could be fi­nalised in one or two years. Of the 35 so-called chap­ters of talks rang­ing from fish­eries and eco­nomic pol­icy to free­dom of speech and free move­ment of goods, 27 had be­gun and 11 of them were pro­vi­sion­ally com­plete.

A Yes vote would not be a fi­nal de­ci­sion on join­ing the EU. It would mean back­ing a move to­wards an ac­ces­sion agree­ment. Any deal would then have to be ap­proved by a sec­ond ref­er­en­dum, as well by par­lia­ment, and the con­sti­tu­tion would have to be amended. The EUs 27 mem­ber states would also have to sign it off.

One Yes-campaign group, Yes to See”, says Icelanders should at least see what deal they can get, so they have all the in­for­ma­tion be­fore a fi­nal de­ci­sion.

Equally, a No vote would not rule out the chance of Iceland re­sum­ing talks in the fu­ture.

What are the key is­sues?

Sovereignty has been a cru­cial is­sue in the pre-ref­er­en­dum de­bate. Iceland fought hard to be­come fully in­de­pen­dent from Denmark in 1944, and its fish­ing and ma­rine in­dus­tries make up al­most 40% of ex­ports.

The No cam­paign fears los­ing con­trol over Iceland’s prized fish­ing grounds un­der the EUs Common Fisheries Policy and has vowed never to share the coun­try’s wa­ters with any­one. Brussels has in­di­cated Iceland could earn some kind of ex­emp­tion, but it is con­sid­ered po­ten­tially the biggest ob­sta­cle to any agree­ment.

Many Icelanders re­mem­ber the so-called Cod Wars with the UK that Iceland won in the 1970s. And fish­eries was al­ways the is­sue that stopped Iceland join­ing the EU be­fore.

However, in the wake of the 2008 fi­nan­cial cri­sis and the col­lapse of Iceland’s bank­ing sys­tem, Reykjavik moved to start ac­ces­sion talks in 2009, only to bring them to a halt in 2013.

Iceland is now one of Europe’s most af­flu­ent na­tions and Eirikur Bergmann, pro­fes­sor of pol­i­tics at Bifröst University, told the BBC that many peo­ple at­tribute this to Iceland’s in­de­pen­dence”.

One Icelandic trade union sur­vey sug­gested this year that the coun­try was the most ex­pen­sive in the world, far pricier than its Nordic neigh­bours.

Although it has the fifth high­est GDP (economic out­put) per capita in the world, in­ter­est rates are stub­bornly high at 8% and in­fla­tion has climbed to 5.6%.

Yes cam­paign­ers ar­gue that the eco­nomic ben­e­fits of the EU would help bring the rates down.

Reuters

What are Iceland’s se­cu­rity con­cerns?

Iceland may be a founder mem­ber of Nato but it has no mil­i­tary and re­lies on its al­lies for de­fence.

A bi­lat­eral US de­fence agree­ment has been in place since 1951 and the No cam­paign has said Iceland’s se­cu­rity rests on both Nato and the US, and that EU mem­ber­ship is not a sub­sti­tute for Nato.

Iceland has been a strong sup­porter of Ukraine dur­ing Russia’s full-scale in­va­sion and of­fi­cials have viewed Russia’s in­creased mar­itime ma­noeu­vres near the is­land with alarm.

However, there has also been con­cern at US President Donald Trump’s ex­pressed in­ter­est in tak­ing over Greenland - es­pe­cially the fact that he has con­fused it with Iceland.

This year the EU and Iceland signed a se­cu­rity and de­fence part­ner­ship, and EU of­fi­cials said the EU offers an an­chor in a com­mu­nity of val­ues, pros­per­ity and se­cu­rity”.

What do the Yes and No cam­paigns say?

Ahead of the ref­er­en­dum, the two sides held a tele­vised de­bate where the Yes cam­paign team was headed by Prime Minister Kristrún Frostadóttir and the No cam­paign was led by Guðrún Hafsteinsdóttir, chair of the op­po­si­tion Independence Party.

Kristrún told the au­di­ence that Iceland was al­ready well in­te­grated in the European Union, and be­com­ing a mem­ber would be one of the biggest risk-re­duc­ing steps we can take”.

She also made clear that a Yes vote did not nec­es­sar­ily mean that Iceland would join, and that if there was a No vote, the re­sult would be re­spected.

Guðrún, mean­while, stressed that the vote was not about whether Iceland should work well with Europe: We al­ready do, and we want that to con­tinue.”

Instead, she por­trayed the ref­er­en­dum as a vote on whether Icelanders wanted to hand decision-making pow­ers” to Brussels on fish­eries, agri­cul­ture and their nat­ural re­sources.

Although geopol­i­tics kick-started the gov­ern­men­t’s de­ci­sion to push for a re­turn to EU talks, there has been lit­tle dis­cus­sion of it dur­ing the cam­paign.

It’s lower on the agenda than many would think,” says Hallgrimur Oddsson, di­rec­tor of EU-Iceland think-tank European Currents.

I accidentally turned LLM memory into program analysis :: pwning.systems

pwning.systems

Over the past few months I have been play­ing around quite a bit with LLM agents, par­tic­u­larly for vul­ner­a­bil­ity re­search.

They are be­com­ing sur­pris­ingly good at nav­i­gat­ing large code­bases, ex­plain­ing un­fa­mil­iar sub­sys­tems and help­ing ex­plore po­ten­tial at­tack sur­faces. However, once an in­ves­ti­ga­tion starts tak­ing a few hours, I kept run­ning into the same prob­lem: the model would slowly lose track of what we had ac­tu­ally es­tab­lished.

It might sug­gest an ap­proach that we had al­ready ruled out, for­get that an as­sump­tion turned out to be false, or con­fi­dently con­tinue rea­son­ing from an ob­ser­va­tion that was no longer valid. Obviously, telling an LLM that some­thing is wrong does not nec­es­sar­ily mean that it will stop be­liev­ing all of the things that de­pended on it :)

I ini­tially started look­ing into mem­ory sys­tems be­cause I wanted to make LLMs more use­ful for com­plex vul­ner­a­bil­ity re­search and re­duce this type of hal­lu­ci­na­tion.

There are of course al­ready plenty of so­lu­tions for giv­ing LLMs mem­ory. Usually this in­volves stor­ing old con­ver­sa­tions or ob­ser­va­tions some­where, em­bed­ding them, and then re­triev­ing the most rel­e­vant pieces when­ever the model needs them again.

This works rea­son­ably well, but there was some­thing about it that both­ered me.

During a vul­ner­a­bil­ity re­search sesh, I don’t just want the model to re­mem­ber what we said.

I want it to main­tain what we cur­rently know.

Imagine that dur­ing an in­ves­ti­ga­tion we es­tab­lish the fol­low­ing:

at­tacker con­trols ob­jec­t_a ob­jec­t_a points to ob­jec­t_b ob­jec­t_b is a ker­nel ob­ject

From this, we may con­clude that the at­tacker can con­trol a ker­nel ob­ject.

A nor­mal mem­ory sys­tem could store all of these ob­ser­va­tions and re­trieve them again when­ever we ask about the ex­ploitabil­ity of the bug. The LLM then fig­ures out the same con­clu­sion.

Great!

However, sup­pose that two hours later we dis­cover in LLDB that ob­jec­t_a does not ac­tu­ally point to ob­jec­t_b, and that our pre­vi­ous ob­ser­va­tion was based on a wrong as­sump­tion.

At that point our mem­ory may con­tain some­thing like:

ob­jec­t_a points to ob­jec­t_b at­tacker can con­trol ob­jec­t_b ob­jec­t_a does not ac­tu­ally point to ob­jec­t_b

Now we re­trieve some sub­set of these mem­o­ries and hope that the LLM cor­rectly fig­ures out which con­clu­sions are still valid.

This started to feel a lit­tle fa­mil­iar to me.

This looks like pro­gram analy­sis

A lot of the work I nor­mally do in­volves pro­gram analy­sis.

When analysing a pro­gram, we usu­ally have a bunch of facts about the pro­gram and some rules that de­rive ad­di­tional facts from them.

For ex­am­ple, imag­ine we know:

calls(foo, bar) calls(bar, baz)

We could de­fine a rule stat­ing that if one func­tion calls an­other func­tion, which it­self can reach a third func­tion, then the first func­tion can reach the third func­tion as well.

Eventually we cal­cu­late a fixed point con­tain­ing every­thing we can de­rive from the pro­gram. More im­por­tantly, if one of our in­put facts changes, there are plenty of tech­niques for up­dat­ing only the af­fected re­sults in­stead of re­run­ning every­thing from scratch.

This is also ex­actly what I wanted from an LLM dur­ing vul­ner­a­bil­ity re­search.

If an ob­ser­va­tion changes, I don’t want the model to re­con­struct the en­tire in­ves­ti­ga­tion from a tran­script and hope­fully no­tice all of the con­se­quences. I want the af­fected con­clu­sions to be­come in­valid au­to­mat­i­cally.

When look­ing at the prob­lem from this per­spec­tive, I started won­der­ing why we were mak­ing the LLM re­con­struct its en­tire state over and over again.

What if we just main­tained it?

And this is how I some­how ended up writ­ing a Datalog en­gine for LLMs :)

Datalog

Before we con­tinue, it is prob­a­bly use­ful to briefly ex­plain what Datalog ac­tu­ally is.

Datalog is a de­clar­a­tive logic pro­gram­ming lan­guage. Instead of writ­ing in­struc­tions de­scrib­ing how some­thing should be cal­cu­lated, we de­scribe facts and rules from which new facts can be de­rived.

Datalog is a de­clar­a­tive logic pro­gram­ming lan­guage. Instead of writ­ing in­struc­tions de­scrib­ing how some­thing should be cal­cu­lated, we de­scribe facts and rules from which new facts can be de­rived.

For ex­am­ple, we could store the fol­low­ing facts:

con­trols(at­tacker, ob­jec­t_a). points_to(ob­jec­t_a, ob­jec­t_b). ker­nel_ob­ject(ob­jec­t_b).

And then de­fine the fol­low­ing rule:

con­trol­s_k­er­nel_ob­ject(At­tacker) :- con­trols(At­tacker, ObjectA), points_to(Ob­jectA, ObjectB), ker­nel_ob­ject(Ob­jectB).

From our ex­ist­ing facts, the en­gine can there­fore de­rive:

con­trol­s_k­er­nel_ob­ject(at­tacker).

Nothing par­tic­u­larly ex­cit­ing yet.

However, sup­pose we later dis­cover that:

points_to(ob­jec­t_a, ob­jec­t_b).

was in­cor­rect.

If con­trol­s_k­er­nel_ob­ject(at­tacker) was de­rived from that fact, we know ex­actly which con­clu­sion de­pends on the ob­ser­va­tion that just changed, and we can au­to­mat­i­cally in­val­i­date it.

This is con­sid­er­ably nicer than putting all of the old in­for­ma­tion into a prompt and ask­ing an LLM to hope­fully no­tice the same thing.

Lemmalog

This even­tu­ally turned into Lemmalog.

The ba­sic idea is that an LLM should not nec­es­sar­ily be re­spon­si­ble for main­tain­ing its own knowl­edge. Instead, I split the prob­lem into two parts.

The LLM han­dles the fuzzy part:

LLDB shows that the freed ob­ject is later reused as the des­ti­na­tion of the write.” | v freed(ob­jec­t_a) reused_as(ob­jec­t_a, write_­tar­get)

And Lemmalog han­dles the de­ter­min­is­tic part:

facts | v rules | v de­rived facts

This means that the LLM is still re­spon­si­ble for un­der­stand­ing nat­ural lan­guage, source code, de­bug­ger out­put and all the other messy in­for­ma­tion that ap­pears dur­ing an in­ves­ti­ga­tion.

LLMs hap­pen to be quite good at this.

But once that in­for­ma­tion has been con­verted into struc­tured facts, we no longer need the model to re­peat­edly de­ter­mine all of its con­se­quences. The data­base can do that in­stead.

Retractions

One of the first in­ter­est­ing prob­lems I ran into was re­mov­ing facts.

Adding facts to a Datalog data­base is rel­a­tively straight­for­ward: add the new fact and eval­u­ate any rules which may now pro­duce ad­di­tional re­sults.

Removing some­thing is a lit­tle more an­noy­ing.

Take the fol­low­ing ex­am­ple:

a. b. c :- a. c :- b.

Here c has two sep­a­rate rea­sons for be­ing true.

If we re­move a, we can­not sim­ply re­move c, be­cause b still pro­vides an­other de­riva­tion for it. However, if we re­move both a and b, c should dis­ap­pear as well.

This turns out to be quite im­por­tant dur­ing vul­ner­a­bil­ity re­search, be­cause a con­clu­sion may be sup­ported by mul­ti­ple ob­ser­va­tions.

For ex­am­ple:

can­di­date_3_is_­ex­ploitable

may re­main true even if one par­tic­u­lar ex­ploit prim­i­tive turns out not to work, be­cause there is an­other in­de­pen­dent path to the same re­sult.

So Lemmalog has to keep track of how facts were de­rived and up­date their sup­port when some­thing changes.

Conveniently, this also gives us an­other use­ful prop­erty:

we can ask why some­thing is true.

Why?

Imagine we have been run­ning an agent for a few hours while in­ves­ti­gat­ing some­thing and it even­tu­ally con­cludes:

can­di­date_3_is_­ex­ploitable

That is nice, but I would also quite like to know why.

Because Lemmalog al­ready tracks the de­pen­den­cies of de­rived facts, we can ask it for the prove­nance of a con­clu­sion. For ex­am­ple, we may get some­thing that con­cep­tu­ally looks like this:

can­di­date_3_is_­ex­ploitable | +– at­tack­er_­con­trol­s_­pointer | | | +– ob­ser­va­tion_41 | +– point­er_reach­es_­tar­get | +– ob­ser­va­tion_57 +– rule_12

If ob­ser­va­tion_41 later turns out to be in­cor­rect, we know that this con­clu­sion may no longer be valid, and be­cause the data­base knows this as well, it can re­move the af­fected con­clu­sions au­to­mat­i­cally.

This was orig­i­nally mostly nec­es­sary to make in­cre­men­tal eval­u­a­tion work cor­rectly, but it turns out that be­ing able to ask an AI agent why it be­lieves some­thing is quite use­ful as well :)

It also ad­dresses one of the more an­noy­ing fail­ure modes I en­coun­tered with LLM-assisted re­search. Sometimes a model will con­fi­dently say some­thing like:

we al­ready es­tab­lished that this pointer is at­tacker-con­trolled

when that is not ac­tu­ally true.

If a con­clu­sion ex­ists in Lemmalog, I can ask where it came from. If there is no prove­nance sup­port­ing it, then it is not part of the main­tained state.

This ob­vi­ously does not pre­vent an LLM from hal­lu­ci­nat­ing dur­ing ex­trac­tion, but it does make it much harder for un­sup­ported con­clu­sions to silently be­come part of the in­ves­ti­ga­tion.

Facts also change over time

Another is­sue is that re­plac­ing old facts is not al­ways the same as delet­ing them.

Suppose we orig­i­nally be­lieve:

prim­i­tive_a is vi­able

and later dis­cover:

prim­i­tive_a is not vi­able

For most cur­rent queries, we prob­a­bly only care about the sec­ond state­ment. However, if we want to un­der­stand why we pre­vi­ously ex­plored a par­tic­u­lar ex­ploit strat­egy, the old state is still use­ful.

For this rea­son Lemmalog can as­so­ci­ate facts with va­lid­ity in­ter­vals.

Conceptually, we can rep­re­sent the state as some­thing like:

vi­able(prim­i­tive_a) [10:14, 12:37) not_vi­able(prim­i­tive_a) [12:37, …)

This al­lows us to an­swer both:

Is prim­i­tive_a vi­able now?

and:

Why did we think prim­i­tive_a was vi­able ear­lier?

with­out keep­ing two ap­par­ently con­tra­dic­tory facts around and ask­ing the LLM to de­cide which one we meant.

Again, this is not re­ally a lan­guage model prob­lem.

The Move to Python 3 Begins!

www.eveonline.com

Capsuleers,

EVE con­tin­ues to evolve, as a part of the EVE Evolved ini­tia­tive, and it is time to cast the spot­light on the code it­self!

Underneath every gate jump, mar­ket or­der, and fleet fight in EVE Online, there is a very large amount of Python. It has run New Eden for more than two decades and now be­gins its tran­si­tion to Python 3. For you, that means bet­ter tools to fix bugs sooner, room for new fea­tures, and a faster EVE over time.

The de­f­i­n­i­tion of suc­cess for this mi­gra­tion is sim­ple: it should be com­pletely un­no­tice­able, aside from the oc­ca­sional mo­ment when some­thing runs more smoothly.

Many of you have al­ready tested our first steps on Singularity, and those changes were de­ployed to­day. This is only the be­gin­ning of a long road ahead.

A Codebase Older Than Some of You

EVE launched in 2003, built on Stackless Python, a ver­sion of Python whose light­weight tasklets” let a sin­gle server node jug­gle thou­sands of pi­lots at once. Fenris Creations did not just adopt Stackless; it be­came one of its most sig­nif­i­cant con­trib­u­tors.

Some of you may re­mem­ber up­grad­ing to Stackless Python 2.5 in 2007, then to Stackless Python 2.7 in 2010. That was the last time EVE changed its Python ver­sion. Python 2.7 reached of­fi­cial end of life back in 2020, the rest of the soft­ware world moved on, and a whole gen­er­a­tion of cap­suleers has been born, gone to school, and started fly­ing frigates while EVE stayed on the same lan­guage ver­sion. It was re­li­able enough that a large, po­ten­tially risky mi­gra­tion never jus­ti­fied it­self, un­til now.

Sixteen years on the same ver­sion says a lot about how well it worked. The Carbon en­gine helped mas­sively, but it, too, has moved for­ward now!

Why Python 3? Why Now?

The short ver­sion: stay­ing on Python 2 in­creas­ingly holds EVE back, and mov­ing to Python 3 means a health­ier, bet­ter-sup­ported game for you.

One rea­son is per­for­mance. Recent Python 3 re­leases have de­liv­ered some of the largest speedups in the his­tory of this lan­guage. Over time, that opens the door to a faster EVE, though it is too early to say ex­actly what that will mean.

Another rea­son is the ecosys­tem. Modern li­braries, de­bug­gers, and pro­fil­ers are all built for Python 3. Every year we re­main on Python 2, more of them slip out of reach, and the more we must main­tain our­selves in­stead of im­prov­ing the game. Better tools mean we can find and fix prob­lems faster.

Python 3 sim­pli­fies many of the lan­guage’s core build­ing blocks.

Text is han­dled through a sin­gle, con­sis­tent string type, mak­ing lo­cal­iza­tion more re­li­able. Integers no longer have ar­bi­trary size lim­its, grow­ing au­to­mat­i­cally when needed. Even Python’s class sys­tem has been uni­fied, re­mov­ing legacy be­hav­ior and mak­ing ob­ject-ori­ented code more con­sis­tent.

Every char­ac­ter, every skill point, every as­set in every hangar, every ISK in every wal­let was writ­ten in Python 2 code, and all of it must read back un­der Python 3 ex­actly as it was.

The path ahead is hard, we must up­date a mas­sive amount of code while EVE keeps run­ning for you, but we know the des­ti­na­tion is reach­able, be­cause EVE Frontier al­ready runs our Carbon en­gine on mod­ern Python 3, and it works.

The Frontier mi­gra­tion cov­ered twelve mi­nor ver­sions of Python in one go, six­teen years of lan­guage evo­lu­tion in a sin­gle pro­ject. Tranquility has twenty-three years of ac­cu­mu­lated code, and, more im­por­tantly, twenty-three years of real player data, the his­tory of cap­suleers. And it must keep breath­ing 23.75 hours out of every 24.

Careful… Careful…

The EVE code­base con­sists of 2.4 mil­lion lines of Python. A lot of it pre­dates even Python 2.7, writ­ten to stan­dards from the 2.3 and 2.5 era that Python 3 re­fuses to parse at all.

So how do you mi­grate 2.4 mil­lion lines of code?

Very care­fully, and in mul­ti­ple stages.

Some of these stages will use tools de­vel­oped by the Python com­mu­nity (e.g., Python Futurize), while oth­ers will fo­cus more on EVEs unique fea­tures.

When we hit key mile­stones, we will re­quest your help by get­ting in­volved in playtests on Singularity, as you did in July, where we can ob­serve how parts of the up­dated sys­tem be­have un­der con­di­tions closer to the Tranquility server.

The first stage, where we are now, makes the code Python 3-ready while it still runs on Python 2.7.

We use a tool called Python-Future, built on the same code-rewrit­ing ma­chin­ery (2to3) that Python it­self shipped to help ex­actly this kind of mi­gra­tion. It ap­plies au­to­mated fixers”, each of which rewrites one ob­so­lete pat­tern, into a mod­ern form that both Python 2.7 and Python 3 ac­cept.

Once all the code works un­der both ver­sions, the gen­uinely hard work be­gins: the code that runs on both, but be­haves dif­fer­ently.

Measuring the Mountain (and Watching it Shrink)

How do you even know how far you are from Python 3?

We mea­sure it. Every one of our ~20K Python files is com­piled un­der a real Python 2.7 in­ter­preter and a real Python 3 in­ter­preter, be­cause the com­piler is the ground truth for whether code parses.

The first scan was a pleas­ant sur­prise: 95.9% of files al­ready com­piled un­der both ver­sions. The block­ing lines, the ones us­ing syn­tax re­jected by Python 3, num­bered about 3,300 out of 2.4 mil­lion.

The moun­tain turned out to be a large and very mea­sur­able hill:

~ 1,500 old-style print state­ments,

~ 1,500 old-style print state­ments,

~ 800 long” num­ber lit­er­als like 123L,

~ 800 long” num­ber lit­er­als like 123L,

~ 600 ex­cep­tion clauses in a syn­tax dep­re­cated be­fore EVE ex­isted,

~ 600 ex­cep­tion clauses in a syn­tax dep­re­cated be­fore EVE ex­isted,

50 uses of <>, a way of writ­ing not equal” so old that many work­ing Python de­vel­op­ers have never seen it.

50 uses of <>, a way of writ­ing not equal” so old that many work­ing Python de­vel­op­ers have never seen it.

The Challenges Ahead

Parsing is the easy part.

The same scan counts roughly 20,000 lines of code that com­pile fine un­der both ver­sions but be­have dif­fer­ently in Python 3. The clas­sic ex­am­ple is di­vi­sion: in Python 2, 1 / 2 is 0; while in Python 3 it is 0.5.

In EVE where those num­bers might be dam­age, ISK, or co­or­di­nates, each of those lines needs a hu­man de­ci­sion rather than a me­chan­i­cal fix. That work is part of Stage 2, which is why Stage 1 comes first: clear the me­chan­i­cal de­bris so hu­man at­ten­tion goes only where hu­mans are needed.

What This Means for You

In the short term, noth­ing, and that is by de­sign. Stage 1 changes are meant to be in­vis­i­ble. In the long term, this is some of the most valu­able ground­work we can lay for EVEs fu­ture: a faster in­ter­preter to power fleet fights and mar­ket hubs, mod­ern tool­ing that helps us find and fix bugs sooner, and a code­base new de­vel­op­ers can work on more pro­duc­tively, which means fea­tures reach you faster. It is in­fra­struc­ture for the next twenty years of EVE Online.

Thank You for Helping Us Prove It

Noticing noth­ing at all is the goal, and you are the ones help­ing us reach it.

At the end of July, you tested the first set of changes on Singularity. Thank you to every­one who took part.

We are now de­ploy­ing these changes to Tranquility. This is where we rely on you: keep do­ing what you al­ways do, and if any­thing feels off, please let us know by fil­ing a bug re­port.

In ad­di­tion, we are prepar­ing the agent mis­sion back­end for Python 3, but you should not no­tice a thing.

This is just the first step of many. Clearing the me­chan­i­cal de­bris was the easy part. The real work, the code that must be read line by line, is still ahead of us, and that is where we will need you most.

Keep an eye on our chan­nels for fu­ture tests. If you have ever wanted to tell your corp­mates you helped move EVE to Python 3, this is your chance!

Fly safe, on what­ever ver­sion of Python you find your­self.

Tether: Linux + iPhone

zackbartel.com

I did­n’t miss ma­cOS, but…

When I went to Linux full time I was sur­prised to not miss much from ma­cOS.

tldr; I made Tether to do all the things I did miss.

No AirPlay kinda sucked, but the one thing I kept wish­ing I had was what Apple calls Continuity”: the abil­ity to send and re­ceive iMes­sages and SMS, share files, sync clip­board, and see no­ti­fi­ca­tions from my iPhone on my com­puter.

In par­tic­u­lar, that thing where OTP codes sent to Mail or Messages aut­ofill into the lo­gin form I’m wait­ing for on the Mac. It sounds small, but that was the one thing I re­ally missed!

It is im­pos­si­ble to fully im­ple­ment all of Continuity on Linux, but Tether’s goal is to do all of it that is tech­ni­cally pos­si­ble.

Before you ask, I know KDE Connect ex­ists. It’s great! If you’re on Android you should def­i­nitely use it. The prob­lem is that it did­n’t do what I wanted and it’s roadmap in­di­cated it never would.

Origins

Tether started its life fill­ing the ma­jor holes. Clipboard sync was first, I wanted the OTP flow and I knew this was go­ing to be re­quired, and it was also the eas­i­est. This let me copy / paste be­tween ma­cOS and Linux (Wayland) and forced the pro­ject to build out all the foun­da­tion I knew it would need later.

I knew the App Store was go­ing to be a hur­dle so I shipped the iOS app first with only sup­port for clip­board sync. There was a very ba­sic teth­erd dae­mon for the linux side but that was it.

Security was a first class cit­i­zen from day one.

I never skipped out on safety. The net­work­ing be­tween iOS and Linux has been mTLS from the start, and both sides must agree be­fore any­thing can com­mu­ni­cate. Since then I’ve done Opus and then Fable bug / se­cu­rity sweeps reg­u­larly.

After that, file trans­fer was the ob­vi­ous next step and that went in quick and easy.

Wat

As for mail and browser stuff, I’m not very cre­ative. To be hon­est I’ve kinda cheated here. I use Zen Browser (Firefox) and Betterbird (Thunderbird) and both sup­port WebExtensions very well. So, I just made a browser and mail ex­ten­sion to deal with OTP stuff.

The mail ex­ten­sion looks for OTP codes and sends them to the browser ex­ten­sion which looks for OTP in­put el­e­ments and aut­ofills OTP codes as they ar­rive from mail.

It ac­tu­ally works great! The prob­lem is broad sup­port: if you use a dif­fer­ent mail client you’re kinda out of luck for now. I’d LOVE if some­one wants to help with that stuff, but it’s so far out of my com­fort that I’ll stick with the back­end side for now.

Bluetooth Breakthrough

My un­der­stand­ing to this point was that there was no in­ter­face to iMes­sage / SMS di­rectly. You could al­ways run a proxy on a Mac and send and re­ceive texts through that, but in my opin­ion that is not a so­lu­tion. I tried it. Even with Tailscale it was an un­pleas­ant ex­pe­ri­ence.

Then I ran across an­c­s4linux and later BlueFerry and I was com­pletely shocked. In par­tic­u­lar, erik­w­b’s pro­to­col doc­u­men­ta­tion, which fi­nally gave me enough in­for­ma­tion to un­der­stand what was hap­pen­ing.

There was a li­cens­ing is­sue, these pro­jects are GPL and Tether is and al­ways will be MIT, but I wanted a clean room im­ple­men­ta­tion in C++ any­way. Personally, I think putting an in­ter­op­er­abil­ity pro­to­col im­ple­men­ta­tion be­hind a copy­left li­cense is a lit­tle un­for­tu­nate! I’d rather see some­thing like this us­able by any­one, re­gard­less of the li­cense of the pro­ject us­ing it (libtether?).

Anyway, now that the truly hard prob­lem was solved, im­ple­men­ta­tion went about as smooth as you could ex­pect a blue­tooth in­te­gra­tion would go (it’s still a com­plete shit show in 2026). Problem af­ter prob­lem with no clear ex­pla­na­tion, an au­to­matic kick­ing ma­chine, and a bunch of care­fully tracked edge cases com­pen­sat­ing for blue­tooth’s in­ad­e­qua­cies.

But we got there.

And Tether now sup­ports: iMes­sage, SMS, Notifications, Contact sync on Linux. In ad­di­tion to its pre­vi­ous: File Transfer, Clipboard Sync, OTP han­dling.

And my damn text OTP codes FINALLY aut­ofill in the web browser!

Why?

While I did scratch my own itch with this pro­ject, I gen­uinely want Tether to be for every­one. I don’t get any­thing out of peo­ple us­ing it other than the sat­is­fac­tion of know­ing that some­thing I built is use­ful.

Contributions are wel­come! Bugs, fea­ture re­quests, trans­la­tions, doc­u­men­ta­tion, re­ally any­thing would be won­der­ful.

If you’re on Linux with an iPhone, I re­ally hope you give it a try.

Hot Chips 2026: Samsung’s Processing-in-Memory (PIM)

chipsandcheese.com

In-memory com­pute has been an at­trac­tive propo­si­tion for many years be­cause com­pute within a mem­ory chip can ex­ploit its higher in­ter­nal band­width. Additionally, in-mem­ory com­pute avoids the long la­tency path be­tween DRAM and tra­di­tional com­pute cores. At Hot Chips 2026, Samsung dis­cusses their con­tin­ued pur­suit of in-mem­ory com­pute with their PIM (Processing-in-Memory) push. They’re im­ple­ment­ing MAC units within LPDDR5X chips, while pre­serv­ing the chip’s abil­ity to in­ter­face with a stan­dard mem­ory con­troller.

DRAM chips are in­ter­nally di­vided into banks, each with their own read and write logic. During a nor­mal DRAM ac­cess, the mem­ory con­troller se­lects a bank, ac­ti­vates a row within it, and then ac­cesses data via col­umn ac­cess strobe (CAS) com­mands. Bandwidth is lim­ited by the chip’s ex­ter­nal DRAM in­ter­face. Even if the mem­ory con­troller could ac­ti­vate all of the banks si­mul­ta­ne­ously, it would­n’t be able to get its hands the full band­width avail­able across all the banks.

Samsung’s LPDDR5X-PIM is like a nor­mal LPDDR5X-9600 chip with 16 banks, but places a PIM (Processing-in-Memory) block at each bank. These PIM blocks ac­cess their at­tached DRAM bank with­out be­ing con­strained by the chip’s ex­ter­nal bus. Together, they can uti­lize the chip’s in­ter­nal band­width across all 16 banks, which comes out to 614 GB/s. For com­par­i­son, reg­u­lar DRAM ac­cesses can hit two banks in par­al­lel and max out at 76.8 GB/s.

PIM blocks in­ter­nally con­sist of a MAC tree with sur­round­ing reg­is­ter files and con­trol logic. A 1024-bit in­struc­tion reg­is­ter file holds up to 64 16-bit in­struc­tions. A 4 kbit source reg­is­ter file is meant for ac­ti­va­tion vec­tors, and sup­plies one source operand for the MAC ar­ray. Samsung ex­pects soft­ware to load model weights into DRAM, so the at­tached DRAM block sup­plies the sec­ond operand. Model weights can be scaled be­fore the MAC com­pu­ta­tion, with scale fac­tors com­ing from a 2 kbit scale reg­is­ter.

The PIM block’s MAC ar­ray sup­ports a va­ri­ety of low pre­ci­sion for­mats. Numbers from Samsung’s pre­sen­ta­tion sug­gest each PIM block’s MAC ar­ray can sus­tain four INT8 or FP8 MAC op­er­a­tions per data clock, or eight per cy­cle when not count­ing the dou­ble data rate. Throughput dou­bles for 4-bit in­put weights, bring­ing pack­age-wide com­pute through­put to 2.4 TOPS.

This is­n’t a very high fig­ure, but an im­ple­men­ta­tion with many LPDDR5X chips will have higher ag­gre­gate through­put. For ex­am­ple, eight LPDDR5X chips to­gether would have 9.6 INT8 TOPS, which just about matches the NPU in Intel’s Meteor Lake. That would also be an ex­pen­sive setup, be­cause eight 16 GB LPDDR5X chips would cor­re­spond to 128 GB of sys­tem mem­ory.

One high­light of LPDDR5X-PIM is that it stays within the stan­dard LPDDR5X pro­to­col while ex­pos­ing com­pute ca­pa­bil­i­ties that aren’t part of the mem­ory stan­dard. Samsung achieves this by set­ting aside spe­cial row ad­dresses, which act like MMIO ad­dresses of sorts. Each chan­nel has a pair of pre­de­fined rows for mode con­trol. Activating one of those rows sets the chip to sin­gle-bank mode, while the other sets the chip to multi-bank mode. Single-bank is the reg­u­lar mode, while multi-bank ap­plies com­mands across all 16 banks to ex­ploit the chip’s in­ter­nal band­width.

Special per-bank rows change how read and write com­mands be­have. Activating one of these spe­cial rows makes read and write com­mands ac­cess PIM reg­is­ters in­stead of reg­u­lar DRAM bank con­tents (PIM Registers Activated mode). Samsung en­vi­sions a ML use case where soft­ware loads model weights into DRAM while the chip is in nor­mal sin­gle-bank mode. Then, soft­ware switches into multi-bank mode and en­ters PIM Registers Activated mode. This lets code write ac­ti­va­tion val­ues into PIM source reg­is­ters, set scale fac­tors in PIM scale reg­is­ters, and spec­ify an op­er­a­tion that’s filled into PIM in­struc­tion reg­is­ters.

Because the chip is in multi-bank mode, each PIM reg­is­ter write gets broad­cast across all 16 banks. PIM com­pute there­fore works like a very con­strained SIMD proces­sor, where the op­er­a­tion, scale fac­tor, and one source operand are the same across all banks. Samsung does al­low writ­ing PIM reg­is­ters in sin­gle-bank mode, but that func­tion­al­ity is meant for de­bug­ging pur­poses. Each DRAM packet is 256 bits (BL=16) Filling each source reg­is­ter takes 16 write com­mands. Doing that one bank at a time across each of the 16 banks would mean 256 write com­mands, turn­ing host to PIM reg­is­ter write band­width into the lim­it­ing fac­tor.

After prim­ing PIM reg­is­ters, soft­ware switches back into multi-bank mode and is­sues read com­mands. Instead of read­ing DRAM con­tents, these read com­mands ini­ti­ate com­pu­ta­tions and get re­sults ac­cu­mu­lated into PIM vec­tor reg­is­ter files. Then, write com­mands tell PIM blocks to write VRF con­tents back into the DRAM banks.

PIM has to han­dle re­order­ing that a nor­mal mem­ory con­troller might carry out. When code sets up PIM by ac­ti­vat­ing the bank, PIM con­ven­tion­ally sets up its in­struc­tion reg­is­ter files so that in­struc­tions se­quen­tially ac­cess each source reg­is­ter el­e­ment. For in­stance, the first in­struc­tion would ref­er­ence the first source reg­is­ter el­e­ment, the sec­ond in­struc­tion would ref­er­ence the sec­ond source reg­is­ter el­e­ment, and so on. However, that falls apart if the mem­ory con­troller re­orders ac­cesses. Samsung gets around this with an Address Align Mode (AAM), which makes each in­struc­tion in­fer its source reg­is­ter in­dex from the col­umn ad­dress be­ing ac­cessed.

When the host fin­ishes us­ing in-mem­ory com­pute and wants to read re­sults, it switches the DRAM chip back into sin­gle-bank mode. Then, reg­u­lar DRAM reads and writes will start ac­cess­ing DRAM con­tents as nor­mal.

Samsung in­ter­nally achieved huge per­for­mance gains when tak­ing ad­van­tage of LPDDR5X-PIM, com­pared to us­ing stan­dard LPDDR5X. The chip’s abil­ity to op­er­ate with a stan­dard mem­ory con­troller is im­pres­sive, and Samsung has been very cre­ative in how they ap­proached the prob­lem.

Repurposing stan­dard DRAM com­mands should sim­plify hard­ware, but soft­ware chal­lenges look steep. Because PIM modes change the mean­ing of DRAM ac­cess com­mands, soft­ware can’t use PIM and carry out reg­u­lar mem­ory ac­cesses at the same time. That ap­plies even across threads, be­cause mem­ory con­trollers and DRAM chips are obliv­i­ous to what thread an ac­cess is for. If a non-PIM thread reads from mem­ory while an­other is us­ing PIM, the first thread could cause an un­in­tended com­pu­ta­tion and get in­cor­rect re­sults into the PIM VRFs. A write from the non-PIM thread could cause PIM blocks to write VRF data back to the wrong ad­dress.

Samsung deals with this by hav­ing the host iso­late a PIM re­gion in mem­ory. I can’t think of an easy way to do this in a typ­i­cal sys­tem with­out com­pro­mis­ing mem­ory band­width and PIM per­for­mance. Hardware nor­mally in­ter­leaves ad­dresses across chan­nels, which lets com­mon ac­cess pat­terns nat­u­rally uti­lize band­width across those chan­nels. PIM uses per-chan­nel rows to con­trol sin­gle/​multi-bank mode changes, so drop­ping in­ter­leav­ing and des­ig­nat­ing mem­ory chan­nels as PIM-only would be the only rea­son­able way to cre­ate a PIM re­gion. Then, non-PIM ap­pli­ca­tions would­n’t be able to take ad­van­tage of band­width from chan­nels re­served for PIM. PIM code would miss out on band­width and com­pute from non-PIM chan­nels. The lat­ter could be a sig­nif­i­cant is­sue be­cause per-chip com­pute through­put is­n’t that high.

Multitasking is­sues could per­sist even af­ter iso­lat­ing a PIM re­gion. If an ap­pli­ca­tion wants to use PIM and take ad­van­tage of mul­ti­thread­ing, it would have to guard PIM re­gion ac­cesses with locks to pre­vent cases where one thread tries to do PIM com­pute while an­other at­tempts reg­u­lar mem­ory ac­cesses. Things get even worse with a mod­ern mul­ti­task­ing op­er­at­ing sys­tem, where mul­ti­ple processes could try to use PIM with­out be­ing aware of each other. I’m not sure there’s a good way to han­dle that be­sides mak­ing the op­er­at­ing sys­tem run PIM com­pute code seg­ments with all other threads blocked and in­ter­rupts dis­abled. Handling in­ter­rupts or con­text switches with PIM feels like a night­mare for the OS in any case. Preempting a PIM thread would mean bring­ing the mem­ory chan­nel out of PIM mode and sav­ing PIM state. The OS would have to read out in­struc­tion, source, scale, and vec­tor reg­is­ter file across each bank and save it some­where. Only al­low­ing a sin­gle run­ning thread with no task switch­ing would leave mul­ti­threaded per­for­mance on the table, and could lead to sys­tem re­spon­sive­ness is­sues if code spends too long in PIM com­pute sec­tions.

PIM com­pute breaks a mem­ory sub­sys­tem’s ex­pec­ta­tions about DRAM be­hav­ior be­cause DRAM can gen­er­ate mem­ory val­ues that the cache hi­er­ar­chy never knows about. Caches can also break PIM be­hav­ior by ab­sorb­ing ac­cesses meant to trig­ger PIM op­er­a­tions. Samsung there­fore rec­om­mends map­ping PIM mem­ory as un­cacheable. That’s prob­lem­atic be­cause mod­ern CPUs and GPUs rely heav­ily on caching to mit­i­gate DRAM la­tency. Performance on un­cacheable mem­ory will be ex­tremely slow be­cause the CPU or GPU cores will spend far more time stalled wait­ing on mem­ory.

Skipping caches is­n’t the only prob­lem. PIM reads act like MMIO ac­cesses be­cause they cause com­pu­ta­tions that af­fect PIM VRF val­ues, rather than just re­triev­ing data. CPUs also mit­i­gate mem­ory la­tency by ini­ti­at­ing loads be­fore they know that load data will ac­tu­ally be needed. Branch pre­dic­tion lets CPUs is­sue in­struc­tions be­fore the core knows for cer­tain that those in­struc­tions will be ex­e­cuted. Prefetchers ob­serve mem­ory ac­cess pat­terns and at­tempt to load data into cache be­fore in­struc­tions re­quest that data. If the CPU loads data that turns out to un­needed later on, that’s fine be­cause loads nor­mally won’t cause in­cor­rect pro­gram be­hav­ior. Unfortunately that’s not true with PIM, where reads trig­ger com­pu­ta­tions that mod­ify PIM VRF con­tents.

Working with a PIM re­gion will likely mean mak­ing mem­ory ac­cesses non-spec­u­la­tive as well as non-cacheable. Running a CPU with­out caching, prefetch­ing, or out-of-or­der ex­e­cu­tion will crip­ple per­for­mance.

Setting aside PIM mode dif­fi­cul­ties, in-mem­ory com­pute poses high level chal­lenges for soft­ware. Each PIM block only has fast ac­cess to its lo­cally at­tached DRAM bank. All other in­put data has to be brought in through the DRAM chip’s com­par­a­tively con­strained ex­ter­nal in­ter­face. PIM blocks can’t di­rectly ex­change data with each other, so the host has to move data us­ing reg­u­lar DRAM reads and writes if one PIM block needs to use re­sults gen­er­ated by an­other.

Samsung’s LPDDR5X-PIM can the­o­ret­i­cally go into any server, desk­top, lap­top, or even mo­bile de­vice thanks to its abil­ity to work with stan­dard mem­ory con­trollers. However, that does­n’t mean it’ll be easy to use with typ­i­cal hard­ware and soft­ware par­a­digms. PIM mode switch­ing throws a wrench into the works for mul­ti­task­ing op­er­at­ing sys­tems. Modifying DRAM con­tents un­der the hood and at­tach­ing side ef­fects to read com­mands breaks CPU caching, prefetch­ing, and out-of-or­der ex­e­cu­tion.

I don’t think there’s an easy way to use in-mem­ory com­pute with­out changes through­out the mem­ory sub­sys­tem. For ex­am­ple, some­thing like should make soft­ware adop­tion eas­ier:

Expand the DRAM in­ter­face to add a set of com­pute com­mands, avoid­ing mode switch com­plex­ity

Expand the DRAM in­ter­face to add a set of com­pute com­mands, avoid­ing mode switch com­plex­ity

Have the mem­ory con­troller act like a peer CPU core from a cache co­herency per­spec­tive. Before us­ing in-mem­ory com­pute com­mands, the mem­ory con­troller is­sues read-for-own­er­ship (RFO) re­quests for all af­fected cache lines. That lets the mem­ory con­troller ob­tain any mod­i­fied data and write it back to DRAM be­fore start­ing in-mem­ory com­pute, en­sur­ing that in-mem­ory com­pute re­sults re­flect the lat­est CPU-side writes. Then, the mem­ory con­troller holds own­er­ship of af­fected cache lines un­til in-mem­ory com­pute op­er­a­tions com­plete, let­ting CPU cores ob­serve in-mem­ory com­pute re­sults with­out need­ing to in­val­i­date or by­pass caches

Have the mem­ory con­troller act like a peer CPU core from a cache co­herency per­spec­tive. Before us­ing in-mem­ory com­pute com­mands, the mem­ory con­troller is­sues read-for-own­er­ship (RFO) re­quests for all af­fected cache lines. That lets the mem­ory con­troller ob­tain any mod­i­fied data and write it back to DRAM be­fore start­ing in-mem­ory com­pute, en­sur­ing that in-mem­ory com­pute re­sults re­flect the lat­est CPU-side writes. Then, the mem­ory con­troller holds own­er­ship of af­fected cache lines un­til in-mem­ory com­pute op­er­a­tions com­plete, let­ting CPU cores ob­serve in-mem­ory com­pute re­sults with­out need­ing to in­val­i­date or by­pass caches

Add a new set of CPU in­struc­tions like rep macb” that per­form mul­ti­ply-ac­cu­mu­late op­er­a­tions over a block of mem­ory with fixed mul­ti­pli­cand/​scale fac­tors and un­de­fined nu­mer­i­cal char­ac­ter­is­tics. The CPU can choose whether to use in-mem­ory com­pute (if sup­ported by DRAM) or gen­er­ate a se­quence of in­ter­nal ops (if op­er­at­ing over a small set of data that’s al­ready in cache).

Add a new set of CPU in­struc­tions like rep macb” that per­form mul­ti­ply-ac­cu­mu­late op­er­a­tions over a block of mem­ory with fixed mul­ti­pli­cand/​scale fac­tors and un­de­fined nu­mer­i­cal char­ac­ter­is­tics. The CPU can choose whether to use in-mem­ory com­pute (if sup­ported by DRAM) or gen­er­ate a se­quence of in­ter­nal ops (if op­er­at­ing over a small set of data that’s al­ready in cache).

With those hard­ware changes, soft­ware would be able to use in-mem­ory com­pute from a mul­ti­task­ing op­er­at­ing sys­tem with­out re­serv­ing mem­ory or los­ing thread-level par­al­lelism to PIM-related locks and syn­chro­niza­tion. A trans­par­ent CPU in­struc­tion avoids the prob­lem of ship­ping hard­ware spe­cific bi­na­ries, and al­lows for­ward-com­pat­i­ble code that au­to­mat­i­cally takes ad­van­tage of new hard­ware ca­pa­bil­i­ties in­clud­ing dif­fer­ent in-mem­ory com­pute im­ple­men­ta­tions. It also lets hard­ware use im­ple­men­ta­tion-spe­cific knowl­edge and real-time data (like a no-fill-on-miss cache lookup) to make the best de­ci­sion about where to carry out com­pute. I don’t like the soft­ware al­ter­na­tive of re­serv­ing mem­ory re­gions, mark­ing them un­cacheable, and block­ing threads. There’s just too many trade­offs around per­for­mance, mem­ory ca­pac­ity, and re­spon­sive­ness.

Glacier mice

en.wikipedia.org

From Wikipedia, the free en­cy­clo­pe­dia

Glacier mice are colonies of mosses found on some glac­i­ers and ad­ja­cent ecosys­tems. They are com­posed of mul­ti­ple species of moss[1] and can also host other species, such as ne­ma­tode worms, spring­tails, and wa­ter bears.[2] Although what pre­con­di­tions are nec­es­sary for glac­ier mice to form has yet to be de­ter­mined, they have been ob­served in Alaska, Chile, Greenland, Iceland, Svalbard, Uganda and Venezuela, as well as sev­eral Subantarctic is­lands.[3][4][5] In at least some cases, glac­ier mice ap­par­ently re­pro­duce asex­u­ally due to the ef­fect of the harsh glac­ier en­vi­ron­ment on tra­di­tional moss re­pro­duc­tion strate­gies.[6]

Glacier mice are no­table for their move­ment across the ice, which ap­pears to be non-ran­dom, tak­ing the form of herd-like be­hav­ior. This move­ment is as yet un­ex­plained,[1] and does not ap­pear to be solely the prod­uct of wind or the di­rec­tion of a slope.

Gilbert and Bartholomaus’s ev­i­dence[1] shows a south­ern mi­gra­tion in Alaska which sug­gests a mech­a­nism: the dark coloured moss ab­sorbs sun en­ergy on the south side, and casts a shadow on the north side. This causes the ice to melt only on the sunny side, cre­at­ing a small de­pres­sion, the moss then rolls into the de­pres­sion and the process con­tin­ues cre­at­ing grad­ual south­ern mo­tion (N. Hemisphere) and north­ern mo­tion (S. Hemisphere).[citation needed]

On av­er­age, they move about 2.5 cm (0.98 in) per day.[7] The use of ac­celerom­e­ters has demon­strated that glac­ier mice do in fact ro­tate and roll, rather than sim­ply slid­ing across the ice, over time ex­pos­ing all of their sur­faces.[7] Measurements of glac­ier mice show that they re­tain heat and mois­ture, cre­at­ing a suit­able ecosys­tem for mi­croor­gan­isms that oth­er­wise could not live on a glac­ier.[8][9] Glacier mice are be­lieved to per­sist for six years or longer.[7]

Glacier mice were first de­scribed in 1950 by Icelandic me­te­o­rol­o­gist Jón Eyþórsson, who re­ferred to them as jökla-mýs, which is Icelandic for glacier mice.“[10]

1 2 3 Greenfieldboyce, Nell (2020 – 05-09). Herd Of Fuzzy Green Glacier Mice’ Baffles Scientists”. NPR. Retrieved 2020 – 05-25.

↑ Hausheer, Justine E. (January–February 2013). Curious Mice’ Thrive on Glaciers”. Audubon. Retrieved 2020 – 05-25.

↑ Dickson, James H.; Johnson, Robert E (2014). Mosses and the be­gin­ning of plant suc­ces­sion on the Walker Glacier, south­east­ern Alaska”. Lindbergia. 37 (2): 60 – 65. doi:10.25227/​linbg.01052. S2CID 133983103.

↑ Perez, Francisco L. (1991). Ecology and Morphology of Globular Mosses of Grimmia lon­girostris in the Paramo de Piedras Blancas, Venezuelan Andes”. Arctic and Alpine Research. 23 (2): 133 – 148. doi:10.2307/​1551378. JSTOR 1551378.

↑ Uetake, Jun; Tanaka, Sota; Hara, Kosuke; Tanabe, Yukiko; Samyn, Denis; Motoyama, Hideaki; Imura, Satoshi; Kohshima, Shiro (17 November 2014). Novel Biogenic Aggregation of Moss Gemmae on a Disappearing African Glacier”. PLOS ONE. 9 (11) e112510. Bibcode:2014PLoSO…9k2510U. doi:10.1371/​jour­nal.pone.0112510. PMC 4234412. PMID 25401789.

↑ Gao, Fei (2016 – 04-21). On Glaciers, Moss Become Asexual”. GlacierHub. Retrieved 2020 – 05-25.

1 2 3 Hotaling, Scott; Bartholomaus, Timothy C.; Gilbert, Sophie L. (2020). Rolling Stones Gather Moss: Movement and Longevity of Moss Balls on an Alaskan Glacier”. Polar Biology. 43 (6): 735 – 744. Bibcode:2020PoBio..43..735H. doi:10.1007/​s00300 – 020-02675 – 6. ISSN 0722 – 4060. S2CID 218653483.

↑ Kaplan, Matt (2012 – 08-27). On Glaciers, Balls of Dust and Moss Make a Cozy Home”. The New York Times. New York City, New York. Retrieved 25 May 2020.

↑ Coulson, S.J.; Midgley, N.G. (2012). The role of glac­ier mice in the in­ver­te­brate col­o­niza­tion of glacial sur­faces; the moss balls of the Falljökull, Iceland” (PDF). Polar Biology. 35 (11): 1651 – 1658. Bibcode:2012PoBio..35.1651C. doi:10.1007/​s00300 – 012-1205 – 4. S2CID 18751290.

Coulson, S.J.; Midgley, N.G. (2012). The role of glac­ier mice in the in­ver­te­brate col­o­niza­tion of glacial sur­faces; the moss balls of the Falljökull, Iceland” (PDF). Polar Biology. 35 (11): 1651 – 1658. Bibcode:2012PoBio..35.1651C. doi:10.1007/​s00300 – 012-1205 – 4. S2CID 18751290.

Belkina, Olga A.; Vilnet, Anna A. (2015). Some as­pects of the moss pop­u­la­tion de­vel­op­ment on the Svalbard glac­i­ers”. Czech Polar Reports. 5 (2): 160 – 175. Bibcode:2015CzPR….5..160B. doi:10.5817/​CPR2015 – 2-14.

Hotaling, Scott; Bartholomaus, Timothy C.; Gilbert, Sophie L. (2020). Rolling stones gather moss: move­ment and longevity of moss balls on an Alaskan glac­ier”. Polar Biology. 43 (6): 735 – 744. Bibcode:2020PoBio..43..735H. doi:10.1007/​s00300 – 020-02675 – 6. S2CID 218653483.

The Natural History Museum, London: The se­cret world of glac­ier mice on YouTube

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.