Example dashboard

Various statistics from my blog.

Owned by simonw, visibility: Public

Entries

3258

SQL query
select 'Entries' as label, count(*) as big_number from blog_entry

Blogmarks

8227

SQL query
select 'Blogmarks' as label, count(*) as big_number from blog_blogmark

Quotations

1316

SQL query
select 'Quotations' as label, count(*) as big_number from blog_quotation

Chart of number of entries per month over time

SQL query
select '<h2>Chart of number of entries per month over time</h2>' as html
SQL query
select to_char(date_trunc('month', created), 'YYYY-MM') as bar_label,
count(*) as bar_quantity from blog_entry group by bar_label order by count(*) desc

Ten most recent blogmarks (of 8227 total)

SQL query
select '## Ten most recent blogmarks (of ' || count(*) || ' total)' as markdown from blog_blogmark
SQL query
select link_title, link_url, commentary, created from blog_blogmark order by created desc limit 10

10 rows

link_title link_url commentary created
How Google Got Its Groove Back and Edged Ahead of OpenAI https://www.wsj.com/tech/ai/google-ai-openai-gemini-chatgpt-b766e160 I picked up a few interesting tidbits from this Wall Street Journal piece on Google's recent hard won success with Gemini. Here's the origin of the name "Nano Banana": > Naina Raisinghani, known inside Google for working late into the night, needed a name for the new tool to complete the upload. It was 2:30 a.m., though, and nobody was around. So she just made one up, a mashup of two nicknames friends had given her: Nano Banana. The WSJ credit OpenAI's Daniel Selsam with un-retiring Sergei Brin: > Around that time, Google co-founder Sergey Brin, who had recently retired, was at a party chatting with a researcher from OpenAI named Daniel Selsam, according to people familiar with the conversation. Why, Selsam asked him, wasn’t he working full time on AI. Hadn’t the launch of ChatGPT captured his imagination as a computer scientist? > > ChatGPT was on its way to becoming a household name in AI chatbots, while Google was still fumbling to get its product off the ground. Brin decided Selsam had a point and returned to work. And we get some rare concrete user numbers: > By October, Gemini had more than 650 million monthly users, up from 450 million in July. The LLM usage number I see cited most often is OpenAI's 800 million weekly active users for ChatGPT. That's from October 6th at OpenAI DevDay so it's comparable to these Gemini numbers, albeit not directly since it's weekly rather than monthly actives. I'm also never sure what counts as a "Gemini user" - does interacting via Google Docs or Gmail count or do you need to be using a Gemini chat interface directly? 2026-01-08 15:32:08+00:00
A field guide to sandboxes for AI https://www.luiscardoso.dev/blog/sandboxes-for-ai This guide to the current sandboxing landscape by Luis Cardoso is comprehensive, dense and absolutely fantastic. He starts by differentiating between containers (which share the host kernel), microVMs (their own guest kernel behind hardwae virtualization), gVisor userspace kernels and WebAssembly/isolates that constrain everything within a runtime. The piece then dives deep into terminology, approaches and the landscape of existing tools. I think using the right sandboxes to safely run untrusted code is one of the most important problems to solve in 2026. This guide is an invaluable starting point. 2026-01-06 22:38:00+00:00
It’s hard to justify Tahoe icons https://tonsky.me/blog/tahoe-icons/ Devastating critique of the new menu icons in macOS Tahoe by Nikita Prokopov, who starts by quoting the 1992 Apple HIG rule to not "overload the user with complex icons" and then provides comprehensive evidence of Tahoe doing exactly that. > In my opinion, Apple took on an impossible task: to add an icon to every menu item. There are just not enough good metaphors to do something like that. > > But even if there were, the premise itself is questionable: if everything has an icon, it doesn’t mean users will find what they are looking for faster. > > And even if the premise was solid, I still wish I could say: they did the best they could, given the goal. But that’s not true either: they did a poor job consistently applying the metaphors and designing the icons themselves. 2026-01-05 19:30:24+00:00
Oxide and Friends Predictions 2026, today at 4pm PT https://discord.com/invite/QrcKGTTPrF I joined the Oxide and Friends podcast [last year](https://simonwillison.net/2025/Jan/10/ai-predictions/) to predict the next 1, 3 and 6 years(!) of AI developments. With hindsight I did very badly, but they're inviting me back again anyway to have another go. We will be recording live today at 4pm Pacific on their Discord - [you can join that here](https://discord.com/invite/QrcKGTTPrF), and the podcast version will go out shortly afterwards. I'll be recording at their office in Emeryville and then heading to [the Crucible](https://www.thecrucible.org/) to learn how to make neon signs. 2026-01-05 16:53:05+00:00
Was Daft Punk Having a Laugh When They Chose the Tempo of Harder, Better, Faster, Stronger? https://www.madebywindmill.com/tempi/blog/hbfs-bpm/ Depending on how you measure it, the tempo of Harder, Better, Faster, Stronger appears to be 123.45 beats per minute. This is one of those things that's so cool I'm just going to accept it as true. (I only today learned from [the Hacker News comments](https://news.ycombinator.com/item?id=46469577#46470831) that Veridis Quo is "Very Disco", and if you flip the order of those words you get Discovery, the name of the album.) 2026-01-03 05:57:07+00:00
The most popular blogs of Hacker News in 2025 https://refactoringenglish.com/blog/2025-hn-top-5/ Michael Lynch maintains [HN Popularity Contest](https://refactoringenglish.com/tools/hn-popularity/), a site that tracks personal blogs on Hacker News and scores them based on how well they perform on that platform. The engine behind the project is the [domain-meta.csv](https://github.com/mtlynch/hn-popularity-contest-data/blob/master/data/domains-meta.csv) CSV on GiHub, a hand-curated list of known personal blogs with author and bio and tag metadata, which Michael uses to separate out personal blog posts from other types of content. I came top of the rankings in 2023, 2024 and 2025 but I'm listed [in third place](https://refactoringenglish.com/tools/hn-popularity/) for all time behind Paul Graham and Brian Krebs. I dug around in the browser inspector and was delighted to find that the data powering the site is served with open CORS headers, which means you can easily explore it with external services like Datasette Lite. Here's a convoluted window function query Claude Opus 4.5 [wrote for me](https://claude.ai/share/8e1cb294-0ff0-4d5b-b83f-58e4c7fdb0d2) which, for a given domain, shows where that domain ranked for each year since it first appeared in the dataset: <pre><span class="pl-s">with yearly_scores as (</span> <span class="pl-s"> select </span> <span class="pl-s"> domain,</span> <span class="pl-s"> strftime('%Y', date) as year,</span> <span class="pl-s"> sum(score) as total_score,</span> <span class="pl-s"> count(distinct date) as days_mentioned</span> <span class="pl-s"> from "hn-data"</span> <span class="pl-s"> group by domain, strftime('%Y', date)</span> <span class="pl-s">),</span> <span class="pl-s">ranked as (</span> <span class="pl-s"> select </span> <span class="pl-s"> domain,</span> <span class="pl-s"> year,</span> <span class="pl-s"> total_score,</span> <span class="pl-s"> days_mentioned,</span> <span class="pl-s"> rank() over (partition by year order by total_score desc) as rank</span> <span class="pl-s"> from yearly_scores</span> <span class="pl-s">)</span> <span class="pl-s">select </span> <span class="pl-s"> r.year,</span> <span class="pl-s"> r.total_score,</span> <span class="pl-s"> r.rank,</span> <span class="pl-s"> r.days_mentioned</span> <span class="pl-s">from ranked r</span> <span class="pl-s">where r.domain = :domain</span> <span class="pl-s"> and r.year &gt;= (</span> <span class="pl-s"> select min(strftime('%Y', date)) </span> <span class="pl-s"> from "hn-data"</span> <span class="pl-s"> where domain = :domain</span> <span class="pl-s"> )</span> <span class="pl-s">order by r.year desc</span></pre> (I just noticed that the last `and r.year >= (` clause isn't actually needed here.) My [simonwillison.net results](https://lite.datasette.io/?csv=https://hn-popularity.cdn.refactoringenglish.com/hn-data.csv#/data?sql=with+yearly_scores+as+%28%0A++select+%0A++++domain%2C%0A++++strftime%28%27%25Y%27%2C+date%29+as+year%2C%0A++++sum%28score%29+as+total_score%2C%0A++++count%28distinct+date%29+as+days_mentioned%0A++from+%22hn-data%22%0A++group+by+domain%2C+strftime%28%27%25Y%27%2C+date%29%0A%29%2C%0Aranked+as+%28%0A++select+%0A++++domain%2C%0A++++year%2C%0A++++total_score%2C%0A++++days_mentioned%2C%0A++++rank%28%29+over+%28partition+by+year+order+by+total_score+desc%29+as+rank%0A++from+yearly_scores%0A%29%0Aselect+%0A++r.year%2C%0A++r.total_score%2C%0A++r.rank%2C%0A++r.days_mentioned%0Afrom+ranked+r%0Awhere+r.domain+%3D+%3Adomain%0A++and+r.year+%3E%3D+%28%0A++++select+min%28strftime%28%27%25Y%27%2C+date%29%29+%0A++++from+%22hn-data%22%0A++++where+domain+%3D+%3Adomain%0A++%29%0Aorder+by+r.year+desc&domain=simonwillison.net) show me ranked 3rd in 2022, 30th in 2021 and 85th back in 2007 - though I expect there are many personal blogs from that year which haven't yet been manually added to Michael's list. Also useful is that every domain gets its own CORS-enabled CSV file with details of the actual Hacker News submitted from that domain, e.g. `https://hn-popularity.cdn.refactoringenglish.com/domains/simonwillison.net.csv`. Here's [that one in Datasette Lite](https://lite.datasette.io/?csv=https://hn-popularity.cdn.refactoringenglish.com/domains/simonwillison.net.csv#/data/simonwillison). 2026-01-02 19:10:43+00:00
Codex cloud is now called Codex web https://developers.openai.com/codex/cloud/ It looks like OpenAI's **Codex cloud** (the cloud version of their Codex coding agent) was quietly rebranded to **Codex web** at some point in the last few days. Here's a screenshot of the Internet Archive copy from [18th December](https://web.archive.org/web/20251218043013/https://developers.openai.com/codex/cloud/) (the [capture on the 28th](https://web.archive.org/web/20251228124455/https://developers.openai.com/codex/cloud/) maintains that Codex cloud title but did not fully load CSS for me): ![Screenshot of the Codex cloud documentation page](https://static.simonwillison.net/static/2025/codex-cloud.jpg) And here's that same page today with the updated product name: ![Same documentation page only now it says Codex web](https://static.simonwillison.net/static/2025/codex-web.jpg) Anthropic's equivalent product has the incredibly clumsy name [Claude Code on the web](https://code.claude.com/docs/en/claude-code-on-the-web), which I shorten to "Claude Code for web" but even then bugs me because I mostly interact with it via Anthropic's native mobile app. I was hoping to see Claude Code for web rebrand to Claude Code Cloud - I did *not* expect OpenAI to rebrand in the opposite direction! **Update**: [Clarification](https://twitter.com/thsottiaux/status/2006421779246624875) from OpenAI Codex engineering lead Thibault Sottiaux: > Just aligning the documentation with how folks refer to it. I personally differentiate between cloud tasks and codex web. With cloud tasks running on our hosted runtime (includes code review, github, slack, linear, ...) and codex web being the web app. I asked what they called Codex in the iPhone app and [he said](https://twitter.com/thsottiaux/status/2006423057179750625): > Codex iOS 2025-12-31 16:35:28+00:00
TIL: Downloading archived Git repositories from archive.softwareheritage.org https://til.simonwillison.net/github/software-archive-recovery Back in February I [blogged about](https://simonwillison.net/2025/Feb/7/sqlite-s3vfs/) a neat Python library called `sqlite-s3vfs` for accessing SQLite databases hosted in an S3 bucket, released as MIT licensed open source by the UK government's Department for Business and Trade. I went looking for it today and found that the [github.com/uktrade/sqlite-s3vfs](https://github.com/uktrade/sqlite-s3vfs) repository is now a 404. Since this is taxpayer-funded open source software I saw it as my moral duty to try and restore access! It turns out [a full copy](https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://github.com/uktrade/sqlite-s3vfs) had been captured by [the Software Heritage archive](https://archive.softwareheritage.org/), so I was able to restore the repository from there. My copy is now archived at [simonw/sqlite-s3vfs](https://github.com/simonw/sqlite-s3vfs). The process for retrieving an archive was non-obvious, so I've written up a TIL and also published a new [Software Heritage Repository Retriever](https://tools.simonwillison.net/software-heritage-repo#https%3A%2F%2Fgithub.com%2Fuktrade%2Fsqlite-s3vfs) tool which takes advantage of the CORS-enabled APIs provided by Software Heritage. Here's [the Claude Code transcript](https://gistpreview.github.io/?3a76a868095c989d159c226b7622b092/index.html) from building that. 2025-12-30 23:51:33+00:00
shot-scraper 1.9 https://github.com/simonw/shot-scraper/releases/tag/1.9 New release of my [shot-scraper](https://shot-scraper.datasette.io/) CLI tool for taking screenshots and scraping websites with JavaScript from the terminal. > - The `shot-scraper har` command has a new `-x/--extract` option which extracts all of the resources loaded by the page out to a set of files. This location can be controlled by the `-o dir/` option. [#184](https://github.com/simonw/shot-scraper/issues/184) > - Fixed the `shot-scraper accessibility` command for compatibility with the latest Playwright. [#185](https://github.com/simonw/shot-scraper/issues/185) The new `shot-scraper har -x https://simonwillison.net/` command is really neat. The inspiration was [the digital forensics expedition](https://simonwillison.net/2025/Dec/26/slop-acts-of-kindness/#digital-forensics-with-shot-scraper-har) I went on to figure out why Rob Pike got spammed. You can now perform a version of that investigation like this: cd /tmp shot-scraper har --wait 10000 'https://theaidigest.org/village?day=265' -x Then dig around in the resulting JSON files in the `/tmp/theaidigest-org-village` folder. 2025-12-29 22:33:13+00:00
Copyright Release for Contributions To SQLite https://www.sqlite.org/copyright-release.html D. Richard Hipp [called me out](https://news.ycombinator.com/item?id=46420453#46424225) for spreading misinformation on Hacker News that SQLite refuses outside contributions: > No, Simon, we don't "refuse". We are just very selective and there is a lot of paperwork involved to confirm the contribution is in the public domain and does not contaminate the SQLite core with licensed code. I deeply regret this error! I'm linking to the copyright release document here - it looks like SQLite's public domain nature makes this kind of clause extremely important: > [...] To the best of my knowledge and belief, the changes and enhancements that I have contributed to SQLite are either originally written by me or are derived from prior works which I have verified are also in the public domain and are not subject to claims of copyright by other parties. Out of curiosity I decided to see how many people have contributed to SQLite outside of the core team of Richard, Dan and Joe. I ran that query using Fossil, SQLite's own SQLite-based version control system, like this: brew install fossil fossil clone https://www.sqlite.org/src sqlite.fossil fossil sql -R sqlite.fossil " SELECT user, COUNT(*) as commits FROM event WHERE type='ci' GROUP BY user ORDER BY commits DESC " I got back 38 rows, though I think `danielk1977` and `dan` may be duplicates. **Update**: The SQLite team have clarified this on their [SQLite is Public Domain](https://sqlite.org/copyright.html) page. It used to read "In order to keep SQLite completely free and unencumbered by copyright, the project does not accept patches." - it now reads: > In order to keep SQLite completely free and unencumbered by copyright, the project does not accept patches from random people on the internet. There is a process to get a patch accepted, but that process is involved and for smaller changes is not normally worth the effort. 2025-12-29 19:58:45+00:00
Copy and export data

Duration: 4.29ms