<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: thomas-ptacek</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/thomas-ptacek.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2026-04-07T20:52:54+00:00</updated><author><name>Simon Willison</name></author><entry><title>Anthropic's Project Glasswing - restricting Claude Mythos to security researchers - sounds necessary to me</title><link href="https://simonwillison.net/2026/Apr/7/project-glasswing/#atom-tag" rel="alternate"/><published>2026-04-07T20:52:54+00:00</published><updated>2026-04-07T20:52:54+00:00</updated><id>https://simonwillison.net/2026/Apr/7/project-glasswing/#atom-tag</id><summary type="html">
    &lt;p&gt;Anthropic &lt;em&gt;didn't&lt;/em&gt; release their latest model, Claude Mythos (&lt;a href="https://www-cdn.anthropic.com/53566bf5440a10affd749724787c8913a2ae0841.pdf"&gt;system card PDF&lt;/a&gt;), today. They have instead made it available to a very restricted set of preview partners under their newly announced &lt;a href="https://www.anthropic.com/glasswing"&gt;Project Glasswing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The model is a general purpose model, similar to Claude Opus 4.6, but Anthropic claim that its cyber-security research abilities are strong enough that they need to give the software industry as a whole time to prepare.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mythos Preview has already found thousands of high-severity vulnerabilities, including some in &lt;em&gt;every major operating system and web browser&lt;/em&gt;. Given the rate of AI progress, it will not be long before such capabilities proliferate, potentially beyond actors who are committed to deploying them safely.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;Project Glasswing partners will receive access to Claude Mythos Preview to find and fix vulnerabilities or weaknesses in their foundational systems—systems that represent a very large portion of the world’s shared cyberattack surface. We anticipate this work will focus on tasks like local vulnerability detection, black box testing of binaries, securing endpoints, and penetration testing of systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's a great deal more technical detail in &lt;a href="https://red.anthropic.com/2026/mythos-preview/"&gt; Assessing Claude Mythos Preview’s cybersecurity capabilities&lt;/a&gt; on the Anthropic Red Team blog:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In one case, Mythos Preview wrote a web browser exploit that chained together four vulnerabilities, writing a complex &lt;a href="https://en.wikipedia.org/wiki/JIT_spraying "&gt;JIT heap spray&lt;/a&gt; that escaped both renderer and OS sandboxes. It autonomously obtained local privilege escalation exploits on Linux and other operating systems by exploiting subtle race conditions and KASLR-bypasses. And it autonomously wrote a remote code execution exploit on FreeBSD's NFS server that granted full root access to unauthenticated users by splitting a 20-gadget ROP chain over multiple packets.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Plus this comparison with Claude 4.6 Opus:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Our internal evaluations showed that Opus 4.6 generally had a near-0% success rate at autonomous exploit development. But Mythos Preview is in a different league. For example, Opus 4.6 turned the vulnerabilities it had found in Mozilla’s Firefox 147 JavaScript engine—all patched in Firefox 148—into JavaScript shell exploits only two times out of several hundred attempts. We re-ran this experiment as a benchmark for Mythos Preview, which developed working exploits 181 times, and achieved register control on 29 more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saying "our model is too dangerous to release" is a great way to build buzz around a new model, but in this case I expect their caution is warranted.&lt;/p&gt;
&lt;p&gt;Just a few days (&lt;a href="https://simonwillison.net/2026/Apr/3/"&gt;last Friday&lt;/a&gt;) ago I started a new &lt;a href="https://simonwillison.net/tags/ai-security-research/"&gt;ai-security-research&lt;/a&gt; tag on this blog to acknowledge an uptick in credible security professionals pulling the alarm on how good modern LLMs have got at vulnerability research.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.theregister.com/2026/03/26/greg_kroahhartman_ai_kernel/"&gt;Greg Kroah-Hartman&lt;/a&gt; of the Linux kernel:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Months ago, we were getting what we called 'AI slop,' AI-generated security reports that were obviously wrong or low quality. It was kind of funny. It didn't really worry us.&lt;/p&gt;
&lt;p&gt;Something happened a month ago, and the world switched. Now we have real reports. All open source projects have real reports that are made with AI, but they're good, and they're real.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://mastodon.social/@bagder/116336957584445742"&gt;Daniel Stenberg&lt;/a&gt; of &lt;code&gt;curl&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The challenge with AI in open source security has transitioned from an AI slop tsunami into more of a ... plain security report tsunami. Less slop but lots of reports. Many of them really good.&lt;/p&gt;
&lt;p&gt;I'm spending hours per day on this now. It's intense.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And Thomas Ptacek published &lt;a href="https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/"&gt;Vulnerability Research Is Cooked&lt;/a&gt;, a post inspired by his &lt;a href="https://securitycryptographywhatever.com/2026/03/25/ai-bug-finding/"&gt;podcast conversation&lt;/a&gt; with Anthropic's Nicholas Carlini.&lt;/p&gt;
&lt;p&gt;Anthropic have a 5 minute &lt;a href="https://www.youtube.com/watch?v=INGOC6-LLv0"&gt;talking heads video&lt;/a&gt; describing the Glasswing project. Nicholas Carlini appears as one of those talking heads, where he said (highlights mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It has the ability to chain together vulnerabilities. So what this means is you find two vulnerabilities, either of which doesn't really get you very much independently. But this model is able to create exploits out of three, four, or sometimes five vulnerabilities that in sequence give you some kind of very sophisticated end outcome. [...]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I've found more bugs in the last couple of weeks than I found in the rest of my life combined&lt;/strong&gt;. We've used the model to scan a bunch of open source code, and the thing that we went for first was operating systems, because this is the code that underlies the entire internet infrastructure. &lt;strong&gt;For OpenBSD, we found a bug that's been present for 27 years, where I can send a couple of pieces of data to any OpenBSD server and crash it&lt;/strong&gt;. On Linux, we found a number of vulnerabilities where as a user with no permissions, I can elevate myself to the administrator by just running some binary on my machine. For each of these bugs, we told the maintainers who actually run the software about them, and they went and fixed them and have deployed the patches  patches so that anyone who runs the software is no longer vulnerable to these attacks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I found this on the &lt;a href="https://www.openbsd.org/errata78.html"&gt;OpenBSD 7.8 errata page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;025: RELIABILITY FIX: March 25, 2026&lt;/strong&gt;  &lt;em&gt;All architectures&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;TCP packets with invalid SACK options could crash the kernel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ftp.openbsd.org/pub/OpenBSD/patches/7.8/common/025_sack.patch.sig"&gt;A source code patch exists which remedies this problem.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I tracked that change down in the &lt;a href="https://github.com/openbsd/src"&gt;GitHub mirror&lt;/a&gt; of the OpenBSD CVS repo (apparently they still use CVS!) and found it &lt;a href="https://github.com/openbsd/src/blame/master/sys/netinet/tcp_input.c#L2461"&gt;using git blame&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/openbsd-27-years.jpg" alt="Screenshot of a Git blame view of C source code around line 2455 showing TCP SACK hole validation logic. Code includes checks using SEQ_GT, SEQ_LT macros on fields like th-&amp;gt;th_ack, tp-&amp;gt;snd_una, sack.start, sack.end, tp-&amp;gt;snd_max, and tp-&amp;gt;snd_holes. Most commits are from 25–27 years ago with messages like &amp;quot;more SACK hole validity testin...&amp;quot; and &amp;quot;knf&amp;quot;, while one recent commit from 3 weeks ago (&amp;quot;Ignore TCP SACK packets wit...&amp;quot;) is highlighted with an orange left border, adding a new guard &amp;quot;if (SEQ_LT(sack.start, tp-&amp;gt;snd_una)) continue;&amp;quot;" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Sure enough, the surrounding code is from 27 years ago.&lt;/p&gt;
&lt;p&gt;I'm not sure which Linux vulnerability Nicholas was describing, but it may have been &lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5133b61aaf437e5f25b1b396b14242a6bb0508e2"&gt;this NFS one&lt;/a&gt; recently covered &lt;a href="https://mtlynch.io/claude-code-found-linux-vulnerability/"&gt;by Michael Lynch
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There's enough smoke here that I believe there's a fire. It's not surprising to find vulnerabilities in decades-old software, especially given that they're mostly written in C, but what's new is that coding agents run by the latest frontier LLMs are proving tirelessly capable at digging up these issues.&lt;/p&gt;
&lt;p&gt;I actually thought to myself on Friday that this sounded like an industry-wide reckoning in the making, and that it might warrant a huge investment of time and money to get ahead of the inevitable barrage of vulnerabilities. Project Glasswing incorporates "$100M in usage credits ... as well as $4M in direct donations to open-source security organizations". Partners include AWS, Apple, Microsoft, Google, and the Linux Foundation. It would be great to see OpenAI involved as well - GPT-5.4 already has a strong reputation for finding security vulnerabilities and they have stronger models on the near horizon.&lt;/p&gt;
&lt;p&gt;The bad news for those of us who are &lt;em&gt;not&lt;/em&gt; trusted partners is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We do not plan to make Claude Mythos Preview generally available, but our eventual goal is to enable our users to safely deploy Mythos-class models at scale—for cybersecurity purposes, but also for the myriad other benefits that such highly capable models will bring. To do so, we need to make progress in developing cybersecurity (and other) safeguards that detect and block the model’s most dangerous outputs. We plan to launch new safeguards with an upcoming Claude Opus model, allowing us to improve and refine them with a model that does not pose the same level of risk as Mythos Preview.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can live with that. I think the security risks really are credible here, and having extra time for trusted teams to get ahead of them is a reasonable trade-off.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nicholas-carlini"&gt;nicholas-carlini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-release"&gt;llm-release&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="security"/><category term="thomas-ptacek"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="nicholas-carlini"/><category term="ai-ethics"/><category term="llm-release"/><category term="ai-security-research"/></entry><entry><title>Vulnerability Research Is Cooked</title><link href="https://simonwillison.net/2026/Apr/3/vulnerability-research-is-cooked/#atom-tag" rel="alternate"/><published>2026-04-03T23:59:08+00:00</published><updated>2026-04-03T23:59:08+00:00</updated><id>https://simonwillison.net/2026/Apr/3/vulnerability-research-is-cooked/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/"&gt;Vulnerability Research Is Cooked&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek's take on the sudden and enormous impact the latest frontier models are having on the field of vulnerability research.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Within the next few months, coding agents will drastically alter both the practice and the economics of exploit development. Frontier model improvement won’t be a slow burn, but rather a step function. Substantial amounts of high-impact vulnerability research (maybe even most of it) will happen simply by pointing an agent at a source tree and typing “find me zero days”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Why are agents so good at this? A combination of baked-in knowledge, pattern matching ability and brute force:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can't design a better problem for an LLM agent than exploitation research.&lt;/p&gt;
&lt;p&gt;Before you feed it a single token of context, a frontier LLM already encodes supernatural amounts of correlation across vast bodies of source code. Is the Linux KVM hypervisor connected to the &lt;code&gt;hrtimer&lt;/code&gt; subsystem, &lt;code&gt;workqueue&lt;/code&gt;, or &lt;code&gt;perf_event&lt;/code&gt;? The model knows.&lt;/p&gt;
&lt;p&gt;Also baked into those model weights: the complete library of documented "bug classes" on which all exploit development builds: stale pointers, integer mishandling, type confusion, allocator grooming, and all the known ways of promoting a wild write to a controlled 64-bit read/write in Firefox.&lt;/p&gt;
&lt;p&gt;Vulnerabilities are found by pattern-matching bug classes and constraint-solving for reachability and exploitability. Precisely the implicit search problems that LLMs are most gifted at solving. Exploit outcomes are straightforwardly testable success/failure trials. An agent never gets bored and will search forever if you tell it to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The article was partly inspired by &lt;a href="https://securitycryptographywhatever.com/2026/03/25/ai-bug-finding/"&gt;this episode of the Security Cryptography Whatever podcast&lt;/a&gt;, where David Adrian, Deirdre Connolly, and Thomas interviewed Anthropic's Nicholas Carlini for 1 hour 16 minutes.&lt;/p&gt;
&lt;p&gt;I just started a new tag here for &lt;a href="https://simonwillison.net/tags/ai-security-research/"&gt;ai-security-research&lt;/a&gt; - it's up to 11 posts already.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/careers"&gt;careers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nicholas-carlini"&gt;nicholas-carlini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;



</summary><category term="security"/><category term="thomas-ptacek"/><category term="careers"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="nicholas-carlini"/><category term="ai-ethics"/><category term="ai-security-research"/></entry><entry><title>Quoting Thomas Ptacek</title><link href="https://simonwillison.net/2026/Feb/8/thomas-ptacek/#atom-tag" rel="alternate"/><published>2026-02-08T02:25:53+00:00</published><updated>2026-02-08T02:25:53+00:00</updated><id>https://simonwillison.net/2026/Feb/8/thomas-ptacek/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/tqbf/status/2019493645888462993"&gt;&lt;p&gt;People on the orange site are laughing at this, assuming it's just an ad and that there's nothing to it. Vulnerability researchers I talk to do not think this is a joke. As an erstwhile vuln researcher myself: do not bet against LLMs on this.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.axios.com/2026/02/05/anthropic-claude-opus-46-software-hunting"&gt;Axios: Anthropic's Claude Opus 4.6 uncovers 500 zero-day flaws in open-source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think vulnerability research might be THE MOST LLM-amenable software engineering problem. Pattern-driven. Huge corpus of operational public patterns. Closed loops. Forward progress from stimulus/response tooling. Search problems.&lt;/p&gt;
&lt;p&gt;Vulnerability research outcomes are in THE MODEL CARDS for frontier labs. Those companies have so much money they're literally distorting the economy. Money buys vuln research outcomes. Why would you think they were faking any of this?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/tqbf/status/2019493645888462993"&gt;Thomas Ptacek&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;



</summary><category term="open-source"/><category term="security"/><category term="thomas-ptacek"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="claude"/><category term="ai-security-research"/></entry><entry><title>The Design &amp; Implementation of Sprites</title><link href="https://simonwillison.net/2026/Jan/15/the-design-implementation-of-sprites/#atom-tag" rel="alternate"/><published>2026-01-15T16:08:27+00:00</published><updated>2026-01-15T16:08:27+00:00</updated><id>https://simonwillison.net/2026/Jan/15/the-design-implementation-of-sprites/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/design-and-implementation/"&gt;The Design &amp;amp; Implementation of Sprites&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I &lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/"&gt;wrote about Sprites last week&lt;/a&gt;. Here's Thomas Ptacek from Fly with the insider details on how they work under the hood.&lt;/p&gt;
&lt;p&gt;I like this framing of them as "disposable computers":&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sprites are ball-point disposable computers. Whatever mark you mean to make, we’ve rigged it so you’re never more than a second or two away from having a Sprite to do it with.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've noticed that new Fly Machines can take a while (up to around a minute) to provision. Sprites solve that by keeping warm pools of unused machines in multiple regions, which is enabled by them all using the same container:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now, today, under the hood, Sprites are still Fly Machines. But they all run from a standard container. Every physical worker knows exactly what container the next Sprite is going to start with, so it’s easy for us to keep pools of “empty” Sprites standing by. The result: a Sprite create doesn’t have any heavy lifting to do; it’s basically just doing the stuff we do when we start a Fly Machine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The most interesting detail is how the persistence layer works. Sprites only charge you for data you have written that differs from the base image and provide ~300ms checkpointing and restores - it turns out that's power by a custom filesystem on top of S3-compatible storage coordinated by Litestream-replicated local SQLite metadata:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We still exploit NVMe, but not as the root of storage. Instead, it’s a read-through cache for a blob on object storage. S3-compatible object stores are the most trustworthy storage technology we have. I can feel my blood pressure dropping just typing the words “Sprites are backed by object storage.” [...]&lt;/p&gt;
&lt;p&gt;The Sprite storage stack is organized around the JuiceFS model (in fact, we currently use a very hacked-up JuiceFS, with a rewritten SQLite metadata backend). It works by splitting storage into data (“chunks”) and metadata (a map of where the “chunks” are). Data chunks live on object stores; metadata lives in fast local storage. In our case, that metadata store is &lt;a href="https://litestream.io"&gt;kept durable with Litestream&lt;/a&gt;. Nothing depends on local storage.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/tqbf/status/2011823480673624434"&gt;@tqbf&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/architecture"&gt;architecture&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/litestream"&gt;litestream&lt;/a&gt;&lt;/p&gt;



</summary><category term="architecture"/><category term="sandboxing"/><category term="sqlite"/><category term="thomas-ptacek"/><category term="fly"/><category term="litestream"/></entry><entry><title>Fly's new Sprites.dev addresses both developer sandboxes and API sandboxes at the same time</title><link href="https://simonwillison.net/2026/Jan/9/sprites-dev/#atom-tag" rel="alternate"/><published>2026-01-09T23:57:12+00:00</published><updated>2026-01-09T23:57:12+00:00</updated><id>https://simonwillison.net/2026/Jan/9/sprites-dev/#atom-tag</id><summary type="html">
    &lt;p&gt;New from Fly.io today: &lt;a href="https://sprites.dev"&gt;Sprites.dev&lt;/a&gt;. Here's their &lt;a href="https://fly.io/blog/code-and-let-live/"&gt;blog post&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=7BfTLlwO4hw"&gt;YouTube demo&lt;/a&gt;. It's an interesting new product that's quite difficult to explain - Fly call it "Stateful sandbox environments with checkpoint &amp;amp; restore" but I see it as hitting two of my current favorite problems: a safe development environment for running coding agents &lt;em&gt;and&lt;/em&gt; an API for running untrusted code in a secure sandbox.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclosure: Fly sponsor some of my work. They did not ask me to write about Sprites and I didn't get preview access prior to the launch. My enthusiasm here is genuine.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#developer-sandboxes"&gt;Developer sandboxes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#storage-and-checkpoints"&gt;Storage and checkpoints&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#really-clever-use-of-claude-skills"&gt;Really clever use of Claude Skills&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#a-sandbox-api"&gt;A sandbox API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#scale-to-zero-billing"&gt;Scale-to-zero billing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Jan/9/sprites-dev/#two-of-my-favorite-problems-at-once"&gt;Two of my favorite problems at once&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="developer-sandboxes"&gt;Developer sandboxes&lt;/h4&gt;
&lt;p&gt;I predicted earlier this week that &lt;a href="https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/#1-year-a-challenger-disaster-for-coding-agent-security"&gt;"we’re due a Challenger disaster with respect to coding agent security"&lt;/a&gt; due to the terrifying way most of us are using coding agents like Claude Code and Codex CLI. Running them in &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; mode (aka YOLO mode, where the agent acts without constantly seeking approval first) unlocks so much more power, but also means that a mistake or a malicious prompt injection can cause all sorts of damage to your system and data.&lt;/p&gt;
&lt;p&gt;The safe way to run YOLO mode is in a robust sandbox, where the worst thing that can happen is the sandbox gets messed up and you have to throw it away and get another one.&lt;/p&gt;
&lt;p&gt;That's the first problem Sprites solves:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;curl https://sprites.dev/install.sh &lt;span class="pl-k"&gt;|&lt;/span&gt; bash

sprite login
sprite create my-dev-environment
sprite console -s my-dev-environment&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's all it takes to get SSH connected to a fresh environment, running in an ~8GB RAM, 8 CPU server. And... Claude Code and Codex and Gemini CLI and Python 3.13 and Node.js 22.20 and a bunch of other tools are already installed.&lt;/p&gt;
&lt;p&gt;The first time you run &lt;code&gt;claude&lt;/code&gt; it neatly signs you in to your existing account with Anthropic. The Sprites VM is persistent so future runs of &lt;code&gt;sprite console -s&lt;/code&gt; will get you back to where you were before.&lt;/p&gt;
&lt;p&gt;... and it automatically sets up port forwarding, so you can run a localhost server on your Sprite and access it from &lt;code&gt;localhost:8080&lt;/code&gt; on your machine.&lt;/p&gt;
&lt;p&gt;There's also a command you can run to assign a public URL to your Sprite, so anyone else can access it if they know the secret URL.&lt;/p&gt;
&lt;h4 id="storage-and-checkpoints"&gt;Storage and checkpoints&lt;/h4&gt;
&lt;p&gt;In &lt;a href="https://fly.io/blog/code-and-let-live/"&gt;the blog post&lt;/a&gt; Kurt Mackey argues that ephemeral, disposable sandboxes are not the best fit for coding agents:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The state of the art in agent isolation is a read-only sandbox. At Fly.io, we’ve been selling that story for years, and we’re calling it: ephemeral sandboxes are obsolete. Stop killing your sandboxes every time you use them. [...]&lt;/p&gt;
&lt;p&gt;If you force an agent to, it’ll work around containerization and do work . But you’re not helping the agent in any way by doing that. They don’t want containers. They don’t want “sandboxes”. They want computers.&lt;/p&gt;
&lt;p&gt;[...] with an actual computer, Claude doesn’t have to rebuild my entire development environment every time I pick up a PR.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Each Sprite gets a proper filesystem which persists in between sessions, even while the Sprite itself shuts down after inactivity. It sounds like they're doing some clever filesystem tricks here, I'm looking forward to learning more about those in the future.&lt;/p&gt;
&lt;p&gt;There are some clues on &lt;a href="https://sprites.dev/"&gt;the homepage&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You read and write to fast, directly attached NVMe storage. Your data then gets written to durable, external object storage. [...]&lt;/p&gt;
&lt;p&gt;You don't pay for allocated filesystem space, just the blocks you write. And it's all TRIM friendly, so your bill goes down when you delete things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The really clever feature is checkpoints. You (or your coding agent) can trigger a checkpoint which takes around 300ms. This captures the entire disk state and can then be rolled back to later.&lt;/p&gt;
&lt;p&gt;For more on how that works, run this in a Sprite:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /.sprite/docs/agent-context.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here's the relevant section:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Checkpoints
- Point-in-time checkpoints and restores available
- Copy-on-write implementation for storage efficiency
- Last 5 checkpoints mounted at `/.sprite/checkpoints`
- Checkpoints capture only the writable overlay, not the base image
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or run this to see the &lt;code&gt;--help&lt;/code&gt; for the command used to manage them:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;sprite-env checkpoints --help&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sprite-env checkpoints - Manage environment checkpoints

USAGE:
    sprite-env checkpoints &amp;lt;subcommand&amp;gt; [options]

SUBCOMMANDS:
    list [--history &amp;lt;ver&amp;gt;]  List all checkpoints (optionally filter by history version)
    get &amp;lt;id&amp;gt;                Get checkpoint details (e.g., v0, v1, v2)
    create                  Create a new checkpoint (auto-versioned)
    restore &amp;lt;id&amp;gt;            Restore from a checkpoint (e.g., v1)

NOTE:
    Checkpoints are versioned as v0, v1, v2, etc.
    Restore returns immediately and triggers an async restore that restarts the environment.
    The last 5 checkpoints are mounted at /.sprite/checkpoints for direct file access.

EXAMPLES:
    sprite-env checkpoints list
    sprite-env checkpoints list --history v1.2.3
    sprite-env checkpoints get v2
    sprite-env checkpoints create
    sprite-env checkpoints restore v1
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="really-clever-use-of-claude-skills"&gt;Really clever use of Claude Skills&lt;/h4&gt;
&lt;p&gt;I'm &lt;a href="https://simonwillison.net/2025/Oct/16/claude-skills/"&gt;a big fan of Skills&lt;/a&gt;, the mechanism whereby Claude Code (and increasingly other agents too) can be given additional capabilities by describing them in Markdown files in a specific directory structure.&lt;/p&gt;
&lt;p&gt;In a smart piece of design, Sprites uses pre-installed skills to teach Claude how Sprites itself works. This means you can ask Claude on the machine how to do things like open up ports and it will talk you through the process.&lt;/p&gt;
&lt;p&gt;There's all sorts of interesting stuff in the &lt;code&gt;/.sprite&lt;/code&gt; folder on that machine - digging in there is a great way to learn more about how Sprites works.&lt;/p&gt;
&lt;h4 id="a-sandbox-api"&gt;A sandbox API&lt;/h4&gt;
&lt;p&gt;Also from my predictions post earlier this week: &lt;a href="https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/#1-year-we-re-finally-going-to-solve-sandboxing"&gt;"We’re finally going to solve sandboxing"&lt;/a&gt;. I am obsessed with this problem: I want to be able to run untrusted code safely, both on my personal devices and in the context of web services I'm building for other people to use.&lt;/p&gt;
&lt;p&gt;I have &lt;em&gt;so many things&lt;/em&gt; I want to build that depend on being able to take untrusted code - from users or from LLMs or from LLMs-driven-by-users - and run that code in a sandbox where I can be confident that the blast radius if something goes wrong is tightly contained.&lt;/p&gt;
&lt;p&gt;Sprites offers a clean &lt;a href="https://sprites.dev/api"&gt;JSON API&lt;/a&gt; for doing exactly that, plus client libraries in &lt;a href="https://github.com/superfly/sprites-go"&gt;Go&lt;/a&gt; and &lt;a href="https://github.com/superfly/sprites-js"&gt;TypeScript&lt;/a&gt; and coming-soon &lt;a href="https://github.com/superfly/sprites-py"&gt;Python&lt;/a&gt; and &lt;a href="https://github.com/superfly/sprites-ex"&gt;Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From their quick start:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Create a new sprite
curl -X PUT https://api.sprites.dev/v1/sprites/my-sprite \
-H "Authorization: Bearer $SPRITES_TOKEN"

# Execute a command
curl -X POST https://api.sprites.dev/v1/sprites/my-sprite/exec \
-H "Authorization: Bearer $SPRITES_TOKEN" \
-d '{"command": "echo hello"}'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also checkpoint and rollback via the API, so you can get your environment exactly how you like it, checkpoint it, run a bunch of untrusted code, then roll back to the clean checkpoint when you're done.&lt;/p&gt;
&lt;p&gt;Managing network access is an important part of maintaining a good sandbox. The Sprites API lets you &lt;a href="https://sprites.dev/api/sprites/policies"&gt;configure network access policies&lt;/a&gt; using a DNS-based allow/deny list like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;curl -X POST \
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;https://api.sprites.dev/v1/sprites/{name}/policy/network&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; \
  -H &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Authorization: Bearer &lt;span class="pl-smi"&gt;$SPRITES_TOKEN&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; \
  -H &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Content-Type: application/json&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; \
  -d &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;{&lt;/span&gt;
&lt;span class="pl-s"&gt;    "rules": [&lt;/span&gt;
&lt;span class="pl-s"&gt;      {&lt;/span&gt;
&lt;span class="pl-s"&gt;        "action": "allow",&lt;/span&gt;
&lt;span class="pl-s"&gt;        "domain": "github.com"&lt;/span&gt;
&lt;span class="pl-s"&gt;      },&lt;/span&gt;
&lt;span class="pl-s"&gt;      {&lt;/span&gt;
&lt;span class="pl-s"&gt;        "action": "allow",&lt;/span&gt;
&lt;span class="pl-s"&gt;        "domain": "*.npmjs.org"&lt;/span&gt;
&lt;span class="pl-s"&gt;      }&lt;/span&gt;
&lt;span class="pl-s"&gt;    ]&lt;/span&gt;
&lt;span class="pl-s"&gt;  }&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="scale-to-zero-billing"&gt;Scale-to-zero billing&lt;/h4&gt;
&lt;p&gt;Sprites have scale-to-zero baked into the architecture. They go to sleep after 30 seconds of inactivity, wake up quickly when needed and bill you for just the CPU hours, RAM hours and GB-hours of storage you use while the Sprite is awake.&lt;/p&gt;
&lt;p&gt;Fly &lt;a href="https://sprites.dev/#billing"&gt;estimate&lt;/a&gt; a 4 hour intensive coding session as costing around 46 cents, and a low traffic web app with 30 hours of wake time per month at ~$4.&lt;/p&gt;
&lt;p&gt;(I calculate that a web app that consumes all 8 CPUs and all 8GBs of RAM 24/7 for a month would cost ((7 cents * 8 * 24 * 30) + (4.375 cents * 8 * 24 * 30)) / 100  = $655.2 per month, so don't necessarily use these as your primary web hosting solution for an app that soaks up all available CPU and RAM!)&lt;/p&gt;
&lt;h4 id="two-of-my-favorite-problems-at-once"&gt;Two of my favorite problems at once&lt;/h4&gt;
&lt;p&gt;I was hopeful that Fly would enter the developer-friendly sandbox API market, especially given other entrants from companies like &lt;a href="https://sandbox.cloudflare.com/"&gt;Cloudflare&lt;/a&gt; and &lt;a href="https://modal.com/docs/guide/sandboxes"&gt;Modal&lt;/a&gt; and &lt;a href="https://e2b.dev/"&gt;E2B&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I did not expect that they'd tackle the developer sandbox problem at the same time, and with the same product!&lt;/p&gt;
&lt;p&gt;My one concern here is that it makes the product itself a little harder to explain.&lt;/p&gt;
&lt;p&gt;I'm already spinning up some prototypes of sandbox-adjacent things I've always wanted to build, and early signs are very promising. I'll write more about these as they turn into useful projects.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Here's some &lt;a href="https://news.ycombinator.com/item?id=46557825#46560748"&gt;additional colour&lt;/a&gt; from Thomas Ptacek on Hacker News:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This has been in the works for quite awhile here. We put a long bet on "slow create fast start/stop" --- which is a really interesting and useful shape for execution environments --- but it didn't make sense to sandboxers, so "fast create" has been the White Whale at Fly.io for over a year.&lt;/p&gt;
&lt;/blockquote&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="sandboxing"/><category term="thomas-ptacek"/><category term="ai"/><category term="fly"/><category term="coding-agents"/></entry><entry><title>You should write an agent</title><link href="https://simonwillison.net/2025/Nov/7/you-should-write-an-agent/#atom-tag" rel="alternate"/><published>2025-11-07T04:40:12+00:00</published><updated>2025-11-07T04:40:12+00:00</updated><id>https://simonwillison.net/2025/Nov/7/you-should-write-an-agent/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/everyone-write-an-agent/"&gt;You should write an agent&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek on the Fly blog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agents are the most surprising programming experience I’ve had in my career. Not because I’m awed by the magnitude of their powers — I like them, but I don’t like-like them. It’s because of how easy it was to get one up on its legs, and how much I learned doing that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think he's right: hooking up a simple agentic loop that prompts an LLM and runs a tool for it any time it request one really is the new "hello world" of AI engineering.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=45840088"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-agents"&gt;ai-agents&lt;/a&gt;&lt;/p&gt;



</summary><category term="thomas-ptacek"/><category term="ai"/><category term="fly"/><category term="generative-ai"/><category term="llms"/><category term="ai-agents"/></entry><entry><title>My AI Skeptic Friends Are All Nuts</title><link href="https://simonwillison.net/2025/Jun/2/my-ai-skeptic-friends-are-all-nuts/#atom-tag" rel="alternate"/><published>2025-06-02T23:56:49+00:00</published><updated>2025-06-02T23:56:49+00:00</updated><id>https://simonwillison.net/2025/Jun/2/my-ai-skeptic-friends-are-all-nuts/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/youre-all-nuts/"&gt;My AI Skeptic Friends Are All Nuts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek's frustrated tone throughout this piece perfectly captures how it feels sometimes to be an experienced programmer trying to argue that "LLMs are actually really useful" in many corners of the internet.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some of the smartest people I know share a bone-deep belief that AI is a fad — the next iteration of NFT mania. I’ve been reluctant to push back on them, because, well, they’re smarter than me. But their arguments are unserious, and worth confronting. Extraordinarily talented people are doing work that LLMs already do better, out of spite. [...]&lt;/p&gt;
&lt;p&gt;You’ve always been responsible for what you merge to &lt;code&gt;main&lt;/code&gt;. You were five years go. And you are tomorrow, whether or not you use an LLM. [...]&lt;/p&gt;
&lt;p&gt;Reading other people’s code is part of the job. If you can’t metabolize the boring, repetitive code an LLM generates: skills issue! How are you handling the chaos human developers turn out on a deadline?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And on the threat of AI taking jobs from engineers (with a link to an old comment of mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=43775358#43776612"&gt;So does open source.&lt;/a&gt; We used to pay good money for databases.&lt;/p&gt;
&lt;p&gt;We're a field premised on automating other people's jobs away. "Productivity gains," say the economists. You get what that means, right? Fewer people doing the same stuff. Talked to a travel agent lately? Or a floor broker? Or a record store clerk? Or a darkroom tech?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The post has already attracted &lt;a href="https://news.ycombinator.com/item?id=44163063"&gt;695 comments&lt;/a&gt; on Hacker News in just two hours, which feels like some kind of record even by the usual standards of fights about AI on the internet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Thomas, another hundred or so comments &lt;a href="https://news.ycombinator.com/item?id=44163063#44165137"&gt;later&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lot of people are misunderstanding the goal of the post, which is not necessarily to persuade them, but rather to disrupt a static, unproductive equilibrium of uninformed arguments about how this stuff works. The commentary I've read today has to my mind vindicated that premise.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://bsky.app/profile/sockpuppet.org/post/3lqnoo5irzs2b"&gt;@sockpuppet.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/hacker-news"&gt;hacker-news&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;&lt;/p&gt;



</summary><category term="hacker-news"/><category term="thomas-ptacek"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/></entry><entry><title>I Went To SQL Injection Court</title><link href="https://simonwillison.net/2025/Feb/25/i-went-to-sql-injection-court/#atom-tag" rel="alternate"/><published>2025-02-25T22:45:57+00:00</published><updated>2025-02-25T22:45:57+00:00</updated><id>https://simonwillison.net/2025/Feb/25/i-went-to-sql-injection-court/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/"&gt;I Went To SQL Injection Court&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek talks about his ongoing involvement as an expert witness in an Illinois legal battle lead by Matt Chapman over whether a SQL schema (e.g. for the CANVAS parking ticket database) should be accessible to Freedom of Information (FOIA) requests against the Illinois state government.&lt;/p&gt;
&lt;p&gt;They eventually lost in the Illinois Supreme Court, but there's still hope in the shape of &lt;a href="https://legiscan.com/IL/bill/SB0226/2025"&gt;IL SB0226&lt;/a&gt;, a proposed bill that would amend the FOIA act to ensure "that the public body shall provide a sufficient description of the structures of all databases under the control of the public body to allow a requester to request the public body to perform specific database queries".&lt;/p&gt;
&lt;p&gt;Thomas &lt;a href="https://news.ycombinator.com/item?id=43175628#43175758"&gt;posted this comment&lt;/a&gt; on Hacker News:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Permit me a PSA about local politics: engaging in national politics is bleak and dispiriting, like being a gnat bouncing off the glass plate window of a skyscraper. Local politics is, by contrast, extremely responsive. I've gotten things done --- including a law passed --- in my spare time and at practically no expense (&lt;em&gt;drastically&lt;/em&gt; unlike national politics).&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=43175628"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/data-journalism"&gt;data-journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/government"&gt;government&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/law"&gt;law&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/politics"&gt;politics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sql"&gt;sql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sql-injection"&gt;sql-injection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;&lt;/p&gt;



</summary><category term="data-journalism"/><category term="databases"/><category term="government"/><category term="law"/><category term="politics"/><category term="sql"/><category term="sql-injection"/><category term="thomas-ptacek"/></entry><entry><title>Run a prompt to generate and execute jq programs using llm-jq</title><link href="https://simonwillison.net/2024/Oct/27/llm-jq/#atom-tag" rel="alternate"/><published>2024-10-27T04:26:36+00:00</published><updated>2024-10-27T04:26:36+00:00</updated><id>https://simonwillison.net/2024/Oct/27/llm-jq/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="https://github.com/simonw/llm-jq"&gt;llm-jq&lt;/a&gt; is a brand new plugin for &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; which lets you pipe JSON directly into the &lt;code&gt;llm jq&lt;/code&gt; command along with a human-language description of how you'd like to manipulate that JSON and have a &lt;a href="https://jqlang.github.io/jq/"&gt;jq&lt;/a&gt; program generated and executed for you on the fly.&lt;/p&gt;

&lt;p&gt;Thomas Ptacek &lt;a href="https://twitter.com/tqbf/status/1850350668965359801"&gt;on Twitter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The JQ CLI should just BE a ChatGPT client, so there's no pretense of actually understanding this syntax. Cut out the middleman, just look up what I'm trying to do, for me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;a href="https://xkcd.com/356/"&gt;couldn't resist&lt;/a&gt; writing a plugin. Here's an example of &lt;code&gt;llm-jq&lt;/code&gt; in action:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre class="notranslate"&gt;llm install llm-jq
curl -s https://api.github.com/repos/simonw/datasette/issues &lt;span class="pl-k"&gt;|&lt;/span&gt; \
  llm jq &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;count by user login, top 3&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This outputs the following:&lt;/p&gt;
&lt;div class="highlight highlight-source-json"&gt;&lt;pre&gt;[
  {
    &lt;span class="pl-ent"&gt;"login"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;simonw&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
    &lt;span class="pl-ent"&gt;"count"&lt;/span&gt;: &lt;span class="pl-c1"&gt;11&lt;/span&gt;
  },
  {
    &lt;span class="pl-ent"&gt;"login"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;king7532&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
    &lt;span class="pl-ent"&gt;"count"&lt;/span&gt;: &lt;span class="pl-c1"&gt;5&lt;/span&gt;
  },
  {
    &lt;span class="pl-ent"&gt;"login"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;dependabot[bot]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
    &lt;span class="pl-ent"&gt;"count"&lt;/span&gt;: &lt;span class="pl-c1"&gt;2&lt;/span&gt;
  }
]
&lt;span style="color: blue"&gt;group_by(.user.login) | map({login: .[0].user.login, count: length}) | sort_by(-.count) | .[0:3]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The JSON result is sent to standard output, the &lt;code&gt;jq&lt;/code&gt; program it generated and executed is sent to standard error. Add the &lt;code&gt;-s/--silent&lt;/code&gt; option to tell it not to output the program, or the &lt;code&gt;-v/--verbose&lt;/code&gt; option for verbose output that shows the prompt it sent to the LLM as well.&lt;/p&gt;
&lt;p&gt;Under the hood it passes the first 1024 bytes of the JSON piped to it plus the program description "count by user login, top 3" to the default LLM model (usually &lt;code&gt;gpt-4o-mini&lt;/code&gt; unless you set another with e.g. &lt;code&gt;llm models default claude-3.5-sonnet&lt;/code&gt;) and system prompt. It then runs &lt;code&gt;jq&lt;/code&gt; in a subprocess and pipes in the full JSON that was passed to it.&lt;/p&gt;
&lt;p&gt;Here's the system prompt it uses, adapted from my &lt;a href="https://github.com/simonw/llm-cmd"&gt;llm-cmd plugin&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code class="notranslate"&gt;Based on the example JSON snippet and the desired query, write a jq program&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="notranslate"&gt;Return only the jq program to be executed as a raw string, no string delimiters wrapping it, no yapping, no markdown, no fenced code blocks, what you return will be passed to subprocess.check_output('jq', [...]) directly. For example, if the user asks: extract the name of the first person You return only: .people[0].name&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;a href="https://gist.github.com/simonw/484d878877f53537f38e48a7a3845df2"&gt;used Claude&lt;/a&gt; to figure out how to pipe content from the parent process to the child and detect and return the correct exit code.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/llm-jq-card.jpg" alt="Example terminal screenshot of llm jq with the verbose option." style="max-width: 100%" /&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/cli"&gt;cli&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jq"&gt;jq&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-engineering"&gt;prompt-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="cli"/><category term="plugins"/><category term="projects"/><category term="thomas-ptacek"/><category term="ai"/><category term="jq"/><category term="prompt-engineering"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="llm"/></entry><entry><title>Making Machines Move</title><link href="https://simonwillison.net/2024/Jul/30/making-machines-move/#atom-tag" rel="alternate"/><published>2024-07-30T21:45:32+00:00</published><updated>2024-07-30T21:45:32+00:00</updated><id>https://simonwillison.net/2024/Jul/30/making-machines-move/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/machine-migrations/"&gt;Making Machines Move&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Another deep technical dive into Fly.io infrastructure from Thomas Ptacek, this time describing how they can quickly boot up an instance with a persistent volume on a new host (for things like zero-downtime deploys) using a block-level cloning operation, so the new instance gets a volume that becomes accessible instantly, serving proxied blocks of data until the new volume has been completely migrated from the old host.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ops"&gt;ops&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zero-downtime"&gt;zero-downtime&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="ops"/><category term="thomas-ptacek"/><category term="zero-downtime"/><category term="fly"/></entry><entry><title>Macaroons Escalated Quickly</title><link href="https://simonwillison.net/2024/Jan/31/macaroons-escalated-quickly/#atom-tag" rel="alternate"/><published>2024-01-31T16:57:23+00:00</published><updated>2024-01-31T16:57:23+00:00</updated><id>https://simonwillison.net/2024/Jan/31/macaroons-escalated-quickly/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/macaroons-escalated-quickly/"&gt;Macaroons Escalated Quickly&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek’s follow-up on Macaroon tokens, based on a two year project to implement them at Fly.io. The way they let end users calculate new signed tokens with additional limitations applied to them (“caveats” in Macaroon terminology) is fascinating, and allows for some very creative solutions.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=39205676"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="security"/><category term="thomas-ptacek"/><category term="fly"/></entry><entry><title>Carving the Scheduler Out of Our Orchestrator</title><link href="https://simonwillison.net/2023/Feb/2/carving-the-scheduler-out-of-our-orchestrator/#atom-tag" rel="alternate"/><published>2023-02-02T21:46:35+00:00</published><updated>2023-02-02T21:46:35+00:00</updated><id>https://simonwillison.net/2023/Feb/2/carving-the-scheduler-out-of-our-orchestrator/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/carving-the-scheduler-out-of-our-orchestrator/"&gt;Carving the Scheduler Out of Our Orchestrator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek describes Fly’s new custom-built alternative to Nomad and Kubernetes in detail, including why they eventually needed to build something custom to best serve their platform. In doing so he provides the best explanation I’ve ever seen of what an orchestration system actually does.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://infosec.exchange/@tqbf/109796131985160831"&gt;@tqbf&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="thomas-ptacek"/><category term="kubernetes"/><category term="fly"/></entry><entry><title>Quoting Thomas Ptacek</title><link href="https://simonwillison.net/2022/Sep/16/thomas-ptacek/#atom-tag" rel="alternate"/><published>2022-09-16T01:49:27+00:00</published><updated>2022-09-16T01:49:27+00:00</updated><id>https://simonwillison.net/2022/Sep/16/thomas-ptacek/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://news.ycombinator.com/item?id=32857811"&gt;&lt;p&gt;[SQLite is] a database that in full-stack culture has been relegated to "unit test database mock" for about 15 years that is (1) surprisingly capable as a SQL engine, (2) the simplest SQL database to get your head around and manage, and (3) can embed directly in literally every application stack, which is especially interesting in latency-sensitive and globally-distributed applications.&lt;/p&gt;
&lt;p&gt;Reason (3) is clearly our ulterior motive here, so we're not disinterested: our model user deploys a full-stack app (Rails, Elixir, Express, whatever) in a bunch of regions around the world, hoping for sub-100ms responses for users in most places around the world. Even within a single data center, repeated queries to SQL servers can blow that budget. Running an in-process SQL server neatly addresses it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://news.ycombinator.com/item?id=32857811"&gt;Thomas Ptacek&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sql"&gt;sql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="sql"/><category term="sqlite"/><category term="thomas-ptacek"/><category term="fly"/></entry><entry><title>Quoting Thomas Ptacek</title><link href="https://simonwillison.net/2022/Jul/7/thomas-ptacek/#atom-tag" rel="alternate"/><published>2022-07-07T20:31:32+00:00</published><updated>2022-07-07T20:31:32+00:00</updated><id>https://simonwillison.net/2022/Jul/7/thomas-ptacek/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://fly.io/blog/soc2-the-screenshots-will-continue-until-security-improves/"&gt;&lt;p&gt;SOC2 is about the security of the company, not the company’s products. A SOC2 audit would tell you something about whether the customer support team could pop a shell on production machines; it wouldn’t tell you anything about whether an attacker could pop a shell with a SQL Injection vulnerability.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://fly.io/blog/soc2-the-screenshots-will-continue-until-security-improves/"&gt;Thomas Ptacek&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sql-injection"&gt;sql-injection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="security"/><category term="sql-injection"/><category term="thomas-ptacek"/><category term="fly"/></entry><entry><title>API Tokens: A Tedious Survey</title><link href="https://simonwillison.net/2021/Aug/25/api-tokens-a-tedious-survey/#atom-tag" rel="alternate"/><published>2021-08-25T00:12:13+00:00</published><updated>2021-08-25T00:12:13+00:00</updated><id>https://simonwillison.net/2021/Aug/25/api-tokens-a-tedious-survey/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/api-tokens-a-tedious-survey/"&gt;API Tokens: A Tedious Survey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek reviews different approaches to implementing secure API tokens, from simple random strings stored in a database through various categories of signed token to exotic formats like Macaroons and Biscuits, both new to me.&lt;/p&gt;

&lt;p&gt;Macaroons carry a signed list of restrictions with them, but combine it with a mechanism where a client can add their own additional restrictions, sign the combination and pass the token on to someone else.&lt;/p&gt;

&lt;p&gt;Biscuits are similar, but “embed Datalog programs to evaluate whether a token allows an operation”.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="security"/><category term="thomas-ptacek"/><category term="fly"/></entry><entry><title>Sandboxing and Workload Isolation</title><link href="https://simonwillison.net/2020/Jul/30/sandboxing-and-workload-isolation/#atom-tag" rel="alternate"/><published>2020-07-30T22:19:21+00:00</published><updated>2020-07-30T22:19:21+00:00</updated><id>https://simonwillison.net/2020/Jul/30/sandboxing-and-workload-isolation/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/sandboxing-and-workload-isolation/"&gt;Sandboxing and Workload Isolation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Fly.io run other people’s code in containers, so workload isolation is a Big Deal for them. This blog post goes deep into the history of isolation and the various different approaches you can take, and fills me with confidence that the team at Fly.io know their stuff. I got to the bottom and found it had been written by Thomas Ptacek, which didn’t surprise me in the slightest.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=24001246"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/docker"&gt;docker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="sandboxing"/><category term="security"/><category term="thomas-ptacek"/><category term="docker"/><category term="fly"/></entry><entry><title>How CDNs Generate Certificates</title><link href="https://simonwillison.net/2020/Jun/26/how-cdns-generate-certificates/#atom-tag" rel="alternate"/><published>2020-06-26T00:03:45+00:00</published><updated>2020-06-26T00:03:45+00:00</updated><id>https://simonwillison.net/2020/Jun/26/how-cdns-generate-certificates/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/how-cdns-generate-certificates/"&gt;How CDNs Generate Certificates&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek (now at Fly) describes in intricate detail the challenges faced by large-scale hosting providers that want to securely issue LetsEncrypt certificates for customer domains. Lots of detail here on the different ACME challenges supported by LetsEncrypt and why the new tls-alpn-01 challenge is the right option for operating at scale.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/acme"&gt;acme&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/certificates"&gt;certificates&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/domains"&gt;domains&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tls"&gt;tls&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="acme"/><category term="certificates"/><category term="domains"/><category term="thomas-ptacek"/><category term="tls"/><category term="fly"/></entry><entry><title>A Roundup Of Leopard Security Features</title><link href="https://simonwillison.net/2007/Oct/31/matasano/#atom-tag" rel="alternate"/><published>2007-10-31T17:30:56+00:00</published><updated>2007-10-31T17:30:56+00:00</updated><id>https://simonwillison.net/2007/Oct/31/matasano/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.matasano.com/log/981/a-roundup-of-leopard-security-features/"&gt;A Roundup Of Leopard Security Features&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek’s overview of the new security features in Leopard. Guest Accounts are worthless from a security P.O.V., but I still plan to use one for our PowerBook that’s now just a media player.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://daringfireball.net/linked/2007/october"&gt;John Gruber&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/leopard"&gt;leopard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;&lt;/p&gt;



</summary><category term="apple"/><category term="leopard"/><category term="macos"/><category term="security"/><category term="thomas-ptacek"/></entry></feed>