{ "fetched_at": "2025-12-12T12:16:47.173727Z", "total_sources": 16, "successful": 16, "failed": 0, "results": [ { "name": "Claude Blog", "url": "https://claude.ai/blog", "type": "blog", "status": "success", "content": "Loading...", "title": "Claude", "description": "Talk with Claude, an AI assistant from Anthropic", "fetched_at": "2025-12-12T12:16:42.930548Z" }, { "name": "Anthropic Engineering", "url": "https://www.anthropic.com/engineering", "type": "blog", "status": "success", "content": "## Engineering at Anthropic: Inside the team building reliable AI systems\n\n[Start building](https://console.anthropic.com/) [Developer docs](https://www.anthropic.com/docs)\n\n\n\n[\\\\\n\\\\\nFeatured **Effective harnesses for long-running agents** \\\\\n\\\\\nAgents still face challenges working across many context windows. We looked to human engineers for inspiration in creating a more effective harness for long-running agents.](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)\n\n[\\\\\n\\\\\n**Introducing advanced tool use on the Claude Developer Platform** \\\\\n\\\\\nNov 24, 2025](https://www.anthropic.com/engineering/advanced-tool-use)[\\\\\n\\\\\n**Code execution with MCP: Building more efficient agents** \\\\\n\\\\\nNov 04, 2025](https://www.anthropic.com/engineering/code-execution-with-mcp)[\\\\\n\\\\\n**Beyond permission prompts: making Claude Code more secure and autonomous** \\\\\n\\\\\nOct 20, 2025](https://www.anthropic.com/engineering/claude-code-sandboxing)[\\\\\n\\\\\n**Equipping agents for the real world with Agent Skills** \\\\\n\\\\\nOct 16, 2025](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)[\\\\\n\\\\\n**Building agents with the Claude Agent SDK** \\\\\n\\\\\nSep 29, 2025](https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk)[\\\\\n\\\\\n**Effective context engineering for AI agents** \\\\\n\\\\\nSep 29, 2025](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)[\\\\\n\\\\\n**A postmortem of three recent issues** \\\\\n\\\\\nSep 17, 2025](https://www.anthropic.com/engineering/a-postmortem-of-three-recent-issues)[\\\\\n\\\\\n**Writing effective tools for agents \u2014 with agents** \\\\\n\\\\\nSep 11, 2025](https://www.anthropic.com/engineering/writing-tools-for-agents)[\\\\\n\\\\\n**Desktop Extensions: One-click MCP server installation for Claude Desktop** \\\\\n\\\\\nJun 26, 2025](https://www.anthropic.com/engineering/desktop-extensions)[\\\\\n\\\\\n**How we built our multi-agent research system** \\\\\n\\\\\nJun 13, 2025](https://www.anthropic.com/engineering/multi-agent-research-system)[\\\\\n\\\\\n**Claude Code: Best practices for agentic coding** \\\\\n\\\\\nApr 18, 2025](https://www.anthropic.com/engineering/claude-code-best-practices)[\\\\\n\\\\\n**The \"think\" tool: Enabling Claude to stop and think in complex tool use situations** \\\\\n\\\\\nMar 20, 2025](https://www.anthropic.com/engineering/claude-think-tool)[\\\\\n\\\\\n**Raising the bar on SWE-bench Verified with Claude 3.5 Sonnet** \\\\\n\\\\\nJan 06, 2025](https://www.anthropic.com/engineering/swe-bench-sonnet)[\\\\\n\\\\\n**Building effective agents** \\\\\n\\\\\nDec 19, 2024](https://www.anthropic.com/engineering/building-effective-agents)[\\\\\n\\\\\n**Introducing Contextual Retrieval** \\\\\n\\\\\nSep 19, 2024](https://www.anthropic.com/engineering/contextual-retrieval)\n\nWant to help us build the \u2028future of safe AI?\n\n[See open roles](https://www.anthropic.com/jobs)\n\nEngineering \\ Anthropic", "title": null, "description": "Anthropic is an AI safety and research company that's working to build reliable, interpretable, and steerable AI systems.", "fetched_at": "2025-12-12T12:16:42.989630Z" }, { "name": "SkillsMP", "url": "https://skillsmp.com", "type": "marketplace", "status": "success", "content": "[Skip to main content](https://skillsmp.com/#main-content)\n\nskills.marketplace\n\n//main.ts\n\n# >Claude Skills Marketplace\n\nconstskills=23,657;\n\n// Discoveropen-source Claude skills from GitHub\n\n/\\*\\*\n\n\\\\* Search with AI semantics or keywords, browse by category, sort by popularity. All skills are open source and ready to install\n\n\\*/\n\ntrend-analytics.tsx\n\nBased on skill last push time, not same-day commit count\n\nskills --list\n\nready\n\n## >Browse Claude Skills\n\n$count:23657skills available\n\nsearch --ai\n\nType to filter, or press `\u23ce` for AI search. `\u21e7` \\+ `\u23ce` for new line\n\n$find\n\nexecute\n\n--filter\n\nShow only skills with marketplace.json [$ man marketplace.json](https://docs.claude.com/en/docs/claude-code/plugin-marketplaces)\n\n--sort\n\nstarsrecent\n\n[at-dispatch-v2.md\\\\\n\\\\\n95.4k\\\\\n\\\\\n1234\\\\\n\\\\\n**export at-dispatch-v2**\\\\\n\\\\\nfrom \"pytorch/pytorch\"\\\\\n\\\\\n// Convert PyTorch AT\\_DISPATCH macros to AT\\_DISPATCH\\_V2 format in ATen C++ code. Use when porting AT\\_DISPATCH\\_ALL\\_TYPES\\_AND\\*, AT\\_DISPATCH\\_FLOATING\\_TYPES\\*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.\\\\\n\\\\\n2025-11-25](https://skillsmp.com/skills/pytorch-pytorch-claude-skills-at-dispatch-v2-skill-md)\n\n[add-uint-support.md\\\\\n\\\\\n95.4k\\\\\n\\\\\n1234\\\\\n\\\\\n**export add-uint-support**\\\\\n\\\\\nfrom \"pytorch/pytorch\"\\\\\n\\\\\n// Add unsigned integer (uint) type support to PyTorch operators by updating AT\\_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.\\\\\n\\\\\n2025-11-25](https://skillsmp.com/skills/pytorch-pytorch-claude-skills-add-uint-support-skill-md)\n\n[skill-writer.md\\\\\n\\\\\n95.4k\\\\\n\\\\\n1234\\\\\n\\\\\n**export skill-writer**\\\\\n\\\\\nfrom \"pytorch/pytorch\"\\\\\n\\\\\n// Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.\\\\\n\\\\\n2025-11-25](https://skillsmp.com/skills/pytorch-pytorch-claude-skills-skill-writer-skill-md)\n\n[docstring.md\\\\\n\\\\\n95.4k\\\\\n\\\\\n1234\\\\\n\\\\\n**export docstring**\\\\\n\\\\\nfrom \"pytorch/pytorch\"\\\\\n\\\\\n// Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.\\\\\n\\\\\n2025-11-25](https://skillsmp.com/skills/pytorch-pytorch-claude-skills-docstring-skill-md)\n\n[frontend-design.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export frontend-design**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-frontend-design-skills-frontend-design-skill-md)\n\n[hook-development.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export hook-development**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"create a hook\", \"add a PreToolUse/PostToolUse/Stop hook\", \"validate tool use\", \"implement prompt-based hooks\", \"use ${CLAUDE\\_PLUGIN\\_ROOT}\", \"set up event-driven automation\", \"block dangerous commands\", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-hook-development-skill-md)\n\n[command-development.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export command-development**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"create a slash command\", \"add a command\", \"write a custom command\", \"define command arguments\", \"use command frontmatter\", \"organize commands\", \"create command with file references\", \"interactive command\", \"use AskUserQuestion in command\", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-command-development-skill-md)\n\n[agent-identifier.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export agent-identifier**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"create an agent\", \"add an agent\", \"write a subagent\", \"agent frontmatter\", \"when to use description\", \"agent examples\", \"agent tools\", \"agent colors\", \"autonomous agent\", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-agent-development-skill-md)\n\n[rule-identifier.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export rule-identifier**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"create a hookify rule\", \"write a hook rule\", \"configure hookify\", \"add a hookify rule\", or needs guidance on hookify rule syntax and patterns.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-hookify-skills-writing-rules-skill-md)\n\n[mcp-integration.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export mcp-integration**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"add MCP server\", \"integrate MCP\", \"configure MCP in plugin\", \"use .mcp.json\", \"set up Model Context Protocol\", \"connect external service\", mentions \"${CLAUDE\\_PLUGIN\\_ROOT} with MCP\", or discusses MCP server types (SSE, stdio, HTTP, WebSocket). Provides comprehensive guidance for integrating Model Context Protocol servers into Claude Code plugins for external tool and service integration.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-mcp-integration-skill-md)\n\n[skill-development.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export skill-development**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user wants to \"create a skill\", \"add a skill to plugin\", \"write a new skill\", \"improve skill description\", \"organize skill content\", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-skill-development-skill-md)\n\n[command-name.md\\\\\n\\\\\n45.5k\\\\\n\\\\\n1234\\\\\n\\\\\n**export command-name**\\\\\n\\\\\nfrom \"anthropics/claude-code\"\\\\\n\\\\\n// This skill should be used when the user asks to \"create a plugin\", \"scaffold a plugin\", \"understand plugin structure\", \"organize plugin components\", \"set up plugin.json\", \"use ${CLAUDE\\_PLUGIN\\_ROOT}\", \"add commands/agents/skills/hooks\", \"configure auto-discovery\", or needs guidance on plugin directory layout, manifest configuration, component organization, file naming conventions, or Claude Code plugin architecture best practices.\\\\\n\\\\\n2025-12-11](https://skillsmp.com/skills/anthropics-claude-code-plugins-plugin-dev-skills-plugin-structure-skill-md)\n\ncategories.json\n\nready\n\n## >Browse by Category\n\n$Explore Claude skills organized by their primary use case\n\n[development/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Development\"\\\\\n\\\\\n\"exports\":7904// skills\\\\\n\\\\\n$cd development && ls](https://skillsmp.com/categories/development)\n\n[tools/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Tools\"\\\\\n\\\\\n\"exports\":7212// skills\\\\\n\\\\\n$cd tools && ls](https://skillsmp.com/categories/tools)\n\n[data-ai/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Data & AI\"\\\\\n\\\\\n\"exports\":4658// skills\\\\\n\\\\\n$cd data-ai && ls](https://skillsmp.com/categories/data-ai)\n\n[business/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Business\"\\\\\n\\\\\n\"exports\":3961// skills\\\\\n\\\\\n$cd business && ls](https://skillsmp.com/categories/business)\n\n[devops/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"DevOps\"\\\\\n\\\\\n\"exports\":3684// skills\\\\\n\\\\\n$cd devops && ls](https://skillsmp.com/categories/devops)\n\n[testing-security/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Testing & Security\"\\\\\n\\\\\n\"exports\":2413// skills\\\\\n\\\\\n$cd testing-security && ls](https://skillsmp.com/categories/testing-security)\n\n[documentation/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Documentation\"\\\\\n\\\\\n\"exports\":1904// skills\\\\\n\\\\\n$cd documentation && ls](https://skillsmp.com/categories/documentation)\n\n[content-media/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Content & Media\"\\\\\n\\\\\n\"exports\":1762// skills\\\\\n\\\\\n$cd content-media && ls](https://skillsmp.com/categories/content-media)\n\n[lifestyle/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Lifestyle\"\\\\\n\\\\\n\"exports\":1638// skills\\\\\n\\\\\n$cd lifestyle && ls](https://skillsmp.com/categories/lifestyle)\n\n[research/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Research\"\\\\\n\\\\\n\"exports\":878// skills\\\\\n\\\\\n$cd research && ls](https://skillsmp.com/categories/research)\n\n[databases/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Databases\"\\\\\n\\\\\n\"exports\":527// skills\\\\\n\\\\\n$cd databases && ls](https://skillsmp.com/categories/databases)\n\n[blockchain/\\\\\n\\\\\nmodule\\\\\n\\\\\n\"name\":\"Blockchain\"\\\\\n\\\\\n\"exports\":130// skills\\\\\n\\\\\n$cd blockchain && ls](https://skillsmp.com/categories/blockchain)\n\n[$cd/categories&&ls -la](https://skillsmp.com/categories)\n\nABOUT.md\n\n## \\\\#\\# Why Skills Marketplace?\n\nFinding the right Claude skill among thousands of GitHub repositories can be overwhelming. Skills Marketplace solves this by providing smart search, category filtering, and quality indicators to help you quickly find exactly what you need.\n\nWhether you're a developer automating workflows, a team lead building custom AI tools, or a hobbyist exploring Claude's capabilities, you'll find skills for every use case. Each skill includes installation commands, GitHub stats, and detailed documentation to get you started in seconds.\n\n\\[INFO\\]Ready to explore the largest collection of Claude skills and AI development tools?\n\nBrowse\n\nEasy\n\nGitHub\n\nexportconstBrowse&Discover = () =\\> {\n\nreturn\n\n/\\*\\*\n\n\\\\* Search through 10000+ Claude AI skills with intelligent filtering by category, author, and popularity. Our skills marketplace makes finding the right tool effortless.\n\n\\*/\n\n}\n\nFAQ.md\n\n9 questions\n\n## \\\\# Frequently Asked Questions\n\nEverything you need to know about Claude Code plugins, skills, and AI tools in 2025\n\n01\n\n### Q:What are Claude Skills?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Claude Skills are modular capabilities that extend Claude Code's functionality. Each skill consists of a SKILL.md file with instructions, plus optional scripts and templates. Skills are model-invoked\u2014Claude automatically decides when to use them based on your request and the skill's description. They're the building blocks of Claude Code plugins and AI automation tools.\n\n\\*/\n\n02\n\n### Q:How do I install a Claude skill?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Skills can be installed in three ways: 1) Personal skills: Add to ~/.claude/skills/ directory for use across all projects, 2) Project skills: Add to .claude/skills/ directory and commit to git for team sharing, 3) Plugin skills: Install via Claude Code plugins using /plugin commands for one-command installation. Clone the GitHub repository and copy the skill folder (containing SKILL.md) to your chosen directory. Claude automatically discovers and loads skills from these locations.\n\n\\*/\n\n03\n\n### Q:Are these skills safe to use?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Skills from this marketplace are sourced from public GitHub repositories. We filter out low-quality repos (minimum 2 stars) and scan for basic quality indicators, but you should always review the code before installing. Community skills should be treated like any open-source code\u2014inspect before use.\n\n\\*/\n\n04\n\n### Q:Can I use multiple skills together?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Yes! Claude Code supports multiple skills simultaneously. Skills are modular and designed to work together. For example, you can combine a 'code-reviewer' skill with a 'git-automation' skill to automatically review and commit code changes. Claude intelligently selects the appropriate skills based on your request context.\n\n\\*/\n\n05\n\n### Q:Can I create and share my own skills?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Yes! You can create custom Claude skills and share them on GitHub. Check out the skill-creator skill for detailed guidance on creating your own skills. The basic structure requires a SKILL.md file with instructions. You can also add optional scripts, templates, and a marketplace.json for easier distribution.\n\n\\*/\n\n06\n\n### Q:How do skills differ from slash commands?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Skills are model-invoked\u2014Claude automatically decides when to use them based on context. Slash commands are user-invoked\u2014you explicitly type the command to trigger them. Skills enable more intelligent, context-aware automation in your workflows.\n\n\\*/\n\n07\n\n### Q:How often are skills updated?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* Our scraper regularly syncs with GitHub to fetch the latest skills and updates. When a skill repository is updated on GitHub, the changes will appear on SkillsMP shortly after our next sync. You can see the last update timestamp on each skill card. We recommend checking back regularly for new skills and improvements to existing ones.\n\n\\*/\n\n08\n\n### Q:What is marketplace.json?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* marketplace.json is a metadata file that enables one-command installation of skills through Claude Code plugin marketplaces. When present, users can install skills with a simple command like '/plugin install skill-name' instead of manually copying files. Skills with marketplace.json are marked with a special badge on SkillsMP. This file contains information about the skill's name, description, version, and installation instructions.\n\n\\*/\n\n09\n\n### Q:Is this website affiliated with Anthropic?\n\n\\[+\\]\n\n/\\*\\*\n\n\\\\* No, SkillsMP is an independent community project. We aggregate and showcase Claude skills from various sources to make discovery easier. For official skills and authoritative information, always refer to Anthropic's official documentation and repositories.\n\n\\*/\n\nStill have questions?\n\n[$open/docs&&explore](https://skillsmp.com/docs)\n\n$cdtop", "title": "Claude Skills Marketplace - Browse Skills from GitHub | SkillsMP", "description": "Claude Skills directory - browse and install Claude skills from GitHub. Find Claude Code skills, Anthropic official skills, AI agents & automation workflows. Search, filter, and explore the largest Claude skills collection.", "fetched_at": "2025-12-12T12:16:43.213484Z" }, { "name": "Simon Willison", "url": "https://simonwillison.net", "type": "blog", "status": "success", "content": "[My Atom feed](https://simonwillison.net/atom/everything/ \"My Atom feed\")\n\n# Simon Willison\u2019s Weblog\n\nOn [generative-ai 1526](https://simonwillison.net/tags/generative-ai/) [ai-ethics 241](https://simonwillison.net/tags/ai-ethics/) [youtube 54](https://simonwillison.net/tags/youtube/) [claude-code 64](https://simonwillison.net/tags/claude-code/) [ai-agents 87](https://simonwillison.net/tags/ai-agents/) [...](https://simonwillison.net/tags/)\n\n## Recent\n\n### Dec. 11, 2025\n\n### [GPT-5.2](https://simonwillison.net/2025/Dec/11/gpt-52/)\n\n[](https://simonwillison.net/2025/Dec/11/gpt-52/)\n\nOpenAI reportedly [declared a \u201ccode red\u201d](https://www.wsj.com/tech/ai/openais-altman-declares-code-red-to-improve-chatgpt-as-google-threatens-ai-lead-7faf5ea6) on the 1st of December in response to increasingly credible competition from the likes of Google\u2019s Gemini 3. It\u2019s less than two weeks later and they just [announced GPT-5.2](https://openai.com/index/introducing-gpt-5-2/), calling it \u201cthe most capable model series yet for professional knowledge work\u201d.\n\n\\[... [805 words](https://simonwillison.net/2025/Dec/11/gpt-52/)\\]\n\n[11:58 pm](https://simonwillison.net/2025/Dec/11/gpt-52/ \"Permalink for \\\"GPT-5.2\\\"\") / [ai](https://simonwillison.net/tags/ai/), [openai](https://simonwillison.net/tags/openai/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [llm](https://simonwillison.net/tags/llm/), [pelican-riding-a-bicycle](https://simonwillison.net/tags/pelican-riding-a-bicycle/), [llm-release](https://simonwillison.net/tags/llm-release/), [gpt-5](https://simonwillison.net/tags/gpt-5/)\n\n### Dec. 10, 2025\n\n### [Useful patterns for building HTML tools](https://simonwillison.net/2025/Dec/10/html-tools/)\n\n[](https://simonwillison.net/2025/Dec/10/html-tools/)\n\nI\u2019ve started using the term **HTML tools** to refer to HTML applications that I\u2019ve been building which combine HTML, JavaScript, and CSS in a single file and use them to provide useful functionality. I have built [over 150 of these](https://tools.simonwillison.net/) in the past two years, almost all of them written by LLMs. This article presents a collection of useful patterns I\u2019ve discovered along the way.\n\n\\[... [4,231 words](https://simonwillison.net/2025/Dec/10/html-tools/)\\]\n\n[9 pm](https://simonwillison.net/2025/Dec/10/html-tools/ \"Permalink for \\\"Useful patterns for building HTML tools\\\"\") / [definitions](https://simonwillison.net/tags/definitions/), [github](https://simonwillison.net/tags/github/), [html](https://simonwillison.net/tags/html/), [javascript](https://simonwillison.net/tags/javascript/), [projects](https://simonwillison.net/tags/projects/), [tools](https://simonwillison.net/tags/tools/), [ai](https://simonwillison.net/tags/ai/), [webassembly](https://simonwillison.net/tags/webassembly/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [vibe-coding](https://simonwillison.net/tags/vibe-coding/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [claude-code](https://simonwillison.net/tags/claude-code/)\n\n**[The Normalization of Deviance in AI](https://embracethered.com/blog/posts/2025/the-normalization-of-deviance-in-ai/)**.\nThis thought-provoking essay from Johann Rehberger directly addresses something that I\u2019ve been worrying about for quite a while: in the absence of any headline-grabbing examples of prompt injection vulnerabilities causing real economic harm, is anyone going to care?\n\nJohann describes the concept of the \u201cNormalization of Deviance\u201d as directly applying to this question.\n\nCoined by [Diane Vaughan](https://en.wikipedia.org/wiki/Diane_Vaughan), the key idea here is that organizations that get away with \u201cdeviance\u201d - ignoring safety protocols or otherwise relaxing their standards - will start baking that unsafe attitude into their culture. This can work fine\u2026 until it doesn\u2019t. The Space Shuttle Challenger disaster has been partially blamed on this class of organizational failure.\n\nAs Johann puts it:\n\n> In the world of AI, we observe companies treating probabilistic, non-deterministic, and sometimes adversarial model outputs as if they were reliable, predictable, and safe.\n>\n> Vendors are normalizing trusting LLM output, but current understanding violates the assumption of reliability.\n>\n> The model will not consistently follow instructions, stay aligned, or maintain context integrity. This is especially true if there is an attacker in the loop (e.g indirect prompt injection).\n>\n> However, we see more and more systems allowing untrusted output to take consequential actions. Most of the time it goes well, and over time vendors and organizations lower their guard or skip human oversight entirely, because \u201cit worked last time.\u201d\n>\n> This dangerous bias is the fuel for normalization: organizations confuse the absence of a successful attack with the presence of robust security.\n\n[#](https://simonwillison.net/2025/Dec/10/normalization-of-deviance/) [8:18 pm](https://simonwillison.net/2025/Dec/10/normalization-of-deviance/)\n/ [security](https://simonwillison.net/tags/security/), [ai](https://simonwillison.net/tags/ai/), [prompt-injection](https://simonwillison.net/tags/prompt-injection/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [johann-rehberger](https://simonwillison.net/tags/johann-rehberger/), [ai-ethics](https://simonwillison.net/tags/ai-ethics/)\n\nI've never been particularly invested dark v.s. light mode but I get enough people complaining that this site is \"blinding\" that I decided to see if Claude Code for web could produce a useful dark mode from my existing CSS. It did [a decent job](https://github.com/simonw/simonwillisonblog/pull/572/files), using CSS properties, `@media (prefers-color-scheme: dark)` and a `data-theme=\"dark\"` attribute based on this prompt:\n\n> `Add a dark theme which is triggered by user media preferences but can also be switched on using localStorage - then put a little icon in the footer for toggling it between default auto, forced regular and forced dark mode`\n\nThe site defaults to picking up the user's preferences, but there's also a toggle in the footer which switches between auto, forced-light and forced-dark. Here's an animated demo:\n\n\n\nI had Claude Code [make me that GIF](https://gistpreview.github.io/?5ea34de3e999bd32d0f86beef4bd803d) from two static screenshots - it used this ImageMagick recipe:\n\n```\nmagick -delay 300 -loop 0 one.png two.png \\\n -colors 128 -layers Optimize dark-mode.gif\n```\n\nThe CSS ended up with some duplication due to the need to handle both the media preference and the explicit user selection. We [fixed that with Cog](https://github.com/simonw/simonwillisonblog/commit/d4bc7573775960a630145a287d854b8569da6f72#diff-5acc582e2a25639d184d784747a69ff9b30061aca8d5913d9c7e67452e715e08).\n\n[#](https://simonwillison.net/2025/Dec/10/dark-mode/) [4:05 pm](https://simonwillison.net/2025/Dec/10/dark-mode/)\n/ [css](https://simonwillison.net/tags/css/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [claude](https://simonwillison.net/tags/claude/), [claude-code](https://simonwillison.net/tags/claude-code/), [design](https://simonwillison.net/tags/design/), [llms](https://simonwillison.net/tags/llms/), [ai](https://simonwillison.net/tags/ai/), [generative-ai](https://simonwillison.net/tags/generative-ai/)\n\n**[10 Years of Let\u2019s Encrypt](https://letsencrypt.org/2025/12/09/10-years)**\n( [via](https://news.ycombinator.com/item?id=46208962 \"Hacker News\"))\nInternet Security Research Group co-founder and Executive Director Josh Aas:\n\n> On September 14, 2015, [our first publicly-trusted certificate went live](https://crt.sh/?id=9314793). \\[...\\] Today, Let\u2019s Encrypt is the largest certificate authority in the world in terms of certificates issued, the ACME protocol we helped create and standardize is integrated throughout the server ecosystem, and we\u2019ve become a household name among system administrators. We\u2019re closing in on protecting one billion web sites.\n\nTheir growth rate and numbers are wild:\n\n> In March 2016, we issued our one millionth certificate. Just two years later, in September 2018, we were issuing a million certificates every day. In 2020 we reached a billion total certificates issued and as of late 2025 we\u2019re frequently issuing ten million certificates per day.\n\nAccording to [their stats](https://letsencrypt.org/stats/) the amount of Firefox traffic protected by HTTPS doubled from 39% at the start of 2016 to ~80% today. I think it's difficult to over-estimate the impact Let's Encrypt has had on the security of the web.\n\n[#](https://simonwillison.net/2025/Dec/10/lets-encrypt/) [12:34 am](https://simonwillison.net/2025/Dec/10/lets-encrypt/)\n/ [https](https://simonwillison.net/tags/https/), [security](https://simonwillison.net/tags/security/)\n\n### Dec. 9, 2025\n\n**[Devstral 2](https://mistral.ai/news/devstral-2-vibe-cli)**.\nTwo new models from Mistral today: Devstral 2 and Devstral Small 2 - both focused on powering coding agents such as Mistral's newly released Mistral Vibe which [I wrote about earlier today](https://simonwillison.net/2025/Dec/9/mistral-vibe/).\n\n> - Devstral 2: SOTA open model for code agents with a fraction of the parameters of its competitors and achieving 72.2% on SWE-bench Verified.\n> - Up to 7x more cost-efficient than Claude Sonnet at real-world tasks.\n\nDevstral 2 is a 123B model released under a janky license - it's \"modified MIT\" where [the modification](https://huggingface.co/mistralai/Devstral-2-123B-Instruct-2512/blob/main/LICENSE) is:\n\n> You are not authorized to exercise any rights under this license if the global consolidated monthly revenue of your company (or that of your employer) exceeds $20 million (or its equivalent in another currency) for the preceding month. This restriction in (b) applies to the Model and any derivatives, modifications, or combined works based on it, whether provided by Mistral AI or by a third party. \\[...\\]\n\nMistral Small 2 is under a proper Apache 2 license with no weird strings attached. It's a 24B model which is [51.6GB on Hugging Face](https://huggingface.co/mistralai/Devstral-Small-2-24B-Instruct-2512) and should quantize to significantly less.\n\nI tried out the larger model via [my llm-mistral plugin](https://github.com/simonw/llm-mistral) like this:\n\n```\nllm install llm-mistral\nllm mistral refresh\nllm -m mistral/devstral-2512 \"Generate an SVG of a pelican riding a bicycle\"\n```\n\n\n\nFor a ~120B model that one is pretty good!\n\nHere's the same prompt with `-m mistral/labs-devstral-small-2512` for the API hosted version of Devstral Small 2:\n\n\n\nAgain, a decent result given the small parameter size. For comparison, [here's what I got](https://simonwillison.net/2025/Jun/20/mistral-small-32/) for the 24B Mistral Small 3.2 earlier this year.\n\n[#](https://simonwillison.net/2025/Dec/9/devstral-2/) [11:58 pm](https://simonwillison.net/2025/Dec/9/devstral-2/)\n/ [ai](https://simonwillison.net/tags/ai/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [llm](https://simonwillison.net/tags/llm/), [mistral](https://simonwillison.net/tags/mistral/), [pelican-riding-a-bicycle](https://simonwillison.net/tags/pelican-riding-a-bicycle/), [llm-release](https://simonwillison.net/tags/llm-release/), [janky-licenses](https://simonwillison.net/tags/janky-licenses/)\n\n### [Under the hood of Canada Spends with Brendan Samek](https://simonwillison.net/2025/Dec/9/canada-spends/)\n\n[](https://simonwillison.net/2025/Dec/9/canada-spends/)\n\nI talked to Brendan Samek about [Canada Spends](https://canadaspends.com/), a project from [Build Canada](https://www.buildcanada.com/) that makes Canadian government financial data accessible and explorable using a combination of Datasette, a neat custom frontend, Ruby ingestion scripts, [sqlite-utils](https://sqlite-utils.datasette.io/) and pieces of LLM-powered PDF extraction.\n\n\\[... [561 words](https://simonwillison.net/2025/Dec/9/canada-spends/)\\]\n\n[11:52 pm](https://simonwillison.net/2025/Dec/9/canada-spends/ \"Permalink for \\\"Under the hood of Canada Spends with Brendan Samek\\\"\") / [data-journalism](https://simonwillison.net/tags/data-journalism/), [politics](https://simonwillison.net/tags/politics/), [sqlite](https://simonwillison.net/tags/sqlite/), [youtube](https://simonwillison.net/tags/youtube/), [datasette](https://simonwillison.net/tags/datasette/), [sqlite-utils](https://simonwillison.net/tags/sqlite-utils/)\n\n**[Agentic AI Foundation](https://aaif.io/)**.\nAnnounced today as a new foundation under the parent umbrella of the Linux Foundation (see also the OpenJS Foundation, Cloud Native Computing Foundation, OpenSSF and [many more](https://www.linuxfoundation.org/projects)).\n\nThe AAIF was started by a heavyweight group of \"founding platinum members\" ( [$350,000](https://aaif.io/members/#join)): AWS, Anthropic, Block, Bloomberg, Cloudflare, Google, Microsoft, and OpenAI. The [stated goal](https://aaif.io/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation-aaif-anchored-by-new-project-contributions-including-model-context-protocol-mcp-goose-and-agents-md/) is to provide \"a neutral, open foundation to ensure agentic AI evolves transparently and collaboratively\".\n\nAnthropic have [donated Model Context Protocol](https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation) to the new foundation, OpenAI [donated AGENTS.md](https://openai.com/index/agentic-ai-foundation/), Block [donated goose](https://block.xyz/inside/block-anthropic-and-openai-launch-the-agentic-ai-foundation) (their [open source, extensible AI agent](https://github.com/block/goose)).\n\nPersonally the project I'd like to see most from an initiative like this one is a clear, community-managed specification for the OpenAI Chat Completions JSON API - or a close equivalent. There are dozens of slightly incompatible implementations of that not-quite-specification floating around already, it would be great to have a written spec accompanied by a compliance test suite.\n\n[#](https://simonwillison.net/2025/Dec/9/agentic-ai-foundation/) [10:24 pm](https://simonwillison.net/2025/Dec/9/agentic-ai-foundation/)\n/ [open-source](https://simonwillison.net/tags/open-source/), [standards](https://simonwillison.net/tags/standards/), [ai](https://simonwillison.net/tags/ai/), [openai](https://simonwillison.net/tags/openai/), [llms](https://simonwillison.net/tags/llms/), [anthropic](https://simonwillison.net/tags/anthropic/), [ai-agents](https://simonwillison.net/tags/ai-agents/), [model-context-protocol](https://simonwillison.net/tags/model-context-protocol/)\n\n**[mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe)**.\nHere's the Apache 2.0 licensed source code for Mistral's new \"Vibe\" CLI coding agent, [released today](https://mistral.ai/news/devstral-2-vibe-cli) alongside Devstral 2.\n\nIt's a neat implementation of the now standard terminal coding agent pattern, built in Python on top of Pydantic and Rich/Textual (here are [the dependencies](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/pyproject.toml#L29-L46).) [Gemini CLI](https://github.com/google-gemini/gemini-cli) is TypeScript, Claude Code is closed source (TypeScript, now [on top of Bun](https://simonwillison.net/2025/Dec/2/anthropic-acquires-bun/)), OpenAI's [Codex CLI](https://github.com/openai/codex) is Rust. [OpenHands](https://github.com/OpenHands/OpenHands) is the other major Python coding agent I know of, but I'm likely missing some others. (UPDATE: [Kimi CLI](https://github.com/MoonshotAI/kimi-cli) is another open source Apache 2 Python one.)\n\nThe Vibe source code is pleasant to read and the crucial prompts are neatly extracted out into Markdown files. Some key places to look:\n\n- [core/prompts/cli.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/prompts/cli.md) is the main system prompt (\"You are operating as and within Mistral Vibe, a CLI coding-agent built by Mistral AI...\")\n- [core/prompts/compact.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/prompts/compact.md) is the prompt used to generate compacted summaries of conversations (\"Create a comprehensive summary of our entire conversation that will serve as complete context for continuing this work...\")\n- Each of the core tools has its own prompt file:\n - [.../prompts/bash.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/bash.md)\n - [.../prompts/grep.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/grep.md)\n - [.../prompts/read\\_file.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/read_file.md)\n - [.../prompts/write\\_file.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/write_file.md)\n - [.../prompts/search\\_replace.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/search_replace.md)\n - [.../prompts/todo.md](https://github.com/mistralai/mistral-vibe/blob/v1.0.4/vibe/core/tools/builtins/prompts/todo.md)\n\nThe Python implementations of those tools [can be found here](https://github.com/mistralai/mistral-vibe/tree/v1.0.4/vibe/core/tools/builtins).\n\nI tried it out and had it build me a Space Invaders game using three.js with the following prompt:\n\n> `make me a space invaders game as HTML with three.js loaded from a CDN`\n\n\n\nHere's [the source code](https://github.com/simonw/space-invaders-by-llms/blob/main/mistral-vibe-devstral-2/index.html) and [the live game](https://space-invaders.simonwillison.net/mistral-vibe-devstral-2/) (hosted in my new [space-invaders-by-llms](https://github.com/simonw/space-invaders-by-llms) repo). It did OK.\n\n[#](https://simonwillison.net/2025/Dec/9/mistral-vibe/) [8:19 pm](https://simonwillison.net/2025/Dec/9/mistral-vibe/)\n/ [python](https://simonwillison.net/tags/python/), [ai](https://simonwillison.net/tags/ai/), [prompt-engineering](https://simonwillison.net/tags/prompt-engineering/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [textual](https://simonwillison.net/tags/textual/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [mistral](https://simonwillison.net/tags/mistral/), [pydantic](https://simonwillison.net/tags/pydantic/), [vibe-coding](https://simonwillison.net/tags/vibe-coding/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [system-prompts](https://simonwillison.net/tags/system-prompts/), [space-invaders](https://simonwillison.net/tags/space-invaders/)\n\n> I found the problem and it's really bad. Looking at your log, here's the catastrophic command that was run:\n>\n> ```\n> rm -rf tests/ patches/ plan/ ~/\n> ```\n>\n> See that `~/` at the end? That's your entire home directory. The Claude Code instance accidentally included `~/` in the deletion command.\n\n\u2014 [Claude](https://www.reddit.com/r/ClaudeAI/comments/1pgxckk/claude_cli_deleted_my_entire_home_directory_wiped/), after Claude Code deleted most of a user's Mac\n\n[#](https://simonwillison.net/2025/Dec/9/claude/) [12:04 pm](https://simonwillison.net/2025/Dec/9/claude/)\n/ [ai-ethics](https://simonwillison.net/tags/ai-ethics/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [claude](https://simonwillison.net/tags/claude/), [claude-code](https://simonwillison.net/tags/claude-code/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [ai](https://simonwillison.net/tags/ai/), [llms](https://simonwillison.net/tags/llms/)\n\n**[Prediction: AI will make formal verification go mainstream](https://martin.kleppmann.com/2025/12/08/ai-formal-verification.html)**\n( [via](https://lobste.rs/s/zsgdbg/prediction_ai_will_make_formal \"lobste.rs\"))\nMartin Kleppmann makes the case for formal verification languages (things like [Dafny](https://dafny.org/), [Nagini](https://github.com/marcoeilers/nagini), and [Verus](https://github.com/verus-lang/verus)) to finally start achieving more mainstream usage. Code generated by LLMs can benefit enormously from more robust verification, and LLMs themselves make these notoriously difficult systems easier to work with.\n\nThe paper [Can LLMs Enable Verification in Mainstream Programming?](https://arxiv.org/abs/2503.14183) by JetBrains Research in March 2025 found that Claude 3.5 Sonnet saw promising results for the three languages I listed above.\n\n[#](https://simonwillison.net/2025/Dec/9/formal-verification/) [3:11 am](https://simonwillison.net/2025/Dec/9/formal-verification/)\n/ [programming-languages](https://simonwillison.net/tags/programming-languages/), [ai](https://simonwillison.net/tags/ai/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [martin-kleppmann](https://simonwillison.net/tags/martin-kleppmann/)\n\n**[Deprecations via warnings don\u2019t work for Python libraries](https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries)**\n( [via](https://lobste.rs/s/pvaalr/deprecations_via_warnings_don_t_work_for \"lobste.rs\"))\nSeth Larson reports that [urllib3 2.6.0](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst#260-2025-12-05) released on the 5th of December and finally removed the `HTTPResponse.getheaders()` and `HTTPResponse.getheader(name, default)` methods, which have been marked as deprecated via warnings since [v2.0.0 in April 2023](https://github.com/urllib3/urllib3/releases/tag/2.0.0). They had to _add them back again_ in a hastily released [2.6.1](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst#261-2025-12-08) a few days later when it turned out major downstream dependents such as [kubernetes-client](https://github.com/kubernetes-client/python/issues/2280) and [fastly-py](https://github.com/fastly/fastly-py/pull/112) still hadn't upgraded.\n\nSeth says:\n\n> My conclusion from this incident is that [`DeprecationWarning`](https://docs.python.org/3/library/exceptions.html#DeprecationWarning) in its current state does not work for deprecating APIs, at least for Python libraries. That is unfortunate, as `DeprecationWarning` and the [`warnings` module](https://docs.python.org/3/library/warnings.html) are easy-to-use, language-\"blessed\", and explicit without impacting users that don't need to take action due to deprecations.\n\nOn Lobste.rs James Bennett [advocates for watching for warnings more deliberately](https://lobste.rs/s/pvaalr/deprecations_via_warnings_don_t_work_for#c_smnajm):\n\n> Something I always encourage people to do, and try to get implemented anywhere I work, is running Python test suites with `-Wonce::DeprecationWarning`. This doesn't spam you with noise if a deprecated API is called a lot, but still makes sure you see the warning so you know there's something you need to fix.\n\nI didn't know about the `-Wonce` option - [the documentation](https://docs.python.org/3/using/cmdline.html#cmdoption-W) describes that as \"Warn once per Python process\".\n\n[#](https://simonwillison.net/2025/Dec/9/deprecations-via-warnings/) [1:13 am](https://simonwillison.net/2025/Dec/9/deprecations-via-warnings/)\n/ [james-bennett](https://simonwillison.net/tags/james-bennett/), [open-source](https://simonwillison.net/tags/open-source/), [python](https://simonwillison.net/tags/python/), [seth-michael-larson](https://simonwillison.net/tags/seth-michael-larson/)\n\n### Dec. 8, 2025\n\n**[Niche Museums: The Museum of Jurassic Technology](https://www.niche-museums.com/116)**.\nI finally got to check off the museum that's been top of my want-to-go list since I first started documenting niche museums I've been to back in 2019.\n\nThe Museum of Jurassic Technology opened in Culver City, Los Angeles in 1988 and has been leaving visitors confused as to what's real and what isn't for nearly forty years.\n\n[#](https://simonwillison.net/2025/Dec/8/the-museum-of-jurassic-technology/) [3:16 am](https://simonwillison.net/2025/Dec/8/the-museum-of-jurassic-technology/)\n/ [museums](https://simonwillison.net/tags/museums/)\n\n### Dec. 7, 2025\n\n> Now I want to talk about _how_ they're selling AI. The growth narrative of AI is that AI will disrupt labor markets. I use \"disrupt\" here in its most disreputable, tech bro sense.\n>\n> The promise of AI \u2013 the promise AI companies make to investors \u2013 is that there will be AIs that can do your job, and when your boss fires you and replaces you with AI, he will keep half of your salary for himself, and give the other half to the AI company.\n>\n> That's it.\n>\n> That's the $13T growth story that MorganStanley is telling. It's why big investors and institutionals are giving AI companies hundreds of billions of dollars. And because _they_ are piling in, normies are also getting sucked in, risking their retirement savings and their family's financial security.\n\n\u2014 [Cory Doctorow](https://pluralistic.net/2025/12/05/pop-that-bubble/#u-washington), The Reverse Centaur\u2019s Guide to Criticizing AI\n\n[#](https://simonwillison.net/2025/Dec/7/cory-doctorow/) [9:28 pm](https://simonwillison.net/2025/Dec/7/cory-doctorow/)\n/ [cory-doctorow](https://simonwillison.net/tags/cory-doctorow/), [ai-ethics](https://simonwillison.net/tags/ai-ethics/), [ai](https://simonwillison.net/tags/ai/)\n\n**[Using LLMs at Oxide](https://rfd.shared.oxide.computer/rfd/0576)**\n( [via](https://lobste.rs/s/t5zgds/using_llms_at_oxide \"Lobste.rs\"))\nThoughtful guidance from Bryan Cantrill, who evaluates applications of LLMs against Oxide's core values of responsibility, rigor, empathy, teamwork, and urgency.\n\n[#](https://simonwillison.net/2025/Dec/7/using-llms-at-oxide/) [9:28 pm](https://simonwillison.net/2025/Dec/7/using-llms-at-oxide/)\n/ [ai](https://simonwillison.net/tags/ai/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [oxide](https://simonwillison.net/tags/oxide/), [bryan-cantrill](https://simonwillison.net/tags/bryan-cantrill/)\n\n> **What to try first?**\n>\n> Run Claude Code in a repo (whether you know it well or not) and ask a question about how something works. You'll see how it looks through the files to find the answer.\n>\n> The next thing to try is a code change where you know exactly what you want but it's tedious to type. Describe it in detail and let Claude figure it out. If there is similar code that it should follow, tell it so. From there, you can build intuition about more complex changes that it might be good at. \\[...\\]\n>\n> As conversation length grows, each message gets more expensive while Claude gets dumber. That's a bad trade! \\[...\\] Run `/reset` (or just quit and restart) to start over from scratch. Tell Claude to summarize the conversation so far to give you something to paste into the next chat if you want to save some of the context.\n\n\u2014 [David Crespo](https://gist.github.com/david-crespo/5c5eaf36a2d20be8a3013ba3c7c265d9), Oxide's internal tips on LLM use\n\n[#](https://simonwillison.net/2025/Dec/7/david-crespo/) [8:33 pm](https://simonwillison.net/2025/Dec/7/david-crespo/)\n/ [coding-agents](https://simonwillison.net/tags/coding-agents/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [oxide](https://simonwillison.net/tags/oxide/), [claude-code](https://simonwillison.net/tags/claude-code/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/)\n\n### Dec. 6, 2025\n\n**[The Unexpected Effectiveness of One-Shot Decompilation with Claude](https://blog.chrislewis.au/the-unexpected-effectiveness-of-one-shot-decompilation-with-claude/)**\n( [via](https://news.ycombinator.com/item?id=46080498 \"Hacker News\"))\nChris Lewis decompiles N64 games. He wrote about this previously in [Using Coding Agents to Decompile Nintendo 64 Games](https://blog.chrislewis.au/using-coding-agents-to-decompile-nintendo-64-games/), describing his efforts to decompile Snowboard Kids 2 ( [released in 1999](https://en.wikipedia.org/wiki/Snowboard_Kids_2)) using a \"matching\" process:\n\n> The matching decompilation process involves analysing the MIPS assembly, inferring its behaviour, and writing C that, when compiled with the same toolchain and settings, reproduces the exact code: same registers, delay slots, and instruction order. \\[...\\]\n>\n> A good match is more than just C code that compiles to the right bytes. It should look like something an N64-era developer would plausibly have written: simple, idiomatic C control flow and sensible data structures.\n\nChris was getting some useful results from coding agents earlier on, but this [new post](https://blog.chrislewis.au/the-unexpected-effectiveness-of-one-shot-decompilation-with-claude/) describes how a switching to a new processing Claude Opus 4.5 and Claude Code has massively accelerated the project - as demonstrated started by this chart on [the decomp.dev page](https://decomp.dev/cdlewis/snowboardkids2-decomp?mode=history) for his project:\n\n\n\nHere's [the prompt he was using](https://github.com/cdlewis/snowboardkids2-decomp/blob/852f47a4905a08d5d652387597bc5b47d29582f2/CLAUDE.md).\n\nThe big productivity boost was unlocked by switching to use Claude Code in non-interactive mode and having it tackle the less complicated functions (aka the lowest hanging fruit) first. Here's the relevant code from the [driving Bash script](https://github.com/cdlewis/snowboardkids2-decomp/blob/785db3cb0ce356e57ea5016835499fd6b393c490/tools/vacuum.sh#L44-L54):\n\n```\nsimplest_func=$(python3 tools/score_functions.py asm/nonmatchings/ 2>&1)\n# ...\noutput=$(claude -p \"decompile the function $simplest_func\" 2>&1 | tee -a tools/vacuum.log)\n```\n\n[score\\_functions.py](https://github.com/cdlewis/snowboardkids2-decomp/blob/785db3cb0ce356e57ea5016835499fd6b393c490/tools/score_functions.py) uses some heuristics to decide which of the remaining un-matched functions look to be the least complex.\n\n[#](https://simonwillison.net/2025/Dec/6/one-shot-decompilation/) [6:30 pm](https://simonwillison.net/2025/Dec/6/one-shot-decompilation/)\n/ [games](https://simonwillison.net/tags/games/), [ai](https://simonwillison.net/tags/ai/), [prompt-engineering](https://simonwillison.net/tags/prompt-engineering/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [claude-code](https://simonwillison.net/tags/claude-code/)\n\n> If you work slowly, you will be more likely to stick with your slightly obsolete work. You know that professor who spent seven years preparing lecture notes twenty years ago? He is not going to throw them away and start again, as that would be a new seven-year project. So he will keep teaching using aging lecture notes until he retires and someone finally updates the course.\n\n\u2014 [Daniel Lemire](https://lemire.me/blog/2025/12/05/why-speed-matters/), Why speed matters\n\n[#](https://simonwillison.net/2025/Dec/6/daniel-lemire/) [2:40 pm](https://simonwillison.net/2025/Dec/6/daniel-lemire/)\n/ [productivity](https://simonwillison.net/tags/productivity/)\n\n### Dec. 5, 2025\n\n**[TIL: Subtests in pytest 9.0.0+](https://til.simonwillison.net/pytest/subtests)**.\nI spotted an interesting new feature [in the release notes for pytest 9.0.0](https://docs.pytest.org/en/stable/changelog.html#pytest-9-0-0-2025-11-05): [subtests](https://docs.pytest.org/en/stable/how-to/subtests.html#subtests).\n\nI'm a _big_ user of the [pytest.mark.parametrize](https://docs.pytest.org/en/stable/example/parametrize.html) decorator - see [Documentation unit tests](https://simonwillison.net/2018/Jul/28/documentation-unit-tests/) from 2018 - so I thought it would be interesting to try out subtests and see if they're a useful alternative.\n\nShort version: this parameterized test:\n\n```\n@pytest.mark.parametrize(\"setting\", app.SETTINGS)\ndef test_settings_are_documented(settings_headings, setting):\n assert setting.name in settings_headings\n```\n\nBecomes this using subtests instead:\n\n```\ndef test_settings_are_documented(settings_headings, subtests):\n for setting in app.SETTINGS:\n with subtests.test(setting=setting.name):\n assert setting.name in settings_headings\n```\n\nWhy is this better? Two reasons:\n\n1. It appears to run a bit faster\n2. Subtests can be created programatically after running some setup code first\n\nI [had Claude Code](https://gistpreview.github.io/?0487e5bb12bcbed850790a6324788e1b) port [several tests](https://github.com/simonw/datasette/pull/2609/files) to the new pattern. I like it.\n\n[#](https://simonwillison.net/2025/Dec/5/til-pytest-subtests/) [6:03 am](https://simonwillison.net/2025/Dec/5/til-pytest-subtests/)\n/ [python](https://simonwillison.net/tags/python/), [testing](https://simonwillison.net/tags/testing/), [ai](https://simonwillison.net/tags/ai/), [pytest](https://simonwillison.net/tags/pytest/), [til](https://simonwillison.net/tags/til/), [generative-ai](https://simonwillison.net/tags/generative-ai/), [llms](https://simonwillison.net/tags/llms/), [ai-assisted-programming](https://simonwillison.net/tags/ai-assisted-programming/), [coding-agents](https://simonwillison.net/tags/coding-agents/), [claude-code](https://simonwillison.net/tags/claude-code/)\n\n**[Thoughts on Go vs. Rust vs. Zig](https://sinclairtarget.com/blog/2025/08/thoughts-on-go-vs.-rust-vs.-zig/)**\n( [via](https://news.ycombinator.com/item?id=46153466 \"Hacker News\"))\nThoughtful commentary on Go, Rust, and Zig by Sinclair Target. I haven't seen a single comparison that covers all three before and I learned a lot from reading this.\n\nOne thing that I hadn't noticed before is that none of these three languages implement class-based OOP.\n\n[#](https://simonwillison.net/2025/Dec/5/go-vs-rust-vs-zig/) [4:28 am](https://simonwillison.net/2025/Dec/5/go-vs-rust-vs-zig/)\n/ [go](https://simonwillison.net/tags/go/), [object-oriented-programming](https://simonwillison.net/tags/object-oriented-programming/), [programming-languages](https://simonwillison.net/tags/programming-languages/), [rust](https://simonwillison.net/tags/rust/), [zig](https://simonwillison.net/tags/zig/)\n\n**[The Resonant Computing Manifesto](https://resonantcomputing.org/)**.\nLaunched today at WIRED\u2019s [The Big Interview](https://events.wired.com/big-interview-2025) event, this manifesto (of which I'm a founding signatory) encourages a positive framework for thinking about building hyper-personalized AI-powered software - while avoiding the attention hijacking anti-patterns that defined so much of the last decade of software design.\n\nThis part in particular resonates with me:\n\n> For decades, technology has required standardized solutions to complex human problems. In order to scale software, you had to build for the average user, sanding away the edge cases. In many ways, this is why our digital world has come to resemble the sterile, deadening architecture that Alexander spent his career pushing back against.\n>\n> This is where AI provides a missing puzzle piece. Software can now respond fluidly to the context and particularity of each human\u2014at scale. One-size-fits-all is no longer a technological or economic necessity. Where once our digital environments inevitably shaped us against our will, we can now build technology that _adaptively shapes itself_ in service of our individual and collective aspirations.\n\nThere are echos here of the [Malleable software concept](https://www.inkandswitch.com/essay/malleable-software/) from Ink & Switch.\n\nThe manifesto proposes five principles for building resonant software: Keeping data **private** and under personal stewardship, building software that's **dedicated** to the user's interests, ensuring **plural** and distributed control rather than platform monopolies, making tools **adaptable** to individual context, and designing for **prosocial** membership of shared spaces.\n\nSteven Levy talked to the manifesto's lead instigator Alex Komoroske and provides some extra flavor in [It's Time to Save Silicon Valley From Itself](https://www.wired.com/story/big-interview-event-techdirt-mike-masnick-common-tools-alex-komoroske/):\n\n> By 2025, it was clear to Komoroske and his cohort that Big Tech had strayed far from its early idealistic principles. As Silicon Valley began to align itself more strongly with political interests, the idea emerged within the group to lay out a different course, and a casual suggestion led to a process where some in the group began drafting what became today\u2019s manifesto. They chose the word \u201cresonant\u201d to describe their vision mainly because of its positive connotations. As the document explains, \u201cIt\u2019s the experience of encountering something that speaks to our deeper values.\u201d\n\n[#](https://simonwillison.net/2025/Dec/5/resonant-computing/) [1:19 am](https://simonwillison.net/2025/Dec/5/resonant-computing/)\n/ [ai](https://simonwillison.net/tags/ai/), [alex-komoroske](https://simonwillison.net/tags/alex-komoroske/), [ai-ethics](https://simonwillison.net/tags/ai-ethics/)\n\n### Dec. 4, 2025\n\n**[Django 6.0 released](https://www.djangoproject.com/weblog/2025/dec/03/django-60-released/)**.\nDjango 6.0 includes a [flurry of neat features](https://docs.djangoproject.com/en/6.0/releases/6.0/), but the two that most caught my eye are **background workers** and **template partials**.\n\nBackground workers started out as [DEP (Django Enhancement Proposal) 14](https://github.com/django/deps/blob/main/accepted/0014-background-workers.rst), proposed and shepherded by Jake Howard. Jake prototyped the feature in [django-tasks](https://github.com/RealOrangeOne/django-tasks) and wrote [this extensive background on the feature](https://theorangeone.net/posts/django-dot-tasks-exists/) when it landed in core just in time for the 6.0 feature freeze back in September.\n\nKevin Wetzels published a useful [first look at Django's background tasks](https://roam.be/notes/2025/a-first-look-at-djangos-new-background-tasks/) based on the earlier RC, including notes on building a custom database-backed worker implementation.\n\n[Template Partials](https://docs.djangoproject.com/en/6.0/ref/templates/language/#template-partials) were implemented as a Google Summer of Code project by Farhan Ali Raza. I really like the design of this. Here's an example from [the documentation](https://docs.djangoproject.com/en/6.0/ref/templates/language/#inline-partials) showing the neat `inline` attribute which lets you both use and define a partial at the same time:\n\n```\n{# Define and render immediately. #}\n{% partialdef user-info inline %}\n
{{ user.bio }}
\n