<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Jonathan Looi]]></title><description><![CDATA[Investigating cyber and AI things]]></description><link>https://jonathanlooi.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png</url><title>Jonathan Looi</title><link>https://jonathanlooi.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 15 May 2026 01:28:37 GMT</lastBuildDate><atom:link href="https://jonathanlooi.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jonathan Looi]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jonathanlooi@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jonathanlooi@substack.com]]></itunes:email><itunes:name><![CDATA[Jonathan Looi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jonathan Looi]]></itunes:author><googleplay:owner><![CDATA[jonathanlooi@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jonathanlooi@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jonathan Looi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Occasional Bouts of Heroism]]></title><description><![CDATA[There was a concept at Google that I always had mixed feelings about.]]></description><link>https://jonathanlooi.com/p/occasional-bouts-of-heroism</link><guid isPermaLink="false">https://jonathanlooi.com/p/occasional-bouts-of-heroism</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 09 May 2026 22:51:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hX3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hX3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hX3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 424w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 848w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1272w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" width="1012" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1012,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:567206,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/197052297?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hX3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 424w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 848w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1272w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There was a concept at Google that I always had mixed feelings about. It is called the &#8220;No Heroes&#8221; rule<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, and the argument goes like this: When an individual has to do a heroic task (ex: work 18 hours straight to prevent an outage) that effort is masking a systemic and institutional gap. The right response is to fix the system so heroism becomes unnecessary. In a mature, high performing engineering org, there should be no heroes.</p><p>No Heroes is generally the correct engineering doctrine in a mature organization. But I believe it is wrong as a theory of how institutions actually get things done, and is wrong about human nature.</p><p>Charlie Munger once described Google&#8217;s headquarters as a &#8220;very rich kindergarten.&#8221; Munching on snacks in the micro-kitchen, I couldn&#8217;t help but feel I was getting soft, and that the organization itself was getting soft. No Heroes removes the veneration of going hard, which over time selects for a different kind of employee. Google is an unusual place and was a privilege to work at, but a No Heroes ethos paired with a culture of comfort gets dangerous the moment the org has to get medieval and go from 0 to 1.</p><p>Even inside Google, I was often surprised to find that one engineer happened to know everything about a system and was the major driving force behind it. Most progress, even inside large institutions, is made by one person with the drive and skill to pull it off. The xkcd &#8220;Dependency&#8221; comic about modern infrastructure resting on &#8220;a project some random person in Nebraska has been thanklessly maintaining since 2003&#8221; is a joke and also true.</p><p>This is the double-edged sword. There is a concept I came across recently called the Bus Factor. It refers to the number of people who would need to disappear (get hit by a bus) before a project loses enough critical knowledge to continue. A 2015 study found that for 64% of the top 133 GitHub projects, the Bus Factor was below 2<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Heroism without institutional backing produces fragility.</p><p>I am in many ways amenable to the Great Man of History theory. It is hard to operate in the startup world without believing at least parts of it. The founder is that great (wo)man, single-handedly pulling the company, and sometimes the world, along into something generational.</p><p>Startups, and the startup mindset, are organized entirely around heroism. It is all &#8220;cracked 10x engineers&#8221; and going Founder Mode, and it really does take a uniquely visionary and gritty individual to go from 0 to 1. The cost is that 24/7 heroism is often unsustainable, and a major cause of startup death is the founder giving up. Startups need at least some institutional scaffolding so that the company can survive a key person leaving. But Brian Chesky&#8217;s vision of Founder Mode is essentially that the founder-as-hero archetype should never end, even as a startup scales up even into IPO. So in the vision of Founder Mode, the company is the founder. The founder absolutely should understand the product best, but the same instinct, taken too far, can produce tyrannical micromanagement and cults of personality.</p><p>The military is a great example of holding &#8220;No Heroes&#8221; and &#8220;celebration of heroes&#8221; in tension simultaneously. Individuals join as they are, and the institution forges them into a disciplined whole greater than the sum of its parts. Individuals are made interchangeable, and the institution is designed to keep functioning regardless of who fills any one role. And yet military history is overwhelmingly a history of named individuals doing heroic, extraordinary things in service of the mission. Nobody gets a Medal of Honor in a mission where everything goes to plan. We have after action reports to root out systemic failures and learn from mistakes, but we also celebrate, honor, and encourage heroic acts of service.</p><p>Heroism and institution are complementary and must be calibrated to meet the moment. Google could probably use a few more heroes (Sergey Brin getting back in the weeds to build agentic coding is a great example of this). Open source probably needs fewer heroes and more structural support, so that critical infrastructure does not rest on one burned out maintainer. Startups could use more institutional scaffolding, so founders can survive long enough to build something durable. I do not have a clean rule for which mode any given organization needs. The hard judgement call is knowing which one your organization needs more of, and when.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Google SRE handbook on No Heroes: <a href="https://sre.google/resources/practices-and-processes/no-heroes/">https://sre.google/resources/practices-and-processes/no-heroes/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Bus Factor study: <a href="https://www.ecirtam.net/autoblogs/autoblogs/wwwframablogorg_0150d398ec69403f962b63cd890a319026e932de/media/97b9a7ec.1233.pdf">https://www.ecirtam.net/autoblogs/autoblogs/wwwframablogorg_0150d398ec69403f962b63cd890a319026e932de/media/97b9a7ec.1233.pdf</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Asymmetric Inference]]></title><description><![CDATA[The future of cyber warfare as an industrial capacity problem]]></description><link>https://jonathanlooi.com/p/asymmetric-inference</link><guid isPermaLink="false">https://jonathanlooi.com/p/asymmetric-inference</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 10:08:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been reading a lot of (good) hot takes on Anthropic&#8217;s Mythos Preview. Much of it has boiled down to &#8220;wow this is crazy&#8221; (I agree) and &#8220;defenders need to use AI to fight attackers with AI&#8221; (I was at RSA two weeks ago and it&#8217;s cliche, but I also agree).</p><p>Most of the chatter is about speed. Speed to vuln discovery and exploitation, versus speed of patching and responding. That&#8217;s definitely a problem which needs to be solved, but I want to take this in a slightly different direction and focus on the asymmetric cost of inference.</p><p>Mythos is genuinely, concerningly capable, and my assumption is other labs will likely close the gap in 3&#8211;6 months, and open source possibly in 12 (don&#8217;t hold me to this prediction). Mythos is also rumored to be extremely large, expensive to train, and expensive to run. Now that frontier models are better than humans at offensive cyber tasks, the bottleneck stops being cyber talent and becomes industrial capacity.</p><p>As these agents run 24/7/365, cyberwarfare starts to look like a contest of which nation can sustain the most datacenters and gigawatts.</p><p>This means the defender&#8217;s response isn&#8217;t just to &#8220;use AI too&#8221;. It&#8217;s to balance out the compute cost ratio.</p><p>How much inference does it take for an offensive AI agent to go from an external-facing web app to domain admin? My (somewhat) educated guesstimate: not that high. And it&#8217;s going to take significantly more inference and compute to ingest logs from each endpoint, correlate them, get an agent to triage, and then do the remediation. From an inference standpoint, defense (as we currently do it with the SOC model) is probably more expensive out of the gate.</p><p>The analogy I like to work with is that of kinetic air defense. Patriot PAC-3 interceptors run about $4 million each, while Shahed drones cost roughly $20,000 to $50,000. Not to mention production time and industrial capacity limitations. Whoever forces the other side into the wrong side of the cost curve wins the war of attrition.</p><p>AI-enabled cyber is heading to the same place. &#8220;Can the model do it&#8221; will no longer be the question - we know it can, and if it&#8217;s can&#8217;t it&#8217;ll probably be able to in the next 12 months. The question I&#8217;m most interested in now: what&#8217;s the cost ratio, per campaign, per target, between the cheapest offensive capability and the cheapest defense that neutralizes it?</p><p>If you&#8217;re building toward structurally cheaper defensive inference - I&#8217;d love to hear from you!</p>]]></content:encoded></item><item><title><![CDATA[Prompt Injection as Defense]]></title><description><![CDATA[How to impede agentic attackers]]></description><link>https://jonathanlooi.com/p/prompt-injection-as-defense</link><guid isPermaLink="false">https://jonathanlooi.com/p/prompt-injection-as-defense</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 10:05:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If most offensive cyberattacks will soon be conducted by AI agents, an entirely new realm of defensive opportunities opens up.</p><p>Anyone who has built or worked with AI agents knows they can be superhuman yet also quite dumb. They depend on the right prompting, context management, tool calling, and task planning to function at all. Of course, there are brilliant engineers working nonstop to close these gaps, and I believe they will. But the architectural properties of LLM-based agents introduce inherent weaknesses that human attackers don&#8217;t have. Defenders should exploit them.</p><p>The MITRE ATLAS framework maps adversarial attacks against AI systems. It&#8217;s a threat model for defending your own AI. But I propose flipping it - use it as a guide for how to attack agents trying to attack your network.</p><p>A few examples:</p><ul><li><p><strong>Prompt Injection</strong> -&gt; Anything an attacker pipes into an LLM should be contested ground. Logs, error messages, READMEs, API responses, etc. Embed injections everywhere. Make attackers second-guess every bit of context they ingest.</p></li><li><p><strong>Memory and State Corruption</strong> -&gt; Agents with persistent memory or long-running task state are especially fragile. Honeypots and canaries have always existed, but now they can be tuned to exploit how agents plan. Corrupt the planning stage, and you&#8217;ve derailed every downstream step. You&#8217;ll also be forcing agents to burn tokens chasing fake leads.</p></li><li><p><strong>Tool Poisoning</strong> -&gt; Attackers living off the land rely on existing binaries. Agents trust the outputs of the tools they call. Poison those outputs (in a way that doesn&#8217;t deceive legitimate users).</p></li><li><p><strong>Context Window Flooding</strong> -&gt; What if we weaponized the &#8220;Lost in the Middle&#8221; problem? LLMs reliably lose track of information buried in long contexts. Flood the zone.</p></li><li><p><strong>Corrupt the Validation Loop</strong> -&gt; Well-built agents usually have self-checks, such as running tests or validating against initial requirements. If tests pass, an agent usually thinks it&#8217;s all good and moves on to the next task.</p></li></ul><p>You may notice that much of this centers around deception! More on that in a future piece.</p><p>I believe the future of cyber defense is not to replicate the existing SOC structure with AI agents. It&#8217;s to build solutions that asymmetrically impose costs on attackers, however they evolve.</p><p>Now is not the time to mope about how AI-enabled attackers are going to go so much faster, and find so many more vulns, and move at such scale - we know they will. Agents introduce a whole class of vulnerabilities that humans don&#8217;t have. The goal isn&#8217;t perfect deception or stopping agents completely. It&#8217;s about impeding every step and imposing costs, making agentic attackers distrust their own decisions at every stage of the kill chain.</p><p>&#8212;</p><p>If you are building solutions to attack AI agents (for defense), I want to hear from you!</p>]]></content:encoded></item><item><title><![CDATA[My agentic coding setup [April 2026]]]></title><description><![CDATA[How I'm coding today and how it's changed over time]]></description><link>https://jonathanlooi.com/p/my-agentic-coding-setup-april-2026</link><guid isPermaLink="false">https://jonathanlooi.com/p/my-agentic-coding-setup-april-2026</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 08:47:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Occasionally I&#8217;ll scroll Twitter and see people claiming they run 10+ coding agents simultaneously. I&#8217;m genuinely curious how they&#8217;re pulling this off. Is this actually their workflow, or is it performative?</p><p>As a former professional software engineer, it&#8217;s insane just how much the profession has changed in the past 2 years, and especially in the past few months.  2 years ago I was still hand-coding with VSCode, augmented with a little line completion. 1 year ago I was using Cursor with GPT 4.5, letting it a file or two at a time, reading and reviewing all code the AI produced. Today I&#8217;m a whole lot more hands off. </p><p>It&#8217;s gone from me only trusting AI to complete single lines of code, to me trusting AI to write functions, to me trusting AI to write files, to me trusting AI to write entire features (and getting AI to review the code also).</p><p>I&#8217;ve been experimenting heavily with (semi) long-running coding agents lately, and my current max is around 5 concurrent agents. There are two big bottlenecks:</p><ul><li><p>My own mental context window. I could be using an orchestrator agent with a kanban board to manage those agents, but I actually want to be hands on with the business logic. After 5 agents, I can no longer keep track of what&#8217;s going on. Possibly a skill issue.</p></li><li><p>My current codebases aren&#8217;t big enough for that many agents to work discrete features without bumping into each other and causing merge conflicts.</p></li></ul><h2>My current setup</h2><p>Given the speed of changes in the devtools ecosystem, I&#8217;ve been tweaking my coding setup weekly. This is my current setup as of April 2026:</p><ul><li><p><a href="https://www.conductor.build/">Conductor</a> for managing agents (free)</p><ul><li><p>As much as I like iTerm + Tmux, Conductor is a level up for managing agents. The sandboxing makes it much easier to manage multiple sessions. I would find it much much harder to manage multiple agents if not for Conductor.</p></li></ul></li><li><p>Claude Code (Opus 4.7) &#8211;&nbsp;Max Plan 5x ($100 per month)</p><ul><li><p>It&#8217;s great - I don&#8217;t have much to add about Claude Code that hasn&#8217;t already been written.</p></li><li><p>Claude Design is shockingly good also. Highly recommend. I&#8217;m no designer, but I&#8217;ve been using it a lot ever since it came out.</p></li></ul></li><li><p>Codex (GPT 5.4) &#8211; ChatGPT Plus Plan ($20 per month)</p><ul><li><p>I use a mix of both Claude Code and Codex. I originally started using Codex because I had been hitting Claude Code usage limits (I&#8217;m on the Max 5x plan), but then started to actually like it. Claude Code is still my primary coding agent, but I still use Codex to review the code that Claude Code produces. I don&#8217;t have strong opinions about the pros and cons of Codex versus Claude Code. I find them to be borderline interchangeable.</p></li></ul></li><li><p><a href="https://github.com/garrytan/gstack">Gstack</a> setup for Claude Code (free, thanks Garry Tan)</p><ul><li><p>I opted to use Gstack rather than building out many of my own Skills because I&#8217;m probably not going to put in the cycles to maintain them just for myself, and I&#8217;m personally probably better off deferring to the best practices built up by the community.</p></li><li><p>Gstack forces clarifying questions upfront. I wish this was the default for coding agents - force more clarifying questions, so that the agents don&#8217;t try to overcomplicate every feature.</p></li><li><p>The /office-hours skill pretty neat.</p></li><li><p>Gstack adds a lot of input tokens into the context window. Sometimes the features are a bit overkill for me, and I only use a handful of the skills.</p></li><li><p>Claude Design removes the need for a lot of the Gstack design skills.</p></li></ul></li><li><p>If I&#8217;m using local models, I&#8217;ve been using <a href="https://ollama.com/">Ollama</a> and mainly Qwen 3.5 9b and Gemma 4. I rarely use local open source models though because they&#8217;re too dumb for most of my use cases, and too slow running on my Macbook.</p></li></ul><h2>Is the code quality any good?</h2><p>As for the quality of the code actually generated, it&#8217;s not terrible. I still toss out a significant amount of code, and refactor frequently, but it&#8217;s all workable. I rarely if ever find myself editing code by hand, which is pretty different from one year ago, back when I was using Cursor.</p><p>It's still very much a work in progress and I fully anticipate changing things as the space evolves on a daily basis.</p>]]></content:encoded></item><item><title><![CDATA[The Multisensory SOC]]></title><description><![CDATA[Thoughts on humanness, AI, training, and gut-based detection]]></description><link>https://jonathanlooi.com/p/the-multisensory-soc</link><guid isPermaLink="false">https://jonathanlooi.com/p/the-multisensory-soc</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 11 Apr 2026 23:11:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Jibg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jibg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jibg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 424w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 848w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216280,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/193926061?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jibg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 424w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 848w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pew pew <a href="https://rud.is/pewpew/">map</a></figcaption></figure></div><p>On the Jane Street trading floor, every algorithm had its own sound. Walking the floor was said to be like being in an arcade, a cacophony of soundbites constantly going off, each corresponding with an issue that needed to be addressed. Traders didn&#8217;t just look at dashboards; they experienced rhythms and could identify when something was going wrong, not just from looking at a monitor, but by hearing it in real time.</p><p>I love a good pewpew map, even though they&#8217;re usually pretty useless and completely inaccurate representations of threats. But what if we applied the Jane Street concept more seriously to the SOC?</p><p>Imagine if every detection rule had its own sound. You would hear it every time it fired. (A badly tuned detection rule would immediately become unbearably annoying &#8211;&nbsp;a great motivator for reducing false positives.) An analyst would know their network was being attacked not by squinting at a Splunk dashboard, but by the specific sonic sequence of a kill chain unfolding in the room around them.&nbsp;</p><p>Consider if you could taste the bitterness of Kerberrosting, or hear the rhythm of SMB enumeration in progress. While this sounds absurd on the surface, I would posit that it is more absurd that we have compressed all threat detection into a 2D screen, ignoring all senses beyond sight, ignoring the full human nervous system&#8217;s analytical capabilities, and hampering our ability to develop intuition quickly.</p><p>A couple of years ago, I worked as a deckhand on the G&#246;theborg of Sweden, an exact wooden replica of an 18th-century East Indiaman tall ship. My time on the ship reminded me how many English phrases are maritime metaphors. Now, when someone says &#8220;all hands on deck&#8221;, I can physically feel myself awoken from my hammock and rushing to get on deck in the cold and wind to push a capstan along with 10 other crewmates, just to tack. I don&#8217;t conceptually just know the phrase. I know how it feels. Experience is a deeper level of understanding. With a multisensory SOC, an analyst&#8217;s understanding of an attack would go from conceptual to experiential. This is the same reason hospital monitors beep, and airplanes have stall horns.</p><p>I think a lot about what it means to be a good analyst and how we develop the next generation to be even greater. In the book Thinking, Fast and Slow, author Daniel Kahneman provides an anecdote about how the Israeli military conducted interviews. There would be checklists to follow, but the best interviewers would follow the list, then close their notebooks and stop, sensing how they felt in their gut. This combination of process and an educated gut was where they found the best judgments were made.</p><p>The AI native SOC is coming. Detection, triage, and most tier-one analysis will soon (if it hasn&#8217;t already) be fully automated by agents. If we don&#8217;t intentionally train the next generation of cybersecurity professionals, we&#8217;ll wake up in a decade wondering where all the mid-level talent went.&nbsp;</p><p>So how do we build up gut-level experience in the next generation of cybersecurity professionals? I believe it will be through building something like a Multisensory SOC. A system that unlocks the full human sensory analytical capacity and compresses the timeline for turning conceptual knowledge into experience.</p><p>As models continue to improve, meeting and exceeding human capabilities in cybersecurity (just look at Anthropic&#8217;s Mythos Preview), I increasingly believe the only moat for humans is to lean into being human. It&#8217;s our feelings, it&#8217;s our intuitions, it&#8217;s our gut, the things AI will (hopefully) never be able to replace.</p><p>&#8212;</p><p>I&#8217;m increasingly interested in people who are building things to unlock multisensory experiences, bringing about the physical manifestation of the digital. If you&#8217;re building in this space, I want to hear from you.</p><p>&#8212;</p><p>Footnotes:</p><ol><li><p>Shoutout to my friend Sam for originally giving me the idea about Jane Street. This post is inspired by his white boarding.</p></li><li><p>Going Infinite by Michael Lewis has a great recounting of the Jane Street trading floor</p></li><li><p>My Thinking, Fast and Slow anecdote is an extremely boiled-down summary. I highly recommend reading the book.</p></li><li><p>A sound-based network monitoring system was tested in 2000 by two researchers (Michael Gilfix &amp; Alva Couch) at Tufts University. They called it &#8220;Peep: The Network Auralizer&#8221;. It never got beyond the experimental phase.</p></li></ol><p></p>]]></content:encoded></item><item><title><![CDATA[[Forensics] Writing a .DS_Store file parser]]></title><description><![CDATA[Uncovering deleted filenames in the .DS_Store binary]]></description><link>https://jonathanlooi.com/p/forensics-writing-a-ds_store-file</link><guid isPermaLink="false">https://jonathanlooi.com/p/forensics-writing-a-ds_store-file</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 28 Mar 2026 20:10:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XQ7i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XQ7i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 424w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 848w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1272w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" width="1378" height="988" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:988,&quot;width&quot;:1378,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:372807,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192452125?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c50da9c-0f7a-4b66-8f78-3925fff0ba51_1378x988.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 424w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 848w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1272w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Raw .DS_Store file</figcaption></figure></div><p>If you delete a file on macOS and empty the Trash, your Mac still remembers exactly what it was called and where it lived.</p><p>.DS_Store files are one of my favorite forensic artifacts. They're niche, kind of weird, and pack a surprising amount of forensically useful information.</p><p>To most of my software engineer friends, ".DS_Store" is just a line you put in your .gitignore. Under the hood, there's a lot more going on if you know what you're looking for!</p><p>Quick backgrounder: the .DS_Store (Desktop Services Store) file is a hidden binary that macOS Finder creates in every directory you open. It stores display preferences, icon positions, window size, view mode, sort order and uses a proprietary format and stores records in a B-tree.</p><p>Lots of awesome reverse engineering work was done over a decade ago on the file type by <a href="https://wiki.mozilla.org/DS_Store_File_Format">Mark Mentovai</a> and <a href="https://metacpan.org/dist/Mac-Finder-DSStore/view/DSStoreFormat.pod">Wim Lewis</a> and I wouldn't have understood how it works without first reading their posts.</p><h3>Why should forensic investigators care?</h3><ul><li><p>The .DS_Store file's existence proves someone browsed that folder in Finder </p></li><li><p>Filenames persist in .DS_Store even after the files are deleted until the system reboots (I still need to do a bit more testing on how long the deleted files last - it may depend on macOS version)</p></li><li><p>Trash put-back records store where trashed files originally came from, surviving even after the Trash is emptied</p></li><li><p>Timestamps and file sizes are recorded at the time Finder indexed them</p></li><li><p>If someone deletes a sensitive file and empties their Trash, the .DS_Store in ~/.Trash can still tell you what the file was called and exactly where it lived before deletion</p></li></ul><h3>Writing a .DS_Store parser</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i_XV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i_XV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 424w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 848w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png" width="1456" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306740,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192452125?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i_XV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 424w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 848w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Converted the binary into forensically useful information</figcaption></figure></div><p>Without being properly parsed, the .DS_Store file is pretty useless. I built &#8220;<a href="https://github.com/jonathanlooi/ds-store-parser">ds-store-parser</a>&#8221; (with help from Claude Code, of course!) to turn the .DS_Store binary into accessible and useful forensic information. </p><p>It's a Python CLI tool using only the standard library, Python 3.10+. It reads the raw binary, decodes the record types, and outputs clean CSV or JSON. One row per file, with human-readable columns for everything (while maintaining the raw data). I validated it against 368 real .DS_Store files from my MacBook.</p><p>Next time you push to GitHub, make sure you&#8217;re not adding a .DS_Store file! It is quietly leaking your directory structure and filenames to anyone who knows how to parse it.</p><p>Check out the parser on my Github: <a href="https://github.com/jonathanlooi/ds-store-parser">https://github.com/jonathanlooi/ds-store-parser</a></p>]]></content:encoded></item><item><title><![CDATA[[Forensics] Why your Mac (sort of) keeps a record of every file you've ever downloaded from the internet]]></title><description><![CDATA[Investigating the Quarantine Events V2 database]]></description><link>https://jonathanlooi.com/p/forensics-why-your-mac-sort-of-keeps</link><guid isPermaLink="false">https://jonathanlooi.com/p/forensics-why-your-mac-sort-of-keeps</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 28 Mar 2026 19:58:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_0Jv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_0Jv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 424w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 848w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" width="1456" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:334242,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192447907?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 424w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 848w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">You can see that VirtualBox, Docker, Postman, and Burp Suite (portswigger) were the first files I downloaded when setting up my personal MacBook in 2022. Clearly I work in security. &#128513;&#128104;&#8205;&#128187;</figcaption></figure></div><p>Your Mac (sort of) keeps a record of every file you&#8217;ve downloaded from the internet.</p><p>It&#8217;s stored in a SQLite database called Quarantine Events V2 (located at ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2).</p><p>But why is macOS collecting all this information in the first place?</p><p>Mac uses this database to warn users before opening potentially malicious files downloaded from the internet. It&#8217;s the feature that gives you the notifications asking: &#8220;[downloaded app] is an app created by the app [source app]. Are you sure you want to open it?&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4MVs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4MVs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 424w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 848w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1272w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png" width="864" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1076676,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192447907?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4MVs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 424w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 848w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1272w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example warning from Gatekeeper</figcaption></figure></div><p>macOS has had a quarantine system since Leopard (10.5). Gatekeeper, the built-in security feature that verifies that a downloaded app is from an identified developer (code signing) and has been submitted to Apple for malware scanning (notarization), builds on top of this quarantine system. When a quarantine-aware app like Safari, Chrome, or Mail downloads a file, macOS stamps it with a com.apple.quarantine attribute and logs the event in the QuarantineEventsV2 database.</p><p>The database schema includes: a UUID, timestamp, agent name (downloading application), bundle identifier, download URL, origin URL (the referring page), sender name/address (for email attachments), and a type number.</p><p>Notably absent is the actual filename. There is no column for it. The UUID ties to the extended attribute on the file, but once the file is deleted, that link is broken. You cannot recover the filename from this database alone. In practice, many fields are frequently empty. I queried my own Mac and reliably got timestamps and agent names. Origin URLs were populated for some entries, absent for others. Sender fields were almost never populated. Also, keep in mind that timestamps use Cocoa epoch (seconds since Jan 1, 2001). Add 978307200 to convert to Unix epoch.</p><p>So what is QuarantineEventsV2 actually good for?</p><ul><li><p>Corroboration. Cross-reference quarantine timestamps with browser history, FSEvents, or Unified Logs to build a more complete timeline.</p></li><li><p>Agent name analysis. LSQuarantineAgentName reliably identifies the downloading application. AirDrop transfers show up as sharingd.</p></li><li><p>Persistence. macOS never cleans this database, even after files are deleted, Trash is emptied, and browser history is cleared.</p></li></ul><p>Since this is just a SQLite database, you don&#8217;t need a custom parser! And for forensic workflows at scale, <a href="https://docs.velociraptor.app/artifact_references/pages/macos.system.quarantineevents/">Velociraptor&#8217;s MacOS.System.QuarantineEvents artifact</a> and <a href="https://github.com/log2timeline/plaso/blob/main/plaso/parsers/sqlite_plugins/ls_quarantine.py">Plaso&#8217;s ls_quarantine plugin</a> already handle the parsing and timestamp conversion.</p><p>Try this on your own Mac:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;shell&quot;,&quot;nodeId&quot;:&quot;24dcc75b-a4be-4168-a035-d8fc4b9ff791&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-shell">sqlite3 -header -column ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 &#8220;SELECT datetime(LSQuarantineTimeStamp + 978307200, &#8216;unixepoch&#8217;) as download_time, LSQuarantineAgentName, LSQuarantineDataURLString FROM LSQuarantineEvent ORDER BY LSQuarantineTimeStamp DESC LIMIT 20"</code></pre></div>]]></content:encoded></item></channel></rss>