10 interesting stories served every morning and every evening.

Apple sues OpenAI, accuses ex-employees of stealing trade secrets

9to5mac.com

Apple has filed a law­suit against OpenAI to­day, ac­cus­ing the com­pany of trade se­cret theft. Specifically, Apple al­leges that its for­mer em­ploy­ees have stolen trade se­crets for the ben­e­fit of OpenAI.”

This case is about Apple’s for­mer em­ploy­ees steal­ing Apple’s trade se­crets for the ben­e­fit of OpenAI. Apple brings this suit to put a stop to it,” the law­suit says.

Apple state­ment

In a state­ment to 9to5Mac, an Apple spokesper­son said:

At Apple, our teams are con­stantly de­vel­op­ing break­through tech­nolo­gies to cre­ate the best prod­ucts and ser­vices in the world, and pro­tect­ing their work and in­tel­lec­tual prop­erty is some­thing we take very se­ri­ously. Recently, sig­nif­i­cant ev­i­dence has emerged sug­gest­ing in­di­vid­u­als em­ployed by OpenAI wrong­fully took Apple’s se­cret and con­fi­den­tial in­for­ma­tion re­gard­ing our un­re­leased tech­nolo­gies, processes, and prod­ucts. We will al­ways de­fend our teams’ hard work and in­no­va­tions, and we are tak­ing all ap­pro­pri­ate steps to do so.”

At Apple, our teams are con­stantly de­vel­op­ing break­through tech­nolo­gies to cre­ate the best prod­ucts and ser­vices in the world, and pro­tect­ing their work and in­tel­lec­tual prop­erty is some­thing we take very se­ri­ously. Recently, sig­nif­i­cant ev­i­dence has emerged sug­gest­ing in­di­vid­u­als em­ployed by OpenAI wrong­fully took Apple’s se­cret and con­fi­den­tial in­for­ma­tion re­gard­ing our un­re­leased tech­nolo­gies, processes, and prod­ucts. We will al­ways de­fend our teams’ hard work and in­no­va­tions, and we are tak­ing all ap­pro­pri­ate steps to do so.”

Update: Read OpenAI’s re­sponse here.

Apple ac­cuses OpenAI of trade se­cret theft

The law­suit names Chang Liu and Tang Tan as two of the de­fen­dants. Tang Tan served as VP of prod­uct de­sign at Apple, lead­ing iPhone and Apple Watch prod­uct de­sign. He de­parted the com­pany in February 2024 to work with Jony Ive. Chang Liu, mean­while, worked at Apple for eight years and was a se­nior sys­tem elec­tri­cal en­gi­neer be­fore de­part­ing to join OpenAI in January 2026.

Apple’s law­suit also names OpenAI and io Products as de­fen­dants.

OpenAI’s hard­ware ef­forts are be­ing led by Jony Ive, Apple’s for­mer chief de­sign of­fi­cer. OpenAI ac­quired Ive’s startup io as part of a $6.5 bil­lion deal last year. OpenAI’s takeover of the com­pany in­cluded more than 50 en­gi­neers, de­vel­op­ers, and other em­ploy­ees. In its orig­i­nal an­nounce­ment, OpenAI touted that Ive founded io in col­lab­o­ra­tion with Scott Cannon, Evans Hankey, and Tan.

Hankey led Apple’s de­sign team for sev­eral years af­ter Ive de­parted the com­pany. She de­parted in 2022 be­fore re­unit­ing with Ive as part of io. Cannon also pre­vi­ously worked at Apple.

Ive, Hankey, and Cannon are not per­son­ally men­tioned any­where in Apple’s ini­tial fil­ing to­day.

The com­plaint

Apple says it first raised con­cerns with OpenAI di­rectly in February, ask­ing the com­pany to in­ves­ti­gate and ad­dress the is­sue. OpenAI, how­ever, never re­sponded. Apple says the con­duct de­tailed in the fil­ing is the tip of the ice­berg.”

This is the tip of the ice­berg. Apple lacks vis­i­bil­ity into what’s been hap­pen­ing be­hind closed doors at OpenAI, where such mis­con­duct is nor­mal­ized and ex­em­pli­fied by lead­er­ship. This much is clear, how­ever: at every level, from mem­bers of its Technical Staff to its Chief Hardware Officer, and in co­or­di­na­tion with busi­ness part­ners, OpenAI has been steal­ing Apple’s trade se­crets and con­fi­den­tial in­for­ma­tion. As a nat­ural re­sult, OpenAI’s nascent hard­ware busi­ness now rests.

This is the tip of the ice­berg. Apple lacks vis­i­bil­ity into what’s been hap­pen­ing be­hind closed doors at OpenAI, where such mis­con­duct is nor­mal­ized and ex­em­pli­fied by lead­er­ship. This much is clear, how­ever: at every level, from mem­bers of its Technical Staff to its Chief Hardware Officer, and in co­or­di­na­tion with busi­ness part­ners, OpenAI has been steal­ing Apple’s trade se­crets and con­fi­den­tial in­for­ma­tion. As a nat­ural re­sult, OpenAI’s nascent hard­ware busi­ness now rests.

The com­plaint, filed in the U.S. District Court for the Northern District of California, al­leges that Tan used in­sider knowl­edge of Apple’s con­fi­den­tial pro­jects to grill job can­di­dates in in­ter­views and learn more con­fi­den­tial in­for­ma­tion. Additionally, Tan di­rected job can­di­dates still work­ing at Apple to bring ac­tual Apple hard­ware com­po­nents and sam­ples for show and tell” ses­sions.

When in­ter­view­ing Apple em­ploy­ees for jobs at OpenAI, Mr. Tan uses Apple’s con­fi­den­tial in­for­ma­tion to gain ac­cess to even more in­sider knowl­edge. He has used an Apple in­ter­nal pro­ject co­de­name to ask, What’s the plan[?]” for an unan­nounced Apple prod­uct.

He has di­rected job can­di­dates still work­ing for Apple to bring Actual parts” from Apple to their in­ter­views for show and tell” ses­sions in which he and his team at OpenAI can elicit still more Apple con­fi­den­tial in­for­ma­tion. These di­rec­tions to bring Apple’s parts to OpenAI job in­ter­views sur­prised at least one of the can­di­dates, who com­mented that he didn’t even know we could take those from the of­fice.”

OpenAI has been in­struct­ing Apple em­ploy­ees to bring CAD/design ar­ti­facts” and prototypes” to their in­ter­views and to di­vulge de­tails about their work such as subsystem and com­po­nent se­lec­tion,” the tools or method­olo­gies you use for sys­tem in­te­gra­tion, such as CAD soft­ware, sim­u­la­tion tools,” and Vendor se­lec­tion and com­mu­ni­ca­tion/​col­lab­o­ra­tion with ven­dors.”

When in­ter­view­ing Apple em­ploy­ees for jobs at OpenAI, Mr. Tan uses Apple’s con­fi­den­tial in­for­ma­tion to gain ac­cess to even more in­sider knowl­edge. He has used an Apple in­ter­nal pro­ject co­de­name to ask, What’s the plan[?]” for an unan­nounced Apple prod­uct.

He has di­rected job can­di­dates still work­ing for Apple to bring Actual parts” from Apple to their in­ter­views for show and tell” ses­sions in which he and his team at OpenAI can elicit still more Apple con­fi­den­tial in­for­ma­tion. These di­rec­tions to bring Apple’s parts to OpenAI job in­ter­views sur­prised at least one of the can­di­dates, who com­mented that he didn’t even know we could take those from the of­fice.”

OpenAI has been in­struct­ing Apple em­ploy­ees to bring CAD/design ar­ti­facts” and prototypes” to their in­ter­views and to di­vulge de­tails about their work such as subsystem and com­po­nent se­lec­tion,” the tools or method­olo­gies you use for sys­tem in­te­gra­tion, such as CAD soft­ware, sim­u­la­tion tools,” and Vendor se­lec­tion and com­mu­ni­ca­tion/​col­lab­o­ra­tion with ven­dors.”

Furthermore, Apple says a can­di­date be­gan screenshotting and down­load­ing files re­lat­ing to a highly con­fi­den­tial Apple pro­ject” hours be­fore in­ter­view­ing with Tan, who then solicited more in­for­ma­tion about that same Apple pro­ject” once the in­ter­view started. This be­came an established pat­tern,” Apple says.

Tan also al­legedly pos­sessed and dis­trib­uted an in­ter­nal Apple Need to Know” doc­u­ment to new OpenAI hires be­fore they gave their no­tice to Apple. The doc­u­ment in­cluded Apple’s de­par­ture se­cu­rity pro­to­cols. As part of its in­ves­ti­ga­tion, Apple found a pattern by em­ploy­ees who de­part for OpenAI of tak­ing steps to evade the se­cu­rity processes in­tended to pro­tect Apple’s con­fi­den­tial in­for­ma­tion.”

Meanwhile, Apple also claims for­mer en­gi­neer Liu ex­ploited a se­cu­rity bug to down­load con­fi­den­tial en­gi­neer­ing files af­ter leav­ing the com­pany. Rather than re­port the ex­ploit, Liu al­legedly joked about it in mes­sages (“LOL,” so funny”). Liu also failed to re­turn an Apple-issued lap­top af­ter his de­par­ture.

Apple al­leges that Liu down­loaded a compilation of tech­ni­cal files with over a thou­sand pages” with de­tails of work he did at Apple. This in­cluded de­tailed man­u­fac­tur­ing doc­u­ments cov­er­ing the com­plex cir­cuit boards used in Apple hard­ware prod­ucts.

Liu also al­legedly coached an­other Apple em­ployee at the time, whom he was re­cruit­ing to OpenAI, on which con­fi­den­tial ma­te­ri­als to study be­fore her own OpenAI in­ter­view.

Finally, Apple al­leges that OpenAI had a trusted Apple part­ner carry out Apple’s pro­pri­etary metal-fin­ish­ing tech­nique, mis­lead­ing the part­ner into be­liev­ing it had Apple’s per­mis­sion to do so. Apple also says OpenAI ap­proached a sec­ond long­time Apple sup­plier that works on power and bat­tery man­u­fac­tur­ing, us­ing in­sider ter­mi­nol­ogy to ask targeted ques­tions” about spe­cific Apple com­po­nents.

The suit seeks in­junc­tive re­lief and dam­ages, and comes as OpenAI works to bring its first con­sumer hard­ware de­vice to mar­ket.

Apple’s law­suit also comes af­ter Bloomberg re­ported that OpenAI was prepar­ing legal ac­tion” against Apple over how its part­ner­ship to in­te­grate ChatGPT into Siri played out. Today’s law­suit from Apple, how­ever, says that agree­ment is not at is­sue here.

Tan and Liu are just two of many Apple em­ploy­ees who have de­parted for OpenAI. Today’s fil­ing says that there are over 400 for­mer Apple em­ploy­ees now work­ing at OpenAI.

There have been var­i­ous ru­mors about OpenAI’s hard­ware ef­forts so far. In April, Ming-Chi Kuo re­ported that OpenAI is de­vel­op­ing its own smart­phone, which could launch in 2028. The Information has also re­ported on OpenAI’s work on a HomePod-style smart speaker.

You can read the full fil­ing be­low and find the PDF linked here.

Chance’s fa­vorites:

Bring wire­less CarPlay to any car

Apple: The First 50 Years” by David Pogue

Logitech MX Master 4

Belkin 3-in-1 MagSafe Charger

Beats Woven USB-C Charging Cables

AirPods Pro 3: $222 (Reg. $249)

Follow Chance: Threads, Bluesky, Instagram, and Mastodon.

FTC: We use in­come earn­ing auto af­fil­i­ate links. More.

/post/zig-creator-calls-spade-a-spade

raymyers.org

Zig Creator Calls Spade a Spade, Anthropic Blows Smoke

raymyers.org

I ha­rass the sea with my tiny boat and am called a pi­rate, you do it with a great fleet and are called a king.

I ha­rass the sea with my tiny boat and am called a pi­rate, you do it with a great fleet and are called a king.

Anthropic is ac­tively cam­paign­ing to end soft­ware en­gi­neer­ing. They need you to be­lieve they can do that. Well, maybe it’s not you that they need to con­vince. Maybe it’s your C-Suite, var­i­ous world lead­ers, or the man­ager of your re­tire­ment fund. They’ve raised $132 bil­lion in in­vest­ment, and are ap­proach­ing an IPO val­ued over $1 tril­lion. Since they can­not show prof­itabil­ity, this de­pends on sell­ing their hy­po­thet­i­cal fu­ture im­pact.

In lit­er­ary terms, Anthropic is an un­re­li­able nar­ra­tor.

One of their key nar­ra­tives is: Coding is go­ing away, then the rest of soft­ware en­gi­neer­ing, and even­tu­ally most other hu­man la­bor. This kind of money be­hind this kind of story has an im­pact, re­gard­less of how true we think the story is.

People will make ar­chi­tec­ture, prod­uct, and staffing de­ci­sions based on these events. Many of those de­ci­sions will be based on fear - fear of lay­offs, rap­ture-esk warn­ings of be­ing Left Behind”, Doom Trolling, etc…

To make good de­ci­sions we need to think clearly, which is hard right now. Put on your skep­ti­cal hat.

Views are my own. I have no his­tory with Zig. I’ve never spo­ken to Andrew Kelley, but found his re­cent JetBrains in­ter­view a great watch.

My in­ter­est here is in pub­lic lit­er­acy about AI in soft­ware. That’s been my ca­reer fo­cus now for 3 years, along with im­prov­ing the tech­nol­ogy it­self. During half of that time I was Chief Architect of a cod­ing agent startup - both a cus­tomer of Anthropic’s mod­els and com­peti­tor to their agent Claude Code. My cur­rent pro­ject is The Coding Agency.

So where were we?

This week, Anthropic / Bun put out their ex­pla­na­tion of the de­ci­sion to port Bun from Zig to Rust. This ex­pla­na­tion came two months af­ter merg­ing the mi­gra­tion to the main­line. Explaining the di­rec­tion be­fore­hand would have been more tra­di­tional in an in­fra­struc­ture pro­ject like this, but mean­while the de­lay con­ve­niently al­lowed the story to be car­ried by sexy head­lines like The Register’s Anthropic’s Bun Rust rewrite merged at speed of AI. Much in­vest. Very wow.

Zig’s cre­ator Andrew Kelley has now put out a re­sponse with his own thoughts. It’s blunt, to an un­usual de­gree. That has ques­tion­able op­tics. As a gen­eral rule, you would not want to worry that when you switch pro­gram­ming lan­guages you will wake up the next morn­ing to the old lan­guage’s leader un­load­ing on your per­sonal flaws. As Dax hi­lar­i­ously put it:

guys we have a pretty sub­stan­tial open­source zig code­base and i’m ter­ri­fied he’s gonna look at it

guys we have a pretty sub­stan­tial open­source zig code­base and i’m ter­ri­fied he’s gonna look at it

Still, as I read Andrew’s piece I found my­self cheer­ing out loud. I may have briefly jumped around the room. Some called his take a meltdown”, all I can say is he’s gained a new fan to­day.

Sometimes things need to be called out.

What is model be­hav­ior?

On my best days I’d as­pire to some­thing like Buddhist right speech, a high stan­dard that every­thing we say should meet all five of these cri­te­ria.

Is it true?

Is it help­ful?

Is it timely?

Is it kind?

Is it from kind­ness?

We’re break­ing deco­rum a lit­tle, stray­ing into true, but un­kind” ter­ri­tory. I’m de­fend­ing some­one’s choice to do that. I don’t do that lightly, and I hope it’s help­ful.

Background

Just to catch you up…

Bun is a TypeScript run­time, like a faster NodeJS.

Zig is a sys­tems pro­gram­ming lan­guage, like a mod­ern C.

Bun was writ­ten in Zig un­til re­cently - one of the largest Zig code­bases.

Bun claims near 100% AI con­tri­bu­tions.

Zig al­lows 0% AI con­tri­bu­tions.

Bun was ac­quired by Anthropic, a lead­ing AI model lab.

Bun’s founder ex­per­i­mented with a mas­sive agen­tic rewrite from Zig to un­safe Rust.

That ex­per­i­ment was merged days later and is now the of­fi­cial ver­sion.

This is sit­u­a­tion is con­tro­ver­sial on a few fronts, though ap­par­ently no one in­volved ac­tu­ally wants Bun to stay in Zig. The drama lives purely in the meta-dis­cus­sion. The mi­gra­tion process it­self is pretty in­ter­est­ing, I would con­sider do­ing some­thing sim­i­lar in the right sit­u­a­tion.

Who to be­lieve

When peo­ple choose be­tween Zig and Rust for their pro­jects, they will nat­u­rally see the Bun sit­u­a­tion as a data-point. That fact that one of the biggest Zig users wound up re­vers­ing the de­ci­sion feels rel­e­vant, re­gard­less of the rea­sons. People will try to un­der­stand what hap­pened, and de­cide which is more true:

Anthropic/Bun story: Bun tried every­thing rea­son­able, and was still over­whelmed by mem­ory bugs be­cause Zig was­n’t up to the task.

Anthropic/Bun story: Bun tried every­thing rea­son­able, and was still over­whelmed by mem­ory bugs be­cause Zig was­n’t up to the task.

Andrew’s story: The Bun code is a mess be­cause of their en­gi­neer­ing de­ci­sions, in­clud­ing overus­ing AI agents to write and re­view every­thing.

Andrew’s story: The Bun code is a mess be­cause of their en­gi­neer­ing de­ci­sions, in­clud­ing overus­ing AI agents to write and re­view every­thing.

I’d lean more to­ward the lat­ter, but I sus­pect the dom­i­nant fac­tor is more bor­ing:

Ray’s story: Faced with a le­git­i­mate chal­lenge of mem­ory bugs, there were sev­eral vi­able op­tions. Management ea­gerly ap­proved the Rust rewrite op­tion be­cause it was a great mar­ket­ing op­por­tu­nity to show­case their new Fable model, Anthropic al­ready uses Rust, and Zig is openly against us­ing Anthropic’s prod­ucts.

Ray’s story: Faced with a le­git­i­mate chal­lenge of mem­ory bugs, there were sev­eral vi­able op­tions. Management ea­gerly ap­proved the Rust rewrite op­tion be­cause it was a great mar­ket­ing op­por­tu­nity to show­case their new Fable model, Anthropic al­ready uses Rust, and Zig is openly against us­ing Anthropic’s prod­ucts.

That makes fine busi­ness sense, it just is­n’t a mar­ket­ing story. The mar­ket­ing needed to fo­cus on how their AI was pow­er­ful enough to do this rewrite (even though it was not pow­er­ful enough to catch a use-af­ter-free).

For bet­ter or worse, this bag­gage is now top-of-mind in the Rust vs Zig ques­tion. The sit­u­a­tion tends to pit Jarred’s judge­ment against Andrew’s in the eye’s of the com­mu­nity. Any face-sav­ing ex­ag­ger­a­tion spo­ken through Anthropic’s mega­phone could un­in­ten­tion­ally af­fect Zig’s rep­u­ta­tion.

I can un­der­stand why rather than leave well enough alone, Andrew would de­cide to… add some con­text.

Is this a smear?

From my per­spec­tive, Anthropic is the party we need to hold ac­count­able here. That’s what this is all about. Bun founder Jarred Sumner is get­ting caught in the cross­fire in a sense. So is Zig.

It would be nice if this could be dis­cussed strictly on the tech­ni­cal points, and we’ll get to them. However, I don’t think Anthropic is mak­ing a tech­ni­cal ar­gu­ment, they are deal­ing in spec­ta­cle.

Anthropic is us­ing Jarred’s cred­i­bil­ity to help sell their nar­ra­tive. In re­spond­ing to that, we’re com­ment­ing on his cred­i­bil­ity. That’s messy. I don’t love it.

Still, if re­port­ing the things that some­one says and does comes off as a smear, then maybe that be­hav­ior was part of the prob­lem too.

The meat grinder

My first im­pres­sion of the Bun pro­ject was the 2022 an­nounce­ment, in­clud­ing this warn­ing to re­cruits.

Oven is go­ing to be a grind, es­pe­cially the first nine months or so. If work-life bal­ance means a lot of time spent not work­ing, it’s prob­a­bly not a good fit.

Oven is go­ing to be a grind, es­pe­cially the first nine months or so. If work-life bal­ance means a lot of time spent not work­ing, it’s prob­a­bly not a good fit.

When I see a state­ment like that from a prospec­tive man­ager, it says a num­ber of things, not the least of which is this per­son has no idea what they are do­ing”. A lot of rea­son­ably good coders have never seen an ex­am­ple of a good man­ager, and have all kinds of weird ideas about what man­age­ment is.

Running at crunch time” all the time is bad for health and bad for pro­duc­tiv­ity. That is a ro­bustly es­tab­lished fact about knowl­edge work. For some ref­er­ences, see the Human Factors sec­tion of Hillel’s Empirical Software Engineering.

My ad­vice? Don’t work for peo­ple that brag about 90 hour weeks. Work for peo­ple who will de­fend your abil­ity to sleep at night.

In Andrew’s piece, he sum­ma­rizes what he’s heard from the grapevine of the Bun team’s ex­pe­ri­ence:

Poor com­mu­ni­ca­tion, un­re­al­is­tic ex­pec­ta­tions, low em­pa­thy, no ex­pe­ri­ence. Just a to­tal shit show

Poor com­mu­ni­ca­tion, un­re­al­is­tic ex­pec­ta­tions, low em­pa­thy, no ex­pe­ri­ence. Just a to­tal shit show

I mean… of course it was. The hearsay is es­sen­tially re­peat­ing what was an­nounced pub­licly. Their job list­ing might as well have said, now seek­ing ap­pli­cants for to­tal shit show”. It’s bad form for us to say this out loud. We’re sup­posed to let the Tech Bros go on about how cut­ting cor­ners is some ge­nius pro­duc­tiv­ity hack. Then the peo­ple that lis­ten to them can even­tu­ally call us in to fix the re­sults. It would be a great arrange­ment if I cared less about out­comes. It’s quite lu­cra­tive.

FWIW, I’ve used Bun a few times and liked it well enough. Cool tech is of­ten pro­duced in spite of bad work en­vi­ron­ments. I’m not the one say­ing that their en­vi­ron­ment re­sulted in a buggy un­main­tain­able mess, Bun is the one say­ing that.

Say some­thing nice

The piece about the mi­gra­tion process is very cool, with de­tails that are reusable. No com­plaints, I think that’s the real con­tri­bu­tion here. I par­tic­u­larly like the hon­esty in ex­plain­ing that this was a port to un­safe Rust, al­low­ing a lit­eral file-by-file mi­gra­tion to min­i­mize risk, paving the way for re­design in fu­ture steps. That’s a sen­si­ble move ex­plained well.

There’s some truth to the idea that lan­guage choice is be­com­ing more re­versible. This method will take it’s place among other types of rewrite au­toma­tion with pros and cons. These tech­niques can be com­bined and fur­ther hard­ened with Formal Methods. Darpa’s TRACTOR (Translating All C to Rust) re­search pro­gram pub­lished a re­port this year which should cover the state of the art.

My fa­vorite book on soft­ware mod­ern­iza­tion pro­jects is Kill It With Fire by Marianne Bellotti. As agents al­low us more moves we can make with old code, we still need good judge­ment and com­mu­ni­ca­tion in de­cid­ing where to go. Let’s talk about that next.

The rewrite ra­tio­nale is fluff

These are the ba­sic in­gre­di­ents of ex­plain­ing a tech­ni­cal de­ci­sion:

What is the mo­ti­va­tion?

What op­tions did you con­sider?

What are the pros and cons?

Here’s a great ex­am­ple by Richard Feldman on his de­ci­sion to move the Roc com­piler from Rust to Zig. I was ini­tially shocked by that move (I’m some­what fa­nat­i­cal about lan­guage safety), but ul­ti­mately his points made sense and this started my cu­rios­ity about Zig.

When the Bun rewrite was merged, I’d hoped to see a sim­i­lar treat­ment. This is what we got in­stead, two months late.

✅ What is the mo­ti­va­tion?

⚠️ What op­tions did you con­sider?

🚫 What are the pros and cons?

For the as­pir­ing tech leads out there: When you skimp on these in­gre­di­ents, es­pe­cially the pros and cons”, you risk giv­ing the im­pres­sion that you ap­proached the prob­lem with one an­swer al­ready in mind and are giv­ing it a post-hoc jus­ti­fi­ca­tion. Maybe you have rea­sons that you aren’t say­ing.

It feels dis­hon­est.

All pros no cons

Rather than a real trade­off com­par­i­son, we get a Bun is bet­ter in Rust” sec­tion cov­er­ing only up­sides. A change like this al­ways has trade-offs, an ob­vi­ous one would be build time.

Typically when you use Rust for a large code­base, you are buy­ing safety and pay­ing in slower com­pi­la­tion. There’s no shame in that, it can be a win­ning bar­gain. In that past, this fac­tor was im­por­tant enough to Bun that they forked the Zig com­piler to try and im­prove it. If we’re right that the Rust port in­creased build time for con­trib­u­tors, why not dis­close that? It comes off as more cred­i­ble to own the im­pact and the pri­or­i­ties that make it right move over­all.

They also seem to be padding the list by mix­ing in other im­prove­ments they’ve made af­ter the rewrite that aren’t re­ally re­lated to it.

They did­n’t try a style guide?

Recall that the mo­ti­va­tion was mem­ory bugs. Definitely not Bun’s only source of bugs but a fre­quent one, caus­ing four fix com­mits per week by my count. Painful.

Theoretically, every mem­ory bug rep­re­sents a vi­o­la­tion of some con­ven­tion - an ex­pec­ta­tion of how this kind of ob­ject should be dealt with. Therefore it be­hooves us to es­tab­lish a clear idea of what’s ex­pected in what cir­cum­stance. We should try to use any lan­guage ef­fec­tively for that mat­ter, Rust style guides are a thing too, but man­ual mem­ory man­age­ment adds scope to the ex­pec­ta­tions we need.

How have other peo­ple solved this prob­lem? Another flag­ship Zig code­base is TigerBeetle, a fi­nan­cial trans­ac­tion data­base. It is not plagued by mem­ory bugs, in fact it ap­pears to be one of the most re­li­able data­bases in ex­is­tence. They will gladly tell you that this is due to their TigerStyle ap­proach and some in­no­v­a­tive test­ing strate­gies. Worth a look! The word style” might un­der­sell it, it’s a whole en­gi­neer­ing phi­los­o­phy with Zig cod­ing guide­lines as one el­e­ment.

Here’s a taste of TigerStyle. Not every ap­pli­ca­tion can copy-and-paste this ex­act strat­egy, but it il­lus­trates the re­la­tion­ship be­tween mem­ory al­lo­ca­tion and other de­sign de­ci­sions.

All mem­ory must be sta­t­i­cally al­lo­cated at startup. No mem­ory may be dy­nam­i­cally al­lo­cated (or freed and re­al­lo­cated) af­ter ini­tial­iza­tion. This avoids un­pre­dictable be­hav­ior that can sig­nif­i­cantly af­fect per­for­mance, and avoids use-af­ter-free. As a sec­ond-or­der ef­fect, it is our ex­pe­ri­ence that this also makes for more ef­fi­cient, sim­pler de­signs that are more per­for­mant and eas­ier to main­tain and rea­son about, com­pared to de­signs that do not con­sider all pos­si­ble mem­ory us­age pat­terns up­front as part of the de­sign.

All mem­ory must be sta­t­i­cally al­lo­cated at startup. No mem­ory may be dy­nam­i­cally al­lo­cated (or freed and re­al­lo­cated) af­ter ini­tial­iza­tion. This avoids un­pre­dictable be­hav­ior that can sig­nif­i­cantly af­fect per­for­mance, and avoids use-af­ter-free. As a sec­ond-or­der ef­fect, it is our ex­pe­ri­ence that this also makes for more ef­fi­cient, sim­pler de­signs that are more per­for­mant and eas­ier to main­tain and rea­son about, com­pared to de­signs that do not con­sider all pos­si­ble mem­ory us­age pat­terns up­front as part of the de­sign.

Clearly, if we’re weigh­ing a rewrite in Rust, we’d first con­sider if we should use the cur­rent lan­guage dif­fer­ently. Hear’s how Bun’s write-up pre­sents that op­tion.

Many pro­jects opt to an­swer these kinds of ques­tions through a style guide. TigerBeetle’s TigerStyle is an ex­am­ple in Zig and Google’s 31,000 word C++ style guide is an­other. The chal­lenge with style guides is en­force­ment. How do you make sure the style guide is fol­lowed? Historically, code re­view was the an­swer with best-ef­fort en­force­ment via lin­ters & sta­tic an­a­lyz­ers.

Many pro­jects opt to an­swer these kinds of ques­tions through a style guide. TigerBeetle’s TigerStyle is an ex­am­ple in Zig and Google’s 31,000 word C++ style guide is an­other. The chal­lenge with style guides is en­force­ment. How do you make sure the style guide is fol­lowed? Historically, code re­view was the an­swer with best-ef­fort en­force­ment via lin­ters & sta­tic an­a­lyz­ers.

I ex­pected the next sen­tence to dis­cuss Bun’s style guide, why it was­n’t work­ing, per­haps how it evolved over time… nope. They seem to just pay lip-ser­vice the pri­mary way the com­mu­nity ad­dresses their prob­lem, shrug their shoul­ders and move on. Did I miss some­thing? Over four years on a pro­ject of this size, it’s sur­pris­ing they did­n’t se­ri­ously at­tempt this if they ex­pe­ri­enced these prob­lems. It’s al­most like the pro­ject was run by some­one who tries to hold all the con­text in their head and never have meet­ings.

What’s more be­wil­der­ing is that they dis­miss style guides with hes­i­ta­tions that are re­futed within their own ar­ti­cle. Consider that clas­sic ob­jec­tion that guides are hard to en­force. Fair, though maybe an odd bar­rier for a team ad­vanced enough to fork the com­piler they use. Here’s the thing, they al­ready claim to have solved the en­force­ment prob­lem be­cause they use agen­tic re­view. PORTING.md is it­self a style guide, scoped to the mi­gra­tion process. They have just con­ducted an agen­tic re­view of their en­tire rewrit­ten code­base against strin­gent guide­lines and de­clared it a suc­cess.

This does­n’t make sense. Let’s as­sume agen­tic re­view works, I think it can un­der the right cir­cum­stances. That would re­quire de­sign and well-thought guide­lines. I think they were sim­ply more ex­cited about putting that men­tal en­ergy into a rewrite than a re-ar­chi­tec­ture, for any num­ber of un­stated rea­sons. It may have been the right choice.

We’re still wor­ried about syn­tax?

There’s one more bit I want to nit­pick, a com­mon cog­ni­tive dis­so­nance in dis­cus­sions about agent-first cod­ing. Bun’s piece briefly dives into to the weeds of what a style guide op­tion” might look like.

Having a rigid style guide with clear own­er­ship ex­pec­ta­tions ex­plic­itly spelled out in the type sys­tem was a real op­tion for Bun. Since Zig has no op­er­a­tor over­load­ing, we would likely end up with a lot of code look­ing some­thing like this:

openai.com

EU Parliament greenlights Chat Control 1.0 – Breyer: "Our children lose out"

www.patrick-breyer.de

Today, the European Parliament al­lowed the sus­pi­cion­less mass scan­ning of pri­vate com­mu­ni­ca­tions (“Chat Control 1.0”) to pass, a mea­sure it had re­jected twice in March. Although a ma­jor­ity of vot­ing Members of the European Parliament (MEPs) ac­tu­ally op­posed the reg­u­la­tion (314 against, 276 in fa­vor, 17 ab­sten­tions), the mo­tion to re­ject it failed to se­cure the re­quired ab­solute ma­jor­ity of 361 votes. As a re­sult, mass scan­ning is now per­mit­ted again un­til 2028.

A sym­bolic ex­emp­tion was adopted for en­crypted com­mu­ni­ca­tions—though in prac­tice, ser­vice providers do not scan these any­way. Furthermore, while a ma­jor­ity of vot­ing MEPs wanted to re­strict the scan­ning of pri­vate com­mu­ni­ca­tions strictly to sus­pects iden­ti­fied by the ju­di­ciary (322 to 255 votes), this amend­ment like­wise fell short of the re­quired ab­solute ma­jor­ity.

Dr. Patrick Breyer, civil rights ac­tivist and for­mer Member of the European Parliament (MEP), warns of the con­se­quences:

The fact that Chat Control is mov­ing for­ward against the will of the ma­jor­ity of vot­ing MEPs is a farce and dam­ages democ­racy. Our chil­dren are the real losers in this un­de­mo­c­ra­tic process. The pas­sage of a gen­uine, per­ma­nent child pro­tec­tion reg­u­la­tion is now in se­ri­ous jeop­ardy. The Council will never agree to a des­per­ately needed par­a­digm shift as long as they can sim­ply stick to the old ap­proach of sus­pi­cion­less scan­ning at the whim of the tech in­dus­try.”

Despite the leg­isla­tive de­feat, Breyer re­mains de­fi­ant re­gard­ing the up­com­ing ne­go­ti­a­tions:

Today’s vote on the in­terim reg­u­la­tion was a set­back, but the po­lit­i­cal bat­tle over the per­ma­nent Chat Control 2.0’ is just get­ting started. The re­sis­tance we saw in Parliament to­day was so strong that find­ing a ma­jor­ity for per­ma­nent, sus­pi­cion­less mass scan­ning in fu­ture ne­go­ti­a­tions is a com­plete pipe dream.”

Breyer fun­da­men­tally re­jects the mass sur­veil­lance ap­proach:

Trying to pro­tect chil­dren with sus­pi­cion­less mass sur­veil­lance is like fran­ti­cally mop­ping the floor while the faucet is still run­ning. Blanket chat con­trol is just as un­ac­cept­able as in­dis­crim­i­nately open­ing every­one’s phys­i­cal mail. For five years, this failed sys­tem has served as a smoke­screen to de­lay real ac­tion, all while over­whelm­ing the po­lice with false alarms. We need more child pro­tec­tion, not less—but we need ef­fec­tive pro­tec­tion, not the il­lu­sion of se­cu­rity.”

What hap­pens next?The in­terim reg­u­la­tion passed to­day will re­main in ef­fect un­til 2028, or un­til an agree­ment on a per­ma­nent reg­u­la­tion is reached. Negotiations for the per­ma­nent law will re­sume in September. The core dis­pute be­tween the EU Parliament, mem­ber state gov­ern­ments, and the EU Commission re­mains the scan­ning of pri­vate chats: should it be in­dis­crim­i­nate, or tar­geted at crim­i­nal sus­pects?

What changes with the re­turn of Chat Control 1.0—and what stays the same:

What is com­ing back: US tech com­pa­nies are once again al­lowed to scan pri­vate mes­sages with­out a war­rant or prior sus­pi­cion. This af­fects di­rect mes­sages on plat­forms like Instagram, Discord, Snapchat, Skype, and Xbox, as well as emails via Google’s Gmail and Apple’s iCloud.

What re­mains un­changed: Public so­cial me­dia posts and files hosted in cloud stor­age could al­ready be scanned with­out this law. Furthermore, pri­vate mes­sages can al­ways be re­ported by users, or mon­i­tored by au­thor­i­ties us­ing tar­geted, court-or­dered wire­tap­ping.

What is still NOT be­ing scanned: End-to-end en­crypted chats, such as those on WhatsApp, have al­ways been ex­empt from these scans. Additionally, European providers of mes­sag­ing and email ser­vices have never im­ple­mented chat con­trol mea­sures.

Why Chat Control is the wrong ap­proach:

Since 2022, the vol­ume of sus­pected abuse re­ports from the US has al­ready dropped by 50 per­cent due to the grow­ing use of mes­sage en­cryp­tion.

According to EU Commission fig­ures, mass scan­ning of pri­vate chats ac­counted for only 36 per­cent of all abuse re­ports in 2024 (the ma­jor­ity came from pub­lic posts and cloud stor­age).

The German Federal Criminal Police Office (BKA) re­ports that 48 per­cent of all in­com­ing alerts are not crim­i­nally rel­e­vant in the first place.

Crime sta­tis­tics re­veal that 40 per­cent of the re­sult­ing in­ves­ti­ga­tions ac­tu­ally tar­get mi­nors them­selves.

Under the chat con­trol sys­tem, an es­ti­mated 99 per­cent of re­ports gen­er­ated by Meta con­sist of pre­vi­ously known ma­te­r­ial, which gen­er­ally does lit­tle to stop on­go­ing, ac­tive abuse.

The EU Commission ad­mits there is no ev­i­dence that sus­pi­cion­less scan­ning of pri­vate com­mu­ni­ca­tions has led to an in­crease in crim­i­nal con­vic­tions or in res­cued chil­dren.

Talk of avert­ing a protection gap” is there­fore highly mis­lead­ing. The most ef­fec­tive law en­force­ment tools—court-or­dered wire­taps, user re­ports, and the scan­ning of pub­lic plat­forms and cloud stor­age—were never at risk and re­main fully in­tact. The only prac­tice that was tem­porar­ily banned since April was the in­dis­crim­i­nate, war­rant­less search­ing of pri­vate, un­en­crypted mes­sages of in­no­cent peo­ple on a hand­ful of US plat­forms.

Background: The dead­lock over a per­ma­nent so­lu­tionIn par­al­lel, ne­go­ti­a­tions are on­go­ing for a per­ma­nent reg­u­la­tion to pro­tect chil­dren from sex­u­al­ized on­line vi­o­lence (the CSAM Regulation” or Chat Control 2.0”). In these talks, the EU Parliament is push­ing for a par­a­digm shift in how we ap­proach on­line child safety, de­mand­ing:

Mandatory, tar­geted de­tec­tion or­ders against ac­tual crim­i­nal sus­pects, rather than blan­ket mass scan­ning left to the tech in­dus­try’s dis­cre­tion.

An EU Child Protection Centre tasked with the sys­tem­atic re­moval of known abuse ma­te­r­ial from the pub­lic in­ter­net.

Strict se­cu­rity stan­dards for mes­sag­ing apps (“Security by Design”) to pre­vent cy­ber groom­ing.

This per­ma­nent leg­is­la­tion has stalled be­cause EU mem­ber states in­sist on main­tain­ing the out­dated ap­proach of vol­un­tary, sus­pi­cion­less scan­ning of pri­vate com­mu­ni­ca­tions. Critics warn that re­peat­edly ex­tend­ing the in­terim rules re­moves the po­lit­i­cal pres­sure needed to reach a vi­able, per­ma­nent agree­ment. Ultimately, cling­ing to the sta­tus quo threat­ens to de­rail real progress on child pro­tec­tion.

Patrick Breyer sums up the prob­lem:“As long as EU gov­ern­ments can use pro­ce­dural loop­holes to con­tin­u­ally ex­tend their com­fort­able sta­tus quo of vol­un­tary, in­dis­crim­i­nate mass scan­ning, they have zero in­cen­tive to en­gage with the Parliament’s tar­geted, legally sound, and far more ef­fec­tive child pro­tec­tion strat­egy.

The Voices of Survivors: We need pri­vacy to bring abusers to jus­tice”

Survivors of sex­ual vi­o­lence ex­plic­itly em­pha­size that un­tar­geted Chat Control did not help vic­tims:

Alexander Hanff, sur­vivor of child sex­ual abuse and pri­vacy ad­vo­cate, clar­i­fies:“As a sur­vivor I re­lied on con­fi­den­tial com­mu­ni­ca­tions to tell my story and find jus­tice for 28 school­boys—my­self in­cluded—re­sult­ing in the con­vic­tion of mul­ti­ple of­fend­ers. We sur­vivors need pri­vacy, be­cause with­out it we lose our voice. Chat Control was not cre­ated to pro­tect chil­dren. It was about Big Tech com­pa­nies like Meta or Google want­ing ac­cess to our data for prof­i­teer­ing, and states at­tempt­ing to ex­pand mass sur­veil­lance. The EU Commission has wasted five years and mil­lions of eu­ros on al­go­rithms that can­not pro­tect chil­dren and were never meant to. This money should have been di­verted to real polic­ing, causal re­search, and sup­port for sur­vivors, mil­lions of whom have never re­ceived any sup­port at all.”

Marcel Schneider* (name changed), a sur­vivor who has been su­ing Meta in court over its vol­un­tary Chat Control, adds:“Any­one mourn­ing the end of Chat Control has not un­der­stood what ac­tu­ally helps sur­vivors of sex­ual vi­o­lence. Mass sur­veil­lance by cor­po­ra­tions like Meta does not pre­vent abuse. Genuine pro­tec­tion means: delet­ing ma­te­r­ial at the source, proac­tive po­lice work on the Darknet, and apps that are safe by de­sign for chil­dren from the very start.”

Dorothée Hahne, found­ing mem­ber and vice-chair of the sur­vivors’ ini­tia­tive MOGiS e.V. (A Voice for Survivors), em­pha­sizes the dan­ger mass sur­veil­lance poses to vic­tims them­selves:“As sur­vivors, we see our safe spaces’, our pro­tected ar­eas and com­mu­ni­ca­tion chan­nels, en­dan­gered or de­stroyed by this. For sur­vivors, this need is ex­is­ten­tial.“

FTC secures right to repair settlement with farming equipment giant John Deere | AP News

apnews.com

It looks like John Deere own­ers can soon feel free to fix their own ma­chines.

The Federal Trade Commission and at­tor­neys gen­eral from sev­eral states se­cured a right-to-re­pair set­tle­ment Wednesday with agri­cul­ture equip­ment gi­ant Deere & Co. — com­monly known as John Deere — that re­quires the com­pany to let farm­ers and in­de­pen­dent shops fix their own equip­ment.

The Illinois-based man­u­fac­turer has faced com­plaints for years for with­hold­ing the soft­ware needed for re­pairs and forc­ing cus­tomers to use au­tho­rized deal­ers in­stead of in­de­pen­dent ones.

This marks the sec­ond right-to-re­pair set­tle­ment Deere has reached this year, fol­low­ing a sep­a­rate $99 mil­lion class-ac­tion set­tle­ment with farm­ers in April. Though the class-ac­tion com­pen­sated con­sumers, the FTCs set­tle­ment in­stead re­quires Deere to make its re­pair ser­vices avail­able to equip­ment own­ers and in­de­pen­dent shops.

The FTC and at­tor­neys gen­eral from Arizona, Illinois, Michigan, Minnesota and Wisconsin brought the an­titrust law­suit in January 2025, ar­gu­ing that Deere had il­le­gally re­stricted farm­ers and in­de­pen­dent shops that might oth­er­wise ser­vice them from re­pair­ing farm equip­ment such as trac­tors. Deere also makes en­gines and equip­ment for forestry, land­scap­ing and con­struc­tion.

Under the or­der filed in Illinois, Deere will now be re­quired to make di­ag­nos­tic and re­pair tools avail­able to equip­ment own­ers and in­de­pen­dent re­pair shops, not only its own net­work of au­tho­rized deal­ers. It also pre­vents Deere deal­ers from re­tal­i­at­ing against equip­ment own­ers or re­pair shops who choose to fix their own equip­ment in­stead of pay­ing for Deere’s ser­vices. The or­der is headed to Judge Iain D. Johnston for his ap­proval.

For too long, Arizona farm­ers and in­de­pen­dent me­chan­ics have been at the mercy of Deere’s mo­nop­oly over re­pair tools, forced to wait — and pay — for au­tho­rized deal­ers just to fix bro­ken trac­tors and other equip­ment,” Arizona Attorney General Kris Mayes said in a state­ment Wednesday.

Deere must pay $1 mil­lion col­lec­tively to the five states for an­titrust en­force­ment costs and will be sub­ject to strict com­pli­ance over­sight for the next 10 years.

In the com­plaint, the FTC ar­gued that Deere pro­vides a ser­vice soft­ware tool to au­tho­rized deal­ers but does not pro­vide the full ver­sion to equip­ment own­ers or in­de­pen­dent shops. Deere had said the law­suit was base­less, de­nied that its dis­tri­b­u­tion of ser­vice tools was an­ti­com­pet­i­tive and ar­gued that it could not mo­nop­o­lize ser­vices since it does not di­rectly pro­vide them.

Sign up for Morning Wire: Our flag­ship newslet­ter breaks down the biggest head­lines of the day.

Deere main­tained its com­mit­ment to in­de­pen­dent re­pair in a state­ment Wednesday, adding that the agree­ment with the FTC re­in­forces its in­no­va­tion of more flex­i­ble re­pair op­tions.

This is good news for our cus­tomers and for the fu­ture of how Deere equip­ment is sup­ported,” said Denver Caldwell, vice pres­i­dent of af­ter­mar­ket and cus­tomer sup­port.

Right-to-repair has be­come an in­creas­ingly com­mon is­sue over the years, es­pe­cially for tech prod­ucts, with con­sumers com­plain­ing that even sim­ple re­pairs can only be done by com­pany-au­tho­rized deal­ers.

18 Words - Daily Word Challenge

18words.com

Thanks for play­ing! You can send me feed­back or try my other game Zanagrams.

Jurassic Park computers in excruciating detail

fabiensanglard.net

Jul 13, 2026

After I men­tioned a Jurassic Park anec­dote the other day, I watched the movie again. I must have seen it at least ten times now. This time, I re­searched every com­puter/​soft­ware I spot­ted.

EDIT: Just when I was putting the fi­nal touches on this ar­ti­cle, I read the sad news that Sam Neill, who played pa­le­on­tol­o­gist Alan Grant in JP, has passed away to­day. R.I.P Sam.

Surprisingly, the first com­puter vis­i­ble is not on the is­land Isla Nublar but in Alan Grant and Ellie Sattler’s mo­bile trailer. It is an Apple Powerbook 100, vis­i­ble in the im­age be­low on the left side.

It had a Motorola 68000 proces­sor at 16 MHz, 2 – 8 megabytes (MB) of RAM, a 9-inch (23 cm) mono­chrome back­lit liq­uid-crys­tal dis­play (LCD) with 640 × 400 pixel res­o­lu­tion, and the System 7.0.1 op­er­at­ing sys­tem. Wikipedia

This ma­chine’s specs re­minds me of how aw­ful 90s lap­top screens, based on a pas­sive ma­trix, were. Definitely some­thing I don’t miss from that era.

All com­put­ers and soft­ware are lo­cated in the Control Room on the desks of two en­gi­neers, Dennis Nedry and Ray Arnold.

Dennis Nedry’s desk is an in­de­scrib­able mess with three ma­chines (two macs, one SGI), three mon­i­tors, one PDA, and stor­age de­vices.

Ray Arnold’s desk is much ti­dier. It fea­tures a CCTV screen, stor­age de­vices, two com­put­ers (a Mac and a SGI), and two mon­i­tors.

In the back of the Control Room, we can make out a gi­ant screen and a su­per­com­puter with tall pan­els and blink­ing red lights.

The book The Making Of Jurassic Park has in­ter­est­ing de­tails about how they de­signed the Control Room.

Everything in the set was real. We could­n’t fake any of it, be­cause au­di­ences are so so­phis­ti­cated now in their knowl­edge of com­put­ers. All told, $875,000 worth of com­puter hard­ware loaned by Silicon Graphics, $350,000 worth from Apple and some $500,000 in ad­di­tional hard­ware and soft­ware went into equip­ping both the set and off-stage con­trol room. Cory Faucher (Special Effects Coordinator)

This means, ad­justed for in­fla­tion, Apple and SGI loaned roughly $4,000,000 of 2026 dol­lars for the pro­duc­tion of Jurassic Park.

Ray Arnold’s work­sta­tion is a SGI R4000 Indigo. It is barely vis­i­ble in two shots. Blink and you will miss it at 54:48.

We get a some­what bet­ter view of it to­wards the end of the movie thanks to a Velociraptor that never skips leg-day.

For the needs of the movie, that SGIs came in handy to run real-time 3D an­i­ma­tion of the Hurricane. Or did they?

A dy­namic and in­ter­ac­tive method was em­ployed to cre­ate the graph­ics, both on the big screen and on the com­puter mon­i­tors at each in­di­vid­ual sta­tion. A makeshift room was built ad­ja­cent to the set, then equipped with a bat­tery of Silicon Graphics and Apple Macintosh com­puter sys­tems. Stored on com­puter disks were an­i­ma­tions gen­er­ated over a pe­riod of six months by a four-man com­puter graph­ics team headed by Michael Backes.

Responding to cues re­ceived via ra­dio from the set, Backes and his team were able to feed their graph­ics di­rectly to the ap­pro­pri­ate mon­i­tors on stage, mak­ing it seem as though the ac­tors in­volved were ac­tu­ally call­ing up the im­agery. The Making Of Jurassic Park

A dy­namic and in­ter­ac­tive method was em­ployed to cre­ate the graph­ics, both on the big screen and on the com­puter mon­i­tors at each in­di­vid­ual sta­tion. A makeshift room was built ad­ja­cent to the set, then equipped with a bat­tery of Silicon Graphics and Apple Macintosh com­puter sys­tems. Stored on com­puter disks were an­i­ma­tions gen­er­ated over a pe­riod of six months by a four-man com­puter graph­ics team headed by Michael Backes.

Responding to cues re­ceived via ra­dio from the set, Backes and his team were able to feed their graph­ics di­rectly to the ap­pro­pri­ate mon­i­tors on stage, mak­ing it seem as though the ac­tors in­volved were ac­tu­ally call­ing up the im­agery.

Dennis Nedry’s pow­er­house work­sta­tion is an SGI IRIS Crimson. It is such a beast that it won’t fit on his desk. It is on the floor on the right of his desk (red box).

Most of the time it is used to dis­play a 3D chess game (monitor the right end of Dennis desk).

The SGI Crimson is rarely vis­i­ble on screen. It is briefly vis­i­ble af­ter Dennis’s white rab­bit” lock­down brings Samuel Jackson into a de­pres­sion.

The SGI Crimson was a very pow­er­ful work­sta­tion re­leased in 1992. Its main ap­peal was its panel of real-time 3D graph­ics cards. The CPU was also very pow­er­ful with hard­ware Floating-Point Unit, a lux­ury for 3D graph­ics.

One MIPS 100 MHz R4000 or 150 MHz R4400 proces­sor Choice of seven high-per­for­mance 3D graph­ics sub­sys­tems (Entry, XS, XS24, Elan, Extreme, Reality Engine, VGXT) Up to 256 MB mem­ory and in­ter­nal disk ca­pac­ity of up to 7.2 GB, ex­pand­able to more than 72 GB us­ing ad­di­tional en­clo­sures I/O sub­sys­tem in­cludes four VMEbus ex­pan­sion slots, Ethernet and two SCSI chan­nels with disk strip­ing sup­port

Wikipedia

One MIPS 100 MHz R4000 or 150 MHz R4400 proces­sor

Choice of seven high-per­for­mance 3D graph­ics sub­sys­tems (Entry, XS, XS24, Elan, Extreme, Reality Engine, VGXT)

Up to 256 MB mem­ory and in­ter­nal disk ca­pac­ity of up to 7.2 GB, ex­pand­able to more than 72 GB us­ing ad­di­tional en­clo­sures

I/O sub­sys­tem in­cludes four VMEbus ex­pan­sion slots, Ethernet and two SCSI chan­nels with disk strip­ing sup­port

Both Dennis and Ray use PLI Mini Arrays for their backup. Dennis has an im­pres­sive stack of five on the left-end of his desk.

There is a con­ti­nu­ity er­ror in the movie. See how the stack of PLI is fac­ing left in this early shot.

Later in the movie, af­ter Ray takes over Dennis’s desk, we can see the PLIs have mag­i­cally ro­tated to face the de­vel­oper.

On Ray’s desk we also find a smaller stack of two PLIs.

There is a close-up shot when John Hammond fol­lows the jeeps’ progress on the CCTV.

Despite the at­ten­tion to de­tail, it seems the PLIs were not con­nected since the LEDs are all blank. In Macs Place of Spring 1993 we can find an ad on page 38 giv­ing more de­tails about the ca­pac­ity.

Since John Hammond spared no ex­pense”, it is fair to say he picked 1GiB ver­sion at $3,598 a piece. That would give them 7 GiB of stor­age for a 2026 equiv­a­lent of $33,223.70. In 2026, 7 GiB of HDD would cost $0.49.

Seven GiB was a MASSIVE amount in 1993 when a high-end PC would come with 120 MiB HDD.

The Motorola Envoy is a per­sonal dig­i­tal as­sis­tant used by Dennis. It is vis­i­ble next to his right el­bow in the im­age be­low.

It is an ex­tremely im­pres­sive de­vice for the early 90s. It is a fold­able that fea­tures an an­tenna when de­ployed (video).

The hard­ware of the Motorola Envoy in­cluded a Motorola Dragon I/68349 mi­cro­proces­sor, 4 MB of read only mem­ory (ROM), 1 MB of ran­dom ac­cess mem­ory (RAM), and an LCD. Of par­tic­u­lar in­ter­est were the wire­less com­mu­ni­ca­tions ca­pa­bil­i­ties of the Envoy. Its built-in com­mu­ni­ca­tion com­po­nents in­cluded a ra­dio mo­dem ca­pa­ble of 4,800 bits per sec­ond com­mu­ni­ca­tion, a fax and data mo­dem, and an in­frared trans­ceiver ca­pa­ble of 38.4 kbit/​s of data trans­fer. Wikipedia

The hard­ware of the Motorola Envoy in­cluded a Motorola Dragon I/68349 mi­cro­proces­sor, 4 MB of read only mem­ory (ROM), 1 MB of ran­dom ac­cess mem­ory (RAM), and an LCD. Of par­tic­u­lar in­ter­est were the wire­less com­mu­ni­ca­tions ca­pa­bil­i­ties of the Envoy. Its built-in com­mu­ni­ca­tion com­po­nents in­cluded a ra­dio mo­dem ca­pa­ble of 4,800 bits per sec­ond com­mu­ni­ca­tion, a fax and data mo­dem, and an in­frared trans­ceiver ca­pa­ble of 38.4 kbit/​s of data trans­fer.

Dennis must have used it since we see it moved and par­tially un­folded later in the movie.

It is un­clear how Jurassic Park crew got their hands on a Motorola Envoy. The movie was shot from August to November 1992. Motorola only fin­ished the PDA in mid-1994 but de­layed re­leas­ing it to February 1995[1].

EDIT : Hackernews user kalle­boo solved the mys­tery!

The head of frogde­sign (Hartmut Esslinger) ended up run­ning into Spielberg on a plane and showed it to him. The one in the movie is an orig­i­nal mockup

(source and

dis­cus­sion). kalle­boo

The su­per­com­puter of the con­trol room looks a lot like five Thinking Machines CM-5 with there char­ac­ter­is­tic front panel with thou­sands of red blink­ing LEDs. With a pric­etag of only” $46,000 per ma­chine, it is very pos­si­ble these were au­then­tic.

The CM-5, Connection Machine”, was re­leased in 1991[2]. In 1993 it was still con­sid­ered the most pow­er­ful com­puter in the world[3]. Each ma­chine was called a node”, fea­tur­ing a Sparc CPU, four vec­tor units, and 32 MiB RAM. As many nodes as needed could be con­nected to­gether to form a mesh. The National Center for Atmospheric Research (NCAR) build a 32-node su­per­com­puter with CM-5[4].

Does the red LED pat­tern in the front panel mean any­thing? Absolutely not, they were ran­domly gen­er­ated[5].

If you lis­ten care­fully you can ac­tu­ally hear Dennis Nedry talk about the CM-5, Connection Machine”.

I am to­tally un­ap­pre­ci­ated in my time. You can run this whole park from this room with min­i­mal staff for up to 3 days. You think that kind of au­toma­tion is easy? Or cheap? You know any­body who can net­work 8 con­nec­tion ma­chines and de­bug 2 mil­lion lines of code for what I bid for this job? Because if he can I’d like to see him try. Dennis Nedry

After the pub­li­ca­tion of this ar­ti­cle, user pivo (from hack­ernews) was able to ex­plain why the movie fea­tured CM-5 while the novel fea­tured Cray su­per­com­puter.

My wife worked for Thinking Machines back then. I re­mem­ber that they’d asked Cray to loan them a su­per­com­puter for the film be­cause that’s the com­puter used in the book. Cray brushed them off, so they turned to Thinking Machines who were happy to do it.

To thank them, the pro­duc­ers rented a the­ater in Cambridge, MA [Kendall Sq. cin­ema] to screen the film just for Thinking Machines and I was also able to at­tend. By far the biggest re­ac­tions from the au­di­ence that night were when the CM-5 was shown for the first time and then when the young ac­tress says, It’s a Unix sys­tem. I know this” pivo (from hack­ernews)

My wife worked for Thinking Machines back then. I re­mem­ber that they’d asked Cray to loan them a su­per­com­puter for the film be­cause that’s the com­puter used in the book. Cray brushed them off, so they turned to Thinking Machines who were happy to do it.

To thank them, the pro­duc­ers rented a the­ater in Cambridge, MA [Kendall Sq. cin­ema] to screen the film just for Thinking Machines and I was also able to at­tend. By far the biggest re­ac­tions from the au­di­ence that night were when the CM-5 was shown for the first time and then when the young ac­tress says, It’s a Unix sys­tem. I know this”

One of the very best mon­i­tors money could buy in 1993 was the SuperMatch 20-T. The twenty means 20″ and T meant Trinitron. The SuperMatch was fea­tured on the cover of MacUser in Feb 92. In MacUser of Oct 94, page 180 (out of 252!!), we can see it cost $2,589 ($6,000 in 2026).

20″ mon­i­tors were con­sid­ered ab­solutely mas­sive in 1993 and only seen in pro­fes­sional work­spaces. A typ­i­cal PC would come with a 15″ CRT. 21″ is al­most the max­i­mum CRTs reached, their depth and weight made them very hard to move. They were re­placed by LCD around 2005.

A lot of at­ten­tion was paid to avoid show­ing CRT re­fresh ar­ti­fact in the movie. SuperMatch had en­gi­neer on-site and pro­duc­tion had peo­ple ded­i­cated to sync­ing CRT fram­er­ate with film rate.

My un­cle (John Monsour) worked on this movie as the 24 Frame Computer Sync Engineer”. Because film cam­eras and CRT mon­i­tors have dif­fer­ent frame rates, you needed to use spe­cial­ized elec­tron­ics to syn­chro­nize them with the cam­era frame rate oth­er­wise you would have band­ing and weird mov­ing ar­ti­facts on all the screens. It’s crazy to imag­ine need­ing to do this for all the screens vis­i­ble in these shots. am­c­col­lum

The mon­i­tor fea­tures a par­tic­u­lar chin”. The ab­solutely gor­geous SGI Hardware Developer Handbook, on page 4 – 59, re­veals this is a 19″ Mitsubishi HL7965 Monitor which SGI re­branded. It likely cost as much as the SuperMatch 20-T.

On Ray Arnold’s desk, we can no­tice a weird key­board with a con­nec­tor on the side. This is a SGI Granite Keyboard (Indigo Style)[6]. It is a pretty cool key­board with two 6 Pin Mini-DIN con­nec­tors[7] on each side. The key­board can be con­nected to the work­sta­tion from ei­ther side and the mouse is to be daisy-chained into the other port.

Ray is seen us­ing the same key­board later. If you look closely at the screen, it looks like sta­tus net­work was aliased to ping CLI.

Dennis Nedry uses two Macintosh Quadra 700. Apple must have been very happy with the prod­uct place­ment. Although they usu­ally re­quire their com­put­ers not to be used for ne­far­i­ous ac­tiv­ity which is not the case here.

Released in 1991, The Quadra 700 ran on Motorola 68040 @ 25 MHz with 4 MB RAM, ex­pand­able to 68 MB. HDD sizes avail­able were 80 and 160 MB. Ray also uses a Macintosh Quadra 700 but he has only one on his desk.

Dennis ne­go­ti­ates with his co-con­spir­a­tor lo­cated in the har­bor to give him time to make it there. It hap­pens via a VC on the Mac. Why not on a SGI? Because the whole thing was faked via Quicktime Video player run­ning on System 7.

The cur­sor on the progress bar is clearly vis­i­ble. This is 1-minute clip. Even the mouse cur­sor is still on the play” but­ton of the Quicktime win­dow.

Notice the video folder, named VIDnet.

Quicktime is used ear­lier in the movie. When Dennis is re­vealed to be work­ing at Jurassic Park, he had Jaws played on his left screen[8].

IRIX System Usage util­ity, named gr_os­view can be seen a few times. It looks like a pow­er­ful tool, able to re­port not only user time, sys time, but also in­ter­rupt over­head and even gfx over­head ac­cord­ing to IRIX - Desktop User’s Guide on p182.

Despite re­ports that mon­i­tors screens were faked via re­mote op­er­a­tors, gr_os­view seems to re­act ap­pro­pri­ately to key­strokes in the se­quence above. Maybe this one was ac­tu­ally live.

When Ray ac­ci­den­tally locks down the whole sys­tem, Nedry’s face su­per­im­posed onto an Elvis Presley jump­suit shows up on his Macintosh. That is the UI of the White Rabbit”, which Ray Arnold briefly men­tions when he ex­plains the lock­down to Ellie Sattler White rab­bit ob­ject. Whatever it did, it did it all. But with the key-checks off, the com­puter did­n’t file the key­strokes.”. It is only in the novel that the pro­gram file­name is re­vealed, whte_rbt.obj. Michael Crichton, the au­thor of Jurassic Park, was ac­tu­ally a highly ca­pa­ble pro­gram­mer.

The leg­endary It’s a Unix sys­tem. I know this” se­quence was done us­ing an ex­per­i­men­tal SGI file ex­plorer ap­pli­ca­tion named fsn. Lex Murphy takes over Dennis’s SGI Crimson and opens the /usr di­rec­tory.

SGI was su­per happy to see this since they men­tioned YOU SAW IT IN JURASSIC PARK!” on their web­site[9].

IRIX sup­ported spaces in file and di­rec­tory names. I as­sume they put a dot be­tween Visitors and Center for style.

Nedryland is the sys­tem mod­estly named by Dennis Nedry to con­trol Jurassic Park. We can catch a few glimpses of the name on screen when the sys­tem suc­cess­fully re­boots.

There is very lit­tle on­line about how these screens were cre­ated ex­cept that they were cre­ated by Michael Backes and his team.

Fans have recre­ated Nedryland. Checkout JPOS NEDRYLAND YouTube chan­nel to see it in ac­tion. There is also an on­line ver­sion at juras­sic­sys­tems.com.

Some code as­so­ci­ated with Nedryland is vis­i­ble on screen. It looks like ac­tual source code[10] with Classic Mac OS API func­tions calls. EDIT: Several hack­ers news users pointed out this is Pascal from MPW (Macintosh Programmers Workshop).

Later dur­ing the faked video-con­fer­ence, we can see more files be­long­ing to a Nedryland di­rec­tory.

One last de­tail for the road. The book on the top of Dennis’s shelf (upper-right) is System 7 Revealed by Anthony Meadow. Wow they re­ally did pay at­ten­tion to every de­tail!

References

^[ 1]Motorola Envoy Release date ^[ 2]Connection Machine Series ^[ 3]The CM-5, Moore’s Law, and the Future of Computational Performance ^[ 4]NCAR’s Connection Machine 5 - Littlebear ^[ 5]CM-5 in Jurassic Park ^[ 6]SGI hard­ware de­vel­oper hand­book p4 – 25 ^[ 7]Using the Indigo Keyboard with a Personal Iris ^[ 8]In Jurassic Park, when Nedry is in­tro­duced, you can see he’s watch­ing Jaws on his com­puter. ^[ 9]3D File System Navigator for IRIX 4.0.1+ ^[10]Source code on Nedry’s work­sta­tion: real pro­gram­ming lan­guage/​s?

GitHub - JustVugg/colibri: Run GLM-5.2 (744B MoE) on a 25GB-RAM consumer machine — pure C, zero deps, experts streamed from disk. Tiny engine, immense model. 🐦

github.com

Tiny en­gine, im­mense model. Run GLM-5.2 (744B-parameter MoE) on a con­sumer ma­chine with ~25 GB of RAM — in pure C, with zero de­pen­den­cies, by stream­ing ex­perts from disk.

$ ./coli chat 🐦 col­i­brì v1.0 — GLM-5.2 · 744B MoE · int4 · stream­ing CPU ✓ pronto in 32s · res­i­dente 9.9 GB › ciao! ◆ Ciao! 😊 Come posso aiu­tarti oggi?

The idea

A 744B Mixture-of-Experts model ac­ti­vates only ~40B pa­ra­me­ters per to­ken — and only ~11 GB of those change from to­ken to to­ken (the routed ex­perts). So:

the dense part (attention, shared ex­perts, em­bed­dings — ~17B params) stays res­i­dent in RAM at int4 (~9.9 GB);

the 21,504 routed ex­perts (75 MoE lay­ers × 256 ex­perts + the MTP head, ~19 MB each at int4) live on disk (~370 GB) and are streamed on de­mand, with a per-layer LRU cache, an op­tional pinned hot-store, and the OS page cache as a free L2.

The en­gine is a sin­gle C file (c/glm.c, ~2,400 lines) plus small head­ers. No BLAS, no Python at run­time, no GPU re­quired (an opt-in CUDA tier for pinned ex­perts ex­ists — see be­low).

What’s im­ple­mented

Faithful GLM-5.2 (glm_moe_dsa) for­ward — val­i­dated to­ken-ex­act against a trans­form­ers or­a­cle (teacher-forcing 32/32, greedy 20/20 on a tiny-ran­dom model with the real ar­chi­tec­ture).

MLA at­ten­tion (q/kv-LoRA, in­ter­leaved par­tial RoPE) with com­pressed KV-cache: 576 floats/​to­ken in­stead of 32,768 (57× smaller — GLM-5.2 has 64 heads and no GQA).

DeepSeek-V3-style sig­moid router (noaux_tc, rout­ed_s­cal­ing_­fac­tor), shared ex­pert, first-3-dense lay­ers.

Native MTP spec­u­la­tive de­cod­ing — GLM-5.2′s own multi-to­ken-pre­dic­tion head (layer 78) drafts to­kens that the main model ver­i­fies in one batched for­ward. The head must be int8 (the con­verter does this by de­fault): at int4 draft ac­cep­tance col­lapses to 0 – 4% and spec­u­la­tion never en­gages; at int8 it’s 39 – 59% ac­cep­tance, 2.2 – 2.8 to­kens/​for­ward (community-measured, #8). Lossless — and stays loss­less un­der sam­pling via re­jec­tion sam­pling. Honest caveat from the same mea­sure­ment: on a cold cache each ver­i­fied draft routes to ex­tra ex­perts (~660 → ~1100 ex­pert-loads/​to­ken), so spec­u­la­tion can be a net time loss un­til the cache/​pin warms up — the adap­tive guard and DRAFT=0 are there for that.

True sam­pling — tem­per­a­ture + nu­cleus, de­faults tuned for int4 re­al­ity (0.7 / 0.90; the of­fi­cial 1.0 / 0.95 sam­ples quan­ti­za­tion noise from the tail).

Integer-dot ker­nels (Q8_0-style int8 ac­ti­va­tions, AVX2 mad­dubs): int8 mat­muls 1.4 – 2.5× faster (119 GFLOP/s mea­sured), int4 1.8× in batch — rout­ing de­cided per shape by mea­sure­ment (int4 sin­gle-row stays f32: it mea­sured slower).

MLA weight ab­sorp­tion (DeepSeek trick) for de­code: no per-to­ken k/​v re­con­struc­tion — the query ab­sorbs kv_b, con­text is pro­jected af­ter at­ten­tion. Validated ex­act: TF 32/32 and gen­er­a­tion 20/20 with ab­sorp­tion forced every­where.

Async ex­pert reada­head: while one block of ex­perts is be­ing mul­ti­plied, the ker­nel is al­ready read­ing the next (WILLNEED).

Quantization ker­nels: int8 / packed int4 / packed int2, per-row scales, AVX2, de­quant-on-use. Packing val­i­dated bit-iden­ti­cal to the int8 con­tainer.

DSA sparse at­ten­tion — GLM-5.2′s light­ning in­dexer, faith­ful to the ref­er­ence glm_­moe_dsa mod­el­ing: per-layer top-2048 causal key se­lec­tion (full/shared in­dexer lay­ers), auto-de­tected from the out-idx-* weights (–indexer con­verter mode, ~189 MB ex­tracted from the FP8 repo). Validated ex­act: forc­ing the se­lec­tion to keep every key re­pro­duces dense at­ten­tion to­ken-for-to­ken. DSA=0 dis­ables, DSA_TOPK over­rides.

KV-cache per­sis­tence — con­ver­sa­tions re­open warm across en­gine restarts: serve mode ap­pends the com­pressed MLA KV to .coli_kv af­ter every turn (~182 KB/token, crash-safe) and re­sumes it at startup with zero re-pre­fill. Validated byte-iden­ti­cal to an un­in­ter­rupted ses­sion. KVSAVE=0 dis­ables.

Router-lookahead prefetch (PILOT=1, ex­per­i­men­tal) — the next lay­er’s rout­ing is 71.6% pre­dictable from the cur­rent lay­er’s post-at­ten­tion state (measured); a ded­i­cated I/O thread prefetches those ex­perts while the cur­rent layer com­putes.

Batch-union MoE: in pre­fill (and MTP ver­i­fi­ca­tion), each unique ex­pert of the batch is read once and ap­plied to every po­si­tion that routes to it.

Byte-level BPE to­k­enizer in C (GPT-2-style with Unicode-property regex, 320k merges).

RAM safety: the ex­pert cache is auto-sized from MemAvailable at startup — an hon­est peak pro­jec­tion (working set, KV, MTP row, re­con­struc­tion buffers) so the ker­nel OOM-killer never fires.

Offline FP8→int4 con­verter (c/tools/convert_fp8_to_int4.py): down­loads one shard at a time (~5 GB), de­quants (128×128 block scales), re­quan­tizes to the en­gine’s con­tainer, deletes the shard — the 756 GB FP8 check­point never needs to ex­ist on disk at once. Resumable.

Honest num­bers (WSL2, 12 cores, 25 GB RAM, NVMe via VHDX)

This is not fast. It is a 744B fron­tier-class model an­swer­ing cor­rectly on a ma­chine that costs less than one H100 fan. Warm cache, pinned hot ex­perts and MTP push the use­ful-re­sponse la­tency down con­sid­er­ably; the physics of the disk does the rest.

SSD note

Cold starts are heavy on ran­dom reads (~11 GB/token), but reads don’t mean­ing­fully wear an SSD — col­i­brì’s stream­ing is read-only. The real con­cerns un­der heavy use are (1) swap traf­fic if the sys­tem runs out of RAM (writes do wear the drive — keep a sane –ram bud­get; col­i­brì’s auto-bud­get is de­signed to stay clear of swap) and (2) sus­tained ther­mals: hours at full read duty cy­cle will heat cheaper dri­ves. Monitor drive tem­per­a­ture and health.

Download the model

A pre-con­verted GLM-5.2 int4 model for col­i­brì is avail­able on Hugging Face:

https://​hug­ging­face.co/​jlnsrk/​GLM-5.2-col­ibri-int4

If the MTP files there are still the int4 head (see #8 — sizes 1765523544/2686077736/536747200 = int4, un­us­able), grab the int8 MTP heads from the com­mu­nity clone by matey-0: https://​hug­ging­face.co/​ma­teogr­gic/​GLM-5.2-col­ibri-int4-with-int8-mtp

Download the repos­i­tory and point COLI_MODEL to its di­rec­tory:

COLI_MODEL=/path/to/GLM-5.2-colibri-int4 ./coli chat

This skips the FP8 → int4 con­ver­sion step en­tirely.

Thanks DatPat for your help!

Quick start

cd c ./setup.sh # checks gcc/​OpenMP, builds, self-tests

# ONE com­mand does every­thing model-side: down­loads GLM-5.2-FP8 shard by shard # (never needs the full 756 GB at once), con­verts to the int4 con­tainer, then # con­verts the MTP head for spec­u­la­tive de­cod­ing. Resumable at any point. # Conversion (only) needs python with: pip in­stall torch safeten­sors hug­ging­face_hub numpy ./coli con­vert –model /nvme/glm52_i4 # ~400 GB free on a real ext4/​NVMe path

# chat — RAM bud­get, ex­pert cache and MTP are all de­tected au­to­mat­i­cally: COLI_MODEL=/nvme/glm52_i4 ./coli chat

Inspect the planned stor­age hi­er­ar­chy be­fore load­ing the model:

COLI_MODEL=/nvme/glm52_i4 ./coli plan COLI_MODEL=/nvme/glm52_i4 ./coli plan –gpu 0,1 –ram 128 –vram 48 –json

# ap­ply the bounded plan to the nor­mal run­ner COLI_MODEL=/nvme/glm52_i4 ./coli chat –auto-tier

coli plan reads only safeten­sors head­ers and re­ports the mod­el’s ex­act dense/​ex­pert foot­print, run­time RAM re­serve, safe ex­pert-cache cap, and bounded VRAM hot tier. Its ver­sioned JSON out­put is in­tended to be shared by the CLI, API server, Web UI, and desk­top shell; it does not al­lo­cate model ten­sors or start in­fer­ence. –auto-tier ap­plies the same plan to chat, run, serve, and bench­marks. It sets the RAM bud­get and con­text im­me­di­ately; the VRAM tier is en­abled only when the cur­rent glm bi­nary is linked with CUDA. Explicit flags and en­vi­ron­ment vari­ables keep prece­dence over au­to­matic val­ues.

The en­gine at run­time is pure C — python is only used by the one-time con­verter.

Windows 11 (native, no WSL)

col­i­brì builds and runs na­tively on Windows 11 x86 – 64 with MinGW-w64. The port adds a _WIN32 com­pat­i­bil­ity layer in c/​com­pat.h that maps POSIX I/O to the Windows API (pread → ReadFile+OVERLAPPED, posix_­fad­vise no-op, aligned al­lo­ca­tion, MoveFileEx re­name, GlobalMemoryStatusEx RAM de­tec­tion). All plat­form dif­fer­ences stay in com­pat.h; the en­gine source is un­changed.

Toolchain: GCC via win­libs or MSYS2 MinGW-w64. Tested with GCC 16.1.0 (x86_64-ucrt-posix-seh).

# One-time tool­chain in­stall (pick one): scoop in­stall mingw-win­libs # portable, no shell needed # or: pac­man -S mingw-w64-x86_64-gcc make # via MSYS2

# Build (from c/ di­rec­tory): make glm.exe # GLM-5.2 en­gine (static, no DLL de­pen­den­cies) make ol­moe.exe # OLMoE en­gine (same shims) make iobench.exe # disk I/O bench­mark make test-c # run C tests make test-python # run Python tests (requires python)

# Verify (tiny model, 2.4 MB): pip in­stall torch trans­form­ers safeten­sors hug­ging­face_hub python tools/​make_glm_o­r­a­cle.py # gen­er­ate tiny or­a­cle SNAP=./glm_tiny TF=1 ./glm.exe 64 16 16 # ex­pect 32/32 po­sizioni”

# Run with real model: SNAP=D:\glm52_i4 ./glm.exe 64 4 16 # batch in­fer­ence python coli chat –model D:\glm52_i4 # in­ter­ac­tive chat python coli serve –model D:\glm52_i4 # OpenAI-compatible API

Status: Phase 1 com­plete (compiles, cor­rect, sta­tic-linked). O_DIRECT (Phase 2), GPU via LoadLibrary on col­i_cuda.dll (Phases G0–G2), and full-model val­i­da­tion are sep­a­rate work­streams. See PORT_WINDOWS_PLAN.md for the full plan.

OpenAI-compatible API

coli serve keeps one model process loaded and ex­poses a text-only OpenAI-compatible HTTP API. The gate­way uses only the Python stan­dard li­brary; in­fer­ence still runs in the same de­pen­dency-free C en­gine.

cd c COLI_MODEL=/nvme/glm52_i4 COLI_API_KEY=local-secret ./coli serve \ –host 127.0.0.1 –port 8000 –model-id glm-5.2-col­ibri

curl http://​127.0.0.1:8000/​v1/​chat/​com­ple­tions \ -H Authorization: Bearer lo­cal-se­cret’ \ -H Content-Type: ap­pli­ca­tion/​json’ \ -d { model”: glm-5.2-colibri”, messages”: [{“role”: user”, content”: Hello”}], stream”: true }’

Implemented end­points are GET /v1/models, GET /v1/models/{model}, POST /v1/chat/completions, and legacy POST /v1/completions. Chat and com­ple­tion re­quests sup­port JSON re­sponses, SSE stream­ing, us­age counts, max_­to­kens/​max_­com­ple­tion_­to­kens, tem­per­a­ture, and top_p. The ex­ten­sion en­able_­think­ing: true en­ables GLM-5.2′s rea­son­ing block; the stan­dard rea­son­ing_­ef­fort field also en­ables it un­less set to none.

The first ver­sion is de­lib­er­ately text-only and serves one gen­er­a­tion at a time: the 744B model stays in one per­sis­tent process, so con­cur­rent HTTP re­quests queue in­stead of load­ing du­pli­cate model copies. Tools, im­age/​au­dio in­put, cus­tom stop se­quences, log prob­a­bil­i­ties, and to­ken penal­ties re­turn an ex­plicit er­ror rather than be­ing silently ig­nored. The de­fault bind ad­dress is lo­cal­host; set COLI_API_KEY be­fore ex­pos­ing the server be­yond the ma­chine.

Browser ac­cess from the Vite de­vel­op­ment server and Tauri lo­cal ori­gins is en­abled by de­fault. Repeat –cors-origin https://​your-ui.ex­am­ple to al­low an­other ex­act ori­gin, or use –cors-origin *’ only on a trusted lo­cal net­work.

The en­gine owns one mu­ta­ble KV con­text, so HTTP gen­er­a­tion uses a bounded FIFO ad­mis­sion queue in­stead of pre­tend­ing to run un­safe par­al­lel se­quences. Configure it with –max-queue N (default 8) and –queue-timeout SECONDS (default 300), or the COLI_MAX_QUEUE / COLI_QUEUE_TIMEOUT en­vi­ron­ment vari­ables. Saturated and timed-out re­quests re­ceive OpenAI-shaped HTTP 429 er­rors be­fore stream­ing head­ers are sent. GET /health ex­poses ac­tive/​queued/​com­pleted/​re­jected coun­ters, and suc­cess­ful gen­er­a­tion re­sponses in­clude x-col­ibri-queue-wait-ms.

Isolated KV con­texts

coli serve –kv-slots N al­lo­cates up to 16 in­de­pen­dent se­quence con­texts. Requests se­lect one with the op­tional in­te­ger cache_s­lot field; or­di­nary OpenAI clients omit it and keep the orig­i­nal slot 0 be­hav­ior.

{ model”: glm-5.2-colibri”, messages”: [{“role”: user”, content”: Continue this con­ver­sa­tion”}], cache_slot”: 1 }

Each slot owns its to­ken his­tory, com­pressed MLA/DSA KV mem­ory, MTP win­dow, and crash-safe per­sis­tence file (.coli_kv, .coli_kv.1, …). The en­gine still ex­e­cutes one se­quence at a time; this es­tab­lishes ex­plicit KV own­er­ship with­out pre­tend­ing that threaded HTTP is con­tin­u­ous batch­ing. RAM ad­mis­sion ac­counts for every con­fig­ured slot. Use COLI_KV_SLOTS=N as the en­vi­ron­ment equiv­a­lent. Start with a small value: at the de­fault 4096-token con­text, every slot costs hun­dreds of MB.

Experimental res­i­dent CUDA back­end

col­i­brì in­cludes an opt-in CUDA back­end for model-res­i­dent ten­sors. Streaming ex­perts de­lib­er­ately re­main on the orig­i­nal CPU path for now: copy­ing an ex­pert from NVMe to the GPU on every use would only re­place the disk bot­tle­neck with a PCIe bot­tle­neck. Resident quan­tized ten­sors are up­loaded lazily once and reused.

cd c make cuda-test CUDA=1 # q8/​q4/​q2/​f32 ker­nel cor­rect­ness make CUDA=1 # op­tional dense-path ex­per­i­ment (hot ex­perts are con­fig­ured be­low) COLI_CUDA=1 COLI_GPU=0 CUDA_DENSE=1 SNAP=/nvme/glm52_i4 ./glm 64 4 4

Requirements: Linux, an NVIDIA dri­ver, and a CUDA Toolkit un­der /usr/local/cuda (override with CUDA_HOME=/path/to/cuda). CUDA_ARCH=native builds for the GPU in the cur­rent ma­chine; set an ex­plicit ar­chi­tec­ture when cross-com­pil­ing. Requesting CUDA with a CPU-only bi­nary, an in­valid de­vice, or an un­avail­able run­time fails at startup in­stead of silently falling back.

The nor­mal make build and run­time be­hav­ior are un­changed. CUDA de­faults to an ex­pert-only ac­cel­er­a­tor: res­i­dent dense/​at­ten­tion ten­sors stay on CPU be­cause fix­ture mea­sure­ments show that mov­ing them does not help while ex­pert I/O is the bot­tle­neck. CUDA_DENSE=1 keeps the ear­lier all-res­i­dent ex­per­i­men­tal path. A mea­sured PIN pro­file can pro­mote its hottest ex­perts into the per­sis­tent VRAM tier while keep­ing the rest in RAM:

STATS=stats.txt SNAP=/nvme/glm52_i4 ./glm 64 4 4 # col­lect rout­ing fre­quen­cies first COLI_CUDA=1 COLI_GPU=0 CUDA_EXPERT_GB=16 \ PIN=stats.txt PIN_GB=160 SNAP=/nvme/glm52_i4 ./glm 64 4 4 # multi-GPU ex­pert tier, 96 GB to­tal bud­get across six de­vices COLI_CUDA=1 COLI_GPUS=0,1,2,3,4,5 CUDA_EXPERT_GB=96 \ PIN=stats.txt PIN_GB=160 SNAP=/nvme/glm52_i4 ./glm 64 4 4

Selected ex­perts are up­loaded dur­ing startup, so ca­pac­ity fail­ures oc­cur be­fore in­fer­ence and the log re­ports their ex­act ten­sor foot­print. The bud­get is clamped against free VRAM af­ter re­serv­ing the pro­jected dense res­i­dent set and 2 GB of run­time head­room per se­lected de­vice. With COLI_GPUS, CUDA_EXPERT_GB is a to­tal bud­get across the de­vice set; ex­perts are as­signed whole to the least-loaded de­vice that can hold them. A NUMA-local RAM back­ing store is not im­ple­mented yet.

Current lim­i­ta­tions: de­vices use in­de­pen­dent con­texts and syn­chro­nous host-staged ac­ti­va­tion copies—there is no P2P/NCCL de­pen­dency yet. The ker­nels are cor­rect­ness-first cus­tom ker­nels rather than cuBLAS/​Ten­sor Core ker­nels. This draft in­ten­tion­ally makes no end-to-end speedup claim be­fore the full model is bench­marked.

For a re­pro­ducible back­end A/B with­out the full check­point, gen­er­ate the de­ter­min­is­tic 313M-parameter glm_­moe_dsa fix­ture and run fixed-to­ken re­play:

cd c python tools/​make_glm_bench_­model.py –output /nvme/colibri-bench-medium –device cuda python tools/​bench­mark_cu­d­a_­fix­ture.py –model /nvme/colibri-bench-medium –gpu 0

The fix­ture has ran­dom weights and is not a lan­guage model. It ex­ists only to pre­serve the real MLA/MoE/streaming shapes and com­pare CPU stream­ing, dense-only CUDA, CPU hot-store, and CUDA hot-ex­pert ex­e­cu­tion with iden­ti­cal re­play to­kens.

Web in­ter­face

web/ con­tains a com­mu­nity-con­tributed browser UI (React + TypeScript, ~390 lines of source, a pure API client — it never touches the en­gine di­rectly):

cd web npm ci && npm run dev # then point it at an OpenAI-compatible end­point

It speaks the stan­dard OpenAI Chat Completions pro­to­col with SSE stream­ing, so it works against the col­i­brì OpenAI-compatible server (in re­view, #21) or any other com­pat­i­ble end­point. Nothing leaves the end­point you con­fig­ure. The ter­mi­nal coli chat re­mains the first-class in­ter­face.

Useful knobs (env or flags): –temp T to­ken sam­pling tem­per­a­ture (default 0.7 + nu­cleus 0.90 — tuned for int4; 0 = greedy), –topp 0.7 adap­tive ex­pert top-p (30 – 40% less disk), –ngen N max to­kens per an­swer (:piu in chat con­tin­ues a trun­cated one), –repin N adapt RAM/VRAM hot ex­perts every N emit­ted to­kens, AUTOPIN=0 dis­able the learn­ing cache’s auto-pin, THINK=1 en­able GLM-5.2′s rea­son­ing block, DRAFT=n MTP draft depth, TF=1 teacher-forc­ing val­i­da­tion, PILOT=1 router-looka­head disk prefetch (experimental — see be­low), CAP_RAISE=0 don’t auto-grow the ex­pert cache.

The ex­pert cache auto-sizes to your RAM (since 2026 – 07-10): the en­gine now raises the LRU cap to fill your –ram bud­get in­stead of only low­er­ing it. Before this fix a 128 GB ma­chine ran with the same 8-experts/layer cache as a 16 GB one (issue #12) — if you bench­marked col­i­brì be­fore this date, re­run: your num­bers were capped.

Router-lookahead prefetch (PILOT=1, ex­per­i­men­tal): GLM-5.2′s ex­pert rout­ing is mea­sur­ably pre­dictable ahead of time — ap­ply­ing layer L+1′s router to layer L’s post-at­ten­tion state re­calls 71.6% of the true top-8 (vs 41.3% for same ex­perts as last to­ken”). PILOT=1 uses this to is­sue next-layer ex­pert reada­head from a ded­i­cated I/O thread while the cur­rent layer com­putes. On our dev box the disk is al­ready ~80% sat­u­rated, so it mea­sures neu­tral; on ma­chines where com­pute and disk are bal­anced (like the Ryzen AI 9 in is­sue #12: 43% disk / 46% mat­mul) it should over­lap real work — mea­sure­ments wel­come.

The learn­ing cache: the en­gine records which ex­perts your us­age ac­tu­ally routes to (.coli_usage next to the model, up­dated every turn) and at startup au­to­mat­i­cally pins the hottest ones in spare RAM. col­i­brì lit­er­ally gets faster the more you use it.

Live tier adap­ta­tion (–repin N, opt-in): at safe turn bound­aries, a de­cay­ing ses­sion heat map re­places cold pinned ex­perts with hot­ter streamed ex­perts. Replacement loads the ex­pert from disk into the ex­ist­ing RAM slot; GPU-backed slots im­me­di­ately re­fresh the same VRAM tier bud­get. A 25% hys­tere­sis and a four-swap limit pre­vent tier thrash­ing. Persistent .coli_usage re­mains the long-term sig­nal and is not de­cayed.

Conversations re­open warm (.coli_kv, since 2026 – 07-10): coli chat per­sists the com­pressed MLA KV-cache to disk af­ter every turn (~182 KB/token, ap­pended in­cre­men­tally, crash-safe). Close the chat, re­open it to­mor­row — the model still re­mem­bers the whole con­ver­sa­tion and zero re-pre­fill hap­pens: val­i­dated byte-iden­ti­cal to an un­in­ter­rupted ses­sion. :reset clears it, KVSAVE=0 dis­ables it.

Got a bet­ter ma­chine? Try it — here’s what to ex­pect

col­i­brì was built on de­lib­er­ately hum­ble hard­ware (12 cores, 25 GB RAM, NVMe be­hind a WSL2 VHDX that caps ran­dom reads at ~1 GB/s). Every one of those con­straints is a knob your ma­chine can turn up. The en­gine needs: Linux (or WSL2), ma­cOS, or Windows 11 na­tively (MinGW-w64); gcc with OpenMP, AVX2, ≥16 GB RAM, and the ~370 GB int4 model on a lo­cal NVMe (ext4/NTFS — never a net­work/​9p mount).

How to test it, in or­der:

cd c && ./setup.sh # build + ar­chi­tec­ture self-test (expects 32/32)

# 1) mea­sure YOUR disk the way the en­gine uses it (parallel 19 MB ran­dom reads): gcc -O2 -fopenmp iobench.c -o iobench ./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 0 # buffered, 8 threads ./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 1 # O_DIRECT

# 2) chat; watch the per-turn stats line (tok/s, ex­pert hit-rate, RSS): COLI_MODEL=/path/to/glm52_i4 ./coli chat

# 3) record ex­pert us­age, then pin the hottest ex­perts in your spare RAM: STATS=stats.txt ./coli chat PIN=stats.txt PIN_GB=20 ./coli chat # scale PIN_GB to your free RAM

# 4) qual­ity bench­marks (MMLU/HellaSwag/ARC): ./coli bench

Back-of-envelope pre­dic­tions (decode is disk-bound: a cold to­ken costs ~11.4 GB of ex­pert reads; MTP spec­u­la­tion roughly halves the ef­fec­tive cost once the cache is warm; RAM turns cold reads into free cache hits):

These are es­ti­mates, not mea­sure­ments — if you run col­i­brì on se­ri­ous hard­ware, please open an is­sue with your num­bers: real dat­a­points from bet­ter ma­chines are ex­actly what this pro­ject needs next.

Community bench­marks (measured)

Real num­bers from real ma­chines, stock build (setup.sh, gcc 13), greedy de­cod­ing, –ngen 32, MTP ac­tive:

Takeaways: with 24 GB of RAM the en­gine auto-caps the ex­pert cache to 2 slots/​layer, so de­code stays cold even on a disk 2 – 2.7× faster than the dev box — on small-RAM ma­chines the RAM cap, not the disk, is the bind­ing con­straint, ex­actly as the table above pre­dicts; –topp 0.7 alone bought a clean 1.6× end-to-end speedup. The M5 Max dat­a­point lands right on the table’s sec­ond row: ~1 tok/​s of a 744B model on a lap­top SSD — and its 14 GB/s disk shifts the bot­tle­neck back to RAM bud­get and ker­nels. The Framework 13 rows are the cache the­sis proven end-to-end on one ma­chine: 0.29 → 0.37 tok/​s (hit 28% → 66%, spec­u­la­tion fi­nally en­gag­ing at 52% ac­cep­tance) just by giv­ing the cache its RAM — int8 MTP head + a big­ger cap + the learned pin. The cap part is now au­to­matic (cap auto-raise, 2026 – 07-10). The 9950X pair is the clean­est bot­tle­neck ex­per­i­ment yet — same ma­chine, same his­tory, only the disk swapped: ×5.8 disk band­width bought ×2.9 to­kens, and the pro­file flipped from 66% disk to 57% mat­mul. Past ~5 GB/s the disk stops be­ing the story and the CPU (or the CUDA ex­pert tier) be­comes it.

Quality bench­mark — help wanted

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

danq.me

Why is this an app”?

This sum­mer, the kids’ per­form­ing arts school are singing and danc­ing in a show at Disneyland. We’re all very ex­cited, but my ex­cite­ment, at least, was muted a lit­tle when I was told to in­stall the Travelbound” app in or­der to get ac­cess to the itin­er­ary, travel arrange­ments, and ac­com­mo­da­tion de­tails.

Fuck that noise. This should have been a web­page. Why do you want me to in­stall a(nother) shitty app just to tell me some­thing that could have been a (smaller, faster, more uni­ver­sally-ac­ces­si­ble) doc­u­ment?

There only seem to be two things that this app” does, that a web­page might not have, and they’re both anti-fea­tures:

It re­ports track­ing data as­so­ci­ated with your Google Account back to the de­vel­op­ers.

It shows you ad­ver­tise­ments (which they call inspirations”) for other trips or­gan­ised by the same agency.

Fuck. Everything. About. That.

A web­page would have been so much bet­ter. Unlike this app, a web­page can be…1

Copy-pastable

Printable

Saveable

Bookmarkable

Searchable

Usable on vir­tu­ally any de­vice

(Potentially) more-ac­ces­si­ble

I’m an­noyed enough… that I’m go­ing to fix” this app. Hold my beer.

Intercepting app traf­fic

It’s been a while since the last time I re­verse-en­gi­neered an Android app from its net­work traf­fic, so I had to brush-up on the best way. Here’s what I ended up do­ing.

Created a new vir­tual de­vice in Android Studio’s Virtual Device Manager.

Tested adb shell was work­ing and used rootAVD to root it: ./rootAVD.sh sys­tem-im­ages/​an­droid-33/​google_apis_­play­store/​x86_64/​ramdisk.img.2

Performed a cold boot, ran Magisk, and tweaked its set­tings to au­to­mat­i­cally grant su ac­cess to any app that asked.3

Ran HTTP Toolkit and told it to in­ter­cept AVD traf­fic. It in­stalled a (fake) VPN provider, rout­ing the phone’s traf­fic through the proxy.4

Installed the Travelbound app from the Play Store.

Configured HTTP Toolkit to proxy only the Travelbound app (more sig­nal, less noise).

With only a cou­ple of min­utes ex­per­i­men­ta­tion I dis­cov­ered that the app works by con­cate­nat­ing the user­name and pass­word5 and us­ing it in a URL of the form:

https://​trav­el­bound.api.va­moos.com/​api/​itin­er­aries/{​user­name}-{pass­word}

https://​trav­el­bound.api.va­moos.com/​api/​itin­er­aries/{​user­name}-{pass­word}

This re­turns a pile of JSON which, with a lit­tle in­ter­pre­ta­tion, can be seen to rep­re­sent all of the con­tent the app shows”. E.g., there’s:

an ar­ray con­tain­ing each leg of the itin­er­ary,

an ar­ray con­tain­ing all of the inspirations” ad­ver­tise­ments to show you,

a cross-ref­er­enced ar­ray con­tain­ing all of the files (images etc.) that are ref­er­enced by the other sec­tions, etc.

A lit­tle ex­per­i­men­ta­tion showed me that the S3 im­age URLs were be­ing de­liv­ered with mod­er­ately-short ex­pi­ra­tion times, so the JSON needs re-fetch­ing pe­ri­od­i­cally even if the con­tent has­n’t been changed.6

Turning it into some­thing bet­ter

Now I had every­thing I needed to make some­thing… bet­ter. I wrote a Ruby script that runs on a Cron sched­ule to pull the lat­est JSON and use it to build a HTML page.

I chose to have it com­pletely skip over the inspirations” (“overlayRows” in the data schema) and just list:

the items from the itin­er­ary and

all of the files not ref­er­enced by the in­spi­ra­tions nor itin­er­ary, (a lazy way to col­late the PDF down­load links).

Then I hosted the page, pro­tected by a pass­word: the same one my tour group were given in the first place. I in­cluded the raw JSON it used in <details> el­e­ments so it can be checked if e.g. there are bits of the schema I did­n’t see but that might ap­pear later.

Some peo­ple like an app”, and that’s… fine, I guess. But some apps could have been a web­page. And es­pe­cially where, like this one, the con­tent they de­liver is al­ready writ­ten in HTML and de­liv­ered over HTTP… they should be a web­page, right?

I can’t un­der­stand how we got to this place with app cul­ture”! Software com­pa­nies are happy to make their lives harder (and more ex­pen­sive: de­ploy­ing to the big app stores is­n’t free!), in or­der to de­liver HTML con­tent to fewer peo­ple and with fewer fea­tures7 than if they just pub­lished di­rectly to the Web in the first place!

There are (some) tasks for which an app” is ab­solutely the right choice of medium. Travelbound is not one of them.

But at least I (and the rest of our group, whom I’ve shared it with) now get the choice about how we ac­cess this con­tent. Either a 43MB app (ballooning to 124MB when it’s fin­ished down­load­ing ex­tra con­tent) with track­ing and ad­ver­tise­ments… or a 0.05MB web page (with an op­tional ex­tra 35MB of im­ages) that pro­vides more fea­tures and works on more de­vices. I know which one I’ll be us­ing!

Footnotes

1 And these are just the fea­tures that every­body can get be­hind. The web­page I ul­ti­mately ended up mak­ing to re­place the app also has some user-friendly/​de­vel­oper-hos­tile fea­tures, like the fact that it re­moves the track­ing code and does­n’t show ad­ver­tise­ments.

2 You need to root the de­vice in or­der to force ap­pli­ca­tions that use Certificate Pinning to trust your man-in-the-mid­dle proxy server. Without this, some ap­pli­ca­tions — in­clud­ing the one I wanted to re­verse-en­gi­neer — will recog­nise your self-signed TLS cer­tifi­cate as in­valid and refuse to com­mu­ni­cate.

3 Without chang­ing this set­ting in Magisk, I found that HTTP Toolkit would re­quest su ac­cess but not wait for the re­sponse, and go on to run in un­priv­i­leged mode be­fore I had a chance to grant it!

4 Owing to Android se­cu­rity con­sid­er­a­tions I needed to man­u­ally in­stall the root CA cer­tifi­cate it in­stalled for me, but the in­struc­tions just worked”.

5 The user­name and pass­word is shared by an en­tire tour group. I’m guess­ing they don’t have a plan for if some cre­den­tials get leaked? Or pos­si­bly they con­sider all of the data they hold to be low-sen­si­tiv­ity enough that it does­n’t mat­ter if it does… in which case I re­turn to my orig­i­nal point: why the hell was­n’t it just a web­page in the first place?

6 Or else the im­ages need caching lo­cally, which seems to be what the app does, in the bloat­i­est pos­si­ble way.

7 And, of­ten, with worse ac­ces­si­bil­ity. I’ve not au­dited the ac­ces­si­bil­ity of this app, but there are things about it that sug­gest that it’d be harder to use us­ing ac­ces­si­bil­ity tech­nolo­gies than my plain, sim­ple Web ver­sion.

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.