<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: mdn</title><link href="http://feeds.simonwillison.net/" rel="alternate"/><link href="http://feeds.simonwillison.net/tags/mdn.atom" rel="self"/><id>http://feeds.simonwillison.net/</id><updated>2026-06-24T23:59:03+00:00</updated><author><name>Simon Willison</name></author><entry><title>simonw/browser-compat-db</title><link href="https://simonwillison.net/2026/Jun/24/browser-compat-db/#atom-tag" rel="alternate"/><published>2026-06-24T23:59:03+00:00</published><updated>2026-06-24T23:59:03+00:00</updated><id>https://simonwillison.net/2026/Jun/24/browser-compat-db/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/simonw/browser-compat-db"&gt;simonw/browser-compat-db&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Inspired by Mozilla's &lt;a href="https://developer.mozilla.org/en-US/blog/introducing-mdn-mcp-server/"&gt;new MDN MCP service&lt;/a&gt; - &lt;a href="https://github.com/mdn/mcp"&gt;source code here&lt;/a&gt; - I decided to try converting their comprehensive &lt;a href="https://github.com/mdn/browser-compat-data"&gt;mdn/browser-compat-data&lt;/a&gt; repository full of browser compatibility data into a SQLite database.&lt;/p&gt;
&lt;p&gt;This new GitHub repo includes a Claude Code for web (Opus 4.8) &lt;a href="https://github.com/simonw/browser-compat-db/blob/main/build_db.py"&gt;generated script&lt;/a&gt; for doing that using &lt;a href="https://github.com/simonw/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wanted the resulting ~66MB SQLite database to be available via the GitHub CDN with open CORS headers. GitHub releases don't have those, but any file stored in a regular GitHub repository does - so I had Codex Desktop (GPT-5.5) build &lt;a href="https://github.com/simonw/browser-compat-db/blob/main/.github/workflows/build-db.yml"&gt;a GitHub Actions workflow&lt;/a&gt; that builds the database and then force-pushes it to a &lt;code&gt;db&lt;/code&gt; "orphan" branch.&lt;/p&gt;
&lt;p&gt;You can download the resulting database &lt;a href="https://github.com/simonw/browser-compat-db/blob/db/browser-compat.db"&gt;from here&lt;/a&gt;, and since it's hosted with open CORS headers you can also &lt;a href="https://lite.datasette.io/?url=https://github.com/simonw/browser-compat-db/blob/db/browser-compat.db#/browser-compat/releases_tree"&gt;explore it with Datasette Lite&lt;/a&gt;.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozilla"&gt;mozilla&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-lite"&gt;datasette-lite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/model-context-protocol"&gt;model-context-protocol&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mdn"&gt;mdn&lt;/a&gt;&lt;/p&gt;



</summary><category term="github"/><category term="mozilla"/><category term="projects"/><category term="github-actions"/><category term="datasette-lite"/><category term="ai-assisted-programming"/><category term="model-context-protocol"/><category term="mdn"/></entry><entry><title>MDN Browser Support Timelines</title><link href="https://simonwillison.net/2024/Nov/11/mdn-browser-support-timelines/#atom-tag" rel="alternate"/><published>2024-11-11T03:27:08+00:00</published><updated>2024-11-11T03:27:08+00:00</updated><id>https://simonwillison.net/2024/Nov/11/mdn-browser-support-timelines/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://tools.simonwillison.net/mdn-timelines"&gt;MDN Browser Support Timelines&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I &lt;a href="https://news.ycombinator.com/item?id=42101434#42103439"&gt;complained on Hacker News&lt;/a&gt; today that I wished the MDN browser compatibility ables - like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API#browser_compatibility"&gt;this one for the Web Locks API&lt;/a&gt; - included an indication as to when each browser was released rather than just the browser numbers.&lt;/p&gt;
&lt;p&gt;It turns out they do! If you click on each browser version in turn you can see an expanded area showing the browser release date:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/mdn-browser-info.gif" class="blogmark-image" style="width: 90%" alt="Animated GIF showing the table, clicking a browser version expands a box showing when it was released"&gt;&lt;/p&gt;
&lt;p&gt;There's even &lt;a href="https://github.com/mdn/yari/pull/6777"&gt;an inline help tip&lt;/a&gt; telling you about the feature, which I've been studiously ignoring for years.&lt;/p&gt;
&lt;p&gt;I want to see all the information at once without having to click through each browser. I had a poke around in the Firefox network tab and found &lt;a href="https://bcd.developer.mozilla.org/bcd/api/v0/current/api.Lock.json"&gt;https://bcd.developer.mozilla.org/bcd/api/v0/current/api.Lock.json&lt;/a&gt; - a JSON document containing browser support details (with release dates) for that API... and it was served using &lt;code&gt;access-control-allow-origin: *&lt;/code&gt; which means I can hit it from my own little client-side applications.&lt;/p&gt;
&lt;p&gt;I decided to build something with an autocomplete drop-down interface for selecting the API. That meant I'd need a list of all of the available APIs, and I used GitHub code search to find that in the &lt;a href="https://github.com/mdn/browser-compat-data/tree/main/api"&gt;mdn/browser-compat-data&lt;/a&gt; repository, in the &lt;code&gt;api/&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;I needed the list of files in that directory for my autocomplete. Since there are just over 1,000 of those the regular &lt;a href="https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#get-repository-content"&gt;GitHub contents API&lt;/a&gt; won't return them all, so I switched to the &lt;a href="https://docs.github.com/en/rest/git/trees?apiVersion=2022-11-28#get-a-tree"&gt;tree API&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://tools.simonwillison.net/mdn-timelines"&gt;the finished tool&lt;/a&gt; - &lt;a href="https://github.com/simonw/tools/blob/main/mdn-timelines.html"&gt;source code here&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/mdn-timeline.jpg" class="blogmark-image" style="width: 90%" alt="Screenshot of browser support timeline. MDN Browser Support Timelines heading, ViewTransition search box, and api.ViewTransition section showing MDN Documentation and Specification links. Timeline shows Standard_track releases: webview_android v111 (Feb 28 2023), chrome v111 (Mar 6 2023), chrome_android v111 (Mar 6 2023), edge v111 (Mar 12 2023), opera v97 (Mar 21 2023), opera_android v75 (May 16 2023), samsunginternet_android v22.0 (Jul 13 2023), safari v18 (Sep 15 2024), safari_ios v18 (Sep 15 2024), webview_ios v18 (Sep 15 2024). Not Supported: firefox, firefox_android, ie, oculus"&gt;&lt;/p&gt;
&lt;p&gt;95% of the code was written by LLMs, but I did a whole lot of assembly and iterating to get it to the finished state. Three of the transcripts for that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/simonw/1af1cd4f51c3dc2fa84cca0fa4746a7e"&gt;Web Locks API Browser Support Timeline&lt;/a&gt; in which I paste in the original API JSON and ask it to come up with a timeline visualization for it.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/simonw/8c71a931921789e11f1d33f09d9ad9ae"&gt;Enhancing API Feature Display with URL Hash&lt;/a&gt; where I dumped in a more complex JSON example to get it to show multiple APIs on the same page, and also had it add &lt;code&gt;#fragment&lt;/code&gt; bookmarking to the tool&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/simonw/d079404506621e8cafaf752f3a0c491a"&gt;Fetch GitHub API Data Hierarchy&lt;/a&gt; where I got it to write me an async JavaScript function for fetching a directory listing from that tree API.&lt;/li&gt;
&lt;/ul&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozilla"&gt;mozilla&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-3-5-sonnet"&gt;claude-3-5-sonnet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mdn"&gt;mdn&lt;/a&gt;&lt;/p&gt;



</summary><category term="firefox"/><category term="github"/><category term="javascript"/><category term="mozilla"/><category term="projects"/><category term="ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="claude-3-5-sonnet"/><category term="mdn"/></entry><entry><title>mdn-timelines</title><link href="https://simonwillison.net/2024/Nov/11/mdn-timelines/#atom-tag" rel="alternate"/><published>2024-11-11T01:54:20+00:00</published><updated>2024-11-11T01:54:20+00:00</updated><id>https://simonwillison.net/2024/Nov/11/mdn-timelines/#atom-tag</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://tools.simonwillison.net/mdn-timelines"&gt;mdn-timelines&lt;/a&gt;&lt;/p&gt;
        
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/mdn"&gt;mdn&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="mdn"/></entry><entry><title>MDN: Subdomain takeovers</title><link href="https://simonwillison.net/2021/Aug/22/mdn-subdomain-takeovers/#atom-tag" rel="alternate"/><published>2021-08-22T05:31:58+00:00</published><updated>2021-08-22T05:31:58+00:00</updated><id>https://simonwillison.net/2021/Aug/22/mdn-subdomain-takeovers/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Subdomain_takeovers"&gt;MDN: Subdomain takeovers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
MDN have a page about subdomain takeover attacks that focuses more on CNAME records: if you have a CNAME pointing to a common delegated hosting provider but haven’t yet provisioned your virtual host there, someone else might beat you to it and use it for an XSS attack.&lt;/p&gt;

&lt;p&gt;“Preventing subdomain takeovers is a matter of order of operations in lifecycle management for virtual hosts and DNS.”&lt;/p&gt;

&lt;p&gt;I now understand why Google Cloud make your “prove” your ownership of a domain before they’ll let you configure it to host e.g. a Cloud Run instance.

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


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dns"&gt;dns&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mdn"&gt;mdn&lt;/a&gt;&lt;/p&gt;



</summary><category term="dns"/><category term="security"/><category term="mdn"/></entry></feed>