Simon Willison's TILs
til.simonwillison.net · Personal blog · on HN since 2020
Simon Willison's collection of short 'Today I Learned' notes on programming tools, SQLite, Python, and working with LLMs.
What HN saysHN commenters call it an extremely useful set of small learnings, though one suggests grouping entries by topic to make browsing easier.
111HN people shared it
49linked it in comments
123stories submitted
2.9Kstory points
3 months agolast shared
2020people per year2026
Most-shared posts
- 1Simon Willison's cool categorised TIL page8 people · 3 points · first shared 2020 · discussion on HN
- 2A simple Python implementation of the ReAct pattern for LLMs (2023)8 people · 2 points · first shared 2023 · discussion on HN
- 3Running LLaMA 7B on a 64GB M2 MacBook Pro with Llama.cpp7 people · 2 points · first shared 2023 · discussion on HN
- 4One-liner for running queries against CSV files with SQLite6 people · 753 points · first shared 2022 · 127 comments on HN
- 5Simon Willison: Deno KV5 people · 5 points · first shared 2023 · discussion on HN
- 6Using Codex CLI with GPT-OSS:120B on an Nvidia DGX Spark via Tailscale4 people · 9 points · first shared 2025 · discussion on HN
- 7GPT-4 for API design research4 people · 3 points · first shared 2023 · discussion on HN
- 8Summarizing Hacker News Discussion Themes with Claude and LLM4 people · 1 points · first shared 2023 · discussion on HN
- 9Compiling and running sqlite3-rsync from a branch3 people · 63 points · first shared 2024 · 15 comments on HN
- 10Querying the GitHub archive with the ClickHouse playground3 people · 11 points · first shared 2023 · discussion on HN
- 11How to read Hacker News threads with most recent comments first3 people · 8 points · first shared 2023 · 2 comments on HN
- 12Using LLM in the shebang line of a script3 people · 6 points · first shared 2026 · discussion on HN
- 13Downloading every video for a TikTok account3 people · 6 points · first shared 2025 · discussion on HN
- 14Building a Blog in Django3 people · 3 points · first shared 2023 · discussion on HN
- 15Using Playwright MCP with Claude Code3 people · 3 points · first shared 2025 · discussion on HN
What HN people wrote when they linked it
simonw · 2022-06-11
Make notes, in private and in public.
I have a private "notes" repo on GitHub where I keep notes in the issues (the repo itself is empty). Any time I'm trying out a new piece of software I open an issue there, then add notes on the issue comments as I figure things out.
I use GitHub issues because they have excellent backups and they show up on GitHub search - plus there's a really good API which I use to periodically export and backup my notes elsewhere.
If something fits the TIL format, I'll turn my notes into a TIL and publish them on https://til.simonwillison.net - that site uses the markdown format as GitHub issues, so publishing a TIL that started out as an issue comment only takes me a few minutes.
lucb1e · 2021-05-02
Link to actual TILs: https://til.simonwillison.net/
In case the author reads this, what might be useful is to group them by some topic. A framework is only interesting if I also use it, and as it is, I'm not into front-end dev so none of the frameworks are interesting to me, but I have to read the 41 categories individually because they're spread throughout. Same for Mac stuff (I have no mac, so I don't use homebrew), database engines, python: they're all over the place.
---
This one sounded interesting: "Search across all loaded resources in Firefox" but unfortunately it's just about the debugger (the debugger also gives you that help right when you open it). What I'd love to know is how to ctrl+f across all tabs' page contents, or even just a stable search field that doesn't change every time I switch tab (so I can just Ctrl+Tab,F3 across them).
abdelhousni · 2026-03-23
You should follow @simonw
Here's his procedure
https://til.simonwillison.net/llms/openclaw-docker
john-tells-all · 2025-12-23
Simon's blog is stellar, and he posts on many tech topics in addition to AI.
His "Today I Learned" series is an extremely useful selection of small learnings: https://til.simonwillison.net/
aquariusDue · 2025-07-12
Well, sometimes I'm digging through my (multiple!) lists of links when I remember a tidbit that relates to what I'm working on but most of the time those lists gather dust.
In the future I'd like to maintain a link log or something similar on my personal website like some people do:
- https://matklad.github.io/links.html
- https://dotat.at/:/
- https://til.simonwillison.net/
The weird thing about saved links in my case is that I get the most satisfaction out of them when I share them with friends and so on, a bit of "Hey! I think this might be helpful, here you go" and that ends up being the extent of that particular link's usefulness for myself most of the time. Of course I can't accurately gauge how helpful it actually is for the other person.
askiiart · 2023-11-07
This inspired simonw's (among other things, the creator of the `llm` CLI tool) TIL, so I'd wager we'll be seeing him in this thread soon. Until then, here the link: https://til.simonwillison.net/
scrollaway · 2022-12-16
Im very surprised that, among techies, there aren't more people running their own instance as a solo user, so that they can own the entire username including the domain name.
It's what I did for myself (Follow me! @[email protected]), following Simon Willison's post: https://til.simonwillison.net/mastodon/custom-domain-mastodon
danso · 2022-07-01
By no means am I crapping on what you've created — it looks great, and I've always wanted to try DuckDB and now you've made a frictionless entrypoint — just wanted to point out in general that querying CSV with SQL is more accessible than some people might have assumed. e.g. here's a recent TIL blogpost from Simon Willison about him discovering how to do sqlite queries against CSV from the command line: https://til.simonwillison.net/sqlite/one-line-csv-operations
One suggestion I would make: the Uber trips data is interesting, but might be too big for this demo? I was getting a few loading errors when trying it (didn't investigate where in the process the bottleneck was though)
superasn · 2021-05-02
Thanks! This bash string escape trick will be really useful for me(1). It is one of the biggest pain points in using cli especially with nested commands like su -c where the actual command is supposed to go inside quotes and becomes hell to quote if it too has nested quotes inside it.
Oh how i wish that bash and every other language would support the Perl's brilliant `q()` and `qq()` for quoting strings. That simple fn really made life very easy and code cleaner.
(1) https://til.simonwillison.net/bash/escaping-a-string
pixelmonkey · 2024-05-22
This is a cool idea. I also really like simonw’s TIL feed:
https://til.simonwillison.net/
Like a microblog of little learnings in day-to-day development.
One interesting thing that occurred to me recently is that my personal site (https://amontalenti.com) is more an essay archive and identity verification tool, than it is a “blog” or “microblog.” That is, the timestamps of the content on there are the least interesting thing about it. The most valuable page, for me, is https://amontalenti.com/archive.
As for something like /now, the most fascinating implementation of this is an old friend of mine from college. He and I were both early 2000s bloggers, but he came up with the idea, in 2001 or so, to keep a nearly-daily one sentence personal diary on his blog. He kept that up for the last 20+ years (he is nowadays a CS researcher and inventor in HCI). Very impressive near-daily microblogging habit over a lifetime!
https://www.chrisharrison.net/index.php/Home/Log
theptip · 2023-09-12
I see some of the same problems in Django; it's so productive at first, the ecosystem is great, DevX is delightful, and when your app is simple enough that a layered architecture feels like way too much boilerplate, you can just write amazing simple code. A great example is Simon Wilson's recent post https://til.simonwillison.net/django/building-a-blog-in-django - the views.py is :chefs-kiss:.
However when you get to multiple teams and multiple 100s of kloc, the architectural demands start to get stronger, and Django can become a bit hard to work with. If you have a shallow wide domain, then it's not really a problem; just stick to fat models with controllers, and everything is OK, you just add more models. But when your domain is deep, with layers of concepts, and lots of interaction between different subsets of models, you start to want to pull out an Application Layer to wrap your Domain Layer.
Tactically it also starts to be really hard to guarantee you're not doing O(N) queries, and I've found django-seal to be a great solution (seal a QuerySet after fetching so you can't accidentally do follow-up queries, forcing you to build everything into a single query with select_related/prefetch_related). However when you look at how complex the implementation of the *_related caching is, you start to wonder if a simpler, more flexible ORM like SQLAlchemy would serve you better.
I think "how many loc is your app" would be a helpful qualifier for these discussions, as I suspect…
andyk · 2023-03-20
It is quite unstable and frequently generates incorrect results. E.g., with the Fibonacci sequence prompt, sometimes it skips a number entirely, sometimes it produces a number that is off-by-one but then gets the following number(s) correct.
I wonder how much of this is because the model has memorized the Fibonacci sequence. It is possible to have it just return the sequence in a single call, but that isn't really the point here. Instead this is more an exploration of how to agent-ify the model in the spirit of [1][2] via prompts that generate other prompts.
This reminds me a bit of how a CPU works, i.e., as a dumb loop that fetches and executes the next instruction, whatever it may be. Well in this case our "agent" is just a dumb python loop that fetches the next prompt (which is generated by the current prompt) whatever it may be... until it arrives at a prompt that doesn't lead to another prompt.
[1] A simple Python implementation of the ReAct pattern for LLMs. Simon Willison. https://til.simonwillison.net/llms/python-react-pattern
[2] ReAct: Synergizing Reasoning and Acting in Language Models. Shunyu Yao et al. https://react-lm.github.io/
rolleiflex · 2023-03-12
I'm following the instructions on the post from the original owner of the repository involved here. It's at https://til.simonwillison.net/llms/llama-7b-m2 and it is much simpler. (no affiliation with author)
I'm currently running the 65B model just fine. It is a rather surreal experience, a ghost in my shell indeed.
As an aside, I'm seeing an interesting behaviour on the `-t` threads flag. I originally expected that this was similar to `make -j` flag where it controls the number of parallel threads but the total computation done would be the same. What I'm seeing is that this seems to change the fidelity of the output. At `-t 8` it has the fastest output presumably since that is the number of performance cores my M2 Max has. But up to `-t 12` the output fidelity increases, even though the output drastically slows down. I have 8 perf and 4 efficiency cores, so that makes superficial sense. At `-t 13` onwards, the performance exponentially decreases to the point that I effectively no longer have output.
aspenmayer · 2026-06-25
That’s an interesting idea. I think that folks have already built something like this for internal use or as a service, but I’m not sure if it exists as a free service.
This might be enough to get you started if you wanted to roll your own (h/t @simonw):
> Summarizing Hacker News discussion themes with Claude and LLM
https://til.simonwillison.net/llms/claude-hacker-news-themes
For something similar at the story level, but without any kind of sentiment analysis, there’s this:
https://hnrankings.com/
PufPufPuf · 2026-06-11
FWIW you can replace pngpaste with a simple script: https://til.simonwillison.net/macos/impaste
Zbar seems to provide prebuilt binaries here https://linuxtv.org/downloads/zbar/binaries/ (haven't checked it myself)
Thanks for the docker tip!
georgeck · 2026-02-10
Another interesting link relevant to AI summaries for HN discussion is the utility created by simonw [0]. Our tool is quite similar to what simonw did, except that we make the back-links more seamless. If you’re interested in a standalone tool similar to what simonw developed, you can find our script here [1]. If there’s community interest, we can improve the user experience of this tool.
[0] - https://til.simonwillison.net/llms/claude-hacker-news-themes
[1] - https://github.com/hncompanion/skills-scripts
simlevesque · 2025-11-10
Simon Willison seems to like his:https://til.simonwillison.net/llms/codex-spark-gpt-oss
llamavore · 2025-07-04
Check the post from Simon Willison: https://til.simonwillison.net/claude-code/playwright-mcp-claude-code
You install the playwright mcp server and then it just launches chrome.
Also check out https://browser-use.com/ https://github.com/browser-use/browser-use
and
https://github.com/D4Vinci/Scrapling
apitman · 2025-05-31
You might be able to get away with running QuickJS compiled to WebAssembly: https://til.simonwillison.net/npm/self-hosted-quickjs
nelblu · 2025-03-26
Also CSV can be queried : https://til.simonwillison.net/sqlite/one-line-csv-operations
vinipolicena · 2025-03-18
Post in which simonw explains the "snapshot testing" approach: https://til.simonwillison.net/pytest/syrupy
rpicard · 2025-02-16
I saw this on here from the prolific simonw: https://til.simonwillison.net/llms/claude-hacker-news-themes
gus_leonel · 2025-01-31
See also go-script: https://til.simonwillison.net/bash/go-script
avinassh · 2024-10-28
checkout Simon Willison's notes if you want to know how to get this running and try: https://til.simonwillison.net/sqlite/compile-sqlite3-rsync
m_sahaf · 2024-09-22
Yep, it was Simon: https://til.simonwillison.net/caddy/pause-retry-traffic
wonger_ · 2024-08-24
The author's bit about "IterateGPT" reminds me of this "AI in a loop" post from last year: https://til.simonwillison.net/llms/python-react-pattern
prompt = """ You run in a loop of Thought, Action, PAUSE, Observation. At the end of the loop you output an Answer Use Thought to describe your thoughts about the question you have been asked. Use Action to run one of the actions available to you - then return PAUSE. Observation will be the result of running those actions. ...""" Seems like a really powerful technique to have LLMs act on their own feedback.
croemer · 2024-04-02
These are the times (in UTC) at which JiaT75 interacted with the Github API. JiaT75 is the Github user behind the xz backdoor. These timestamps are more reliable than Git timestamps as they cannot be tampered with, they are recorded server side by Github.
Time count -----|----- 03:00 1 09:00 3 10:00 15 11:00 29 12:00 293 13:00 298 14:00 217 15:00 200 16:00 188 17:00 79 18:00 18 20:00 4 You can read more about Clickhouse and the Github activity dump here: https://til.simonwillison.net/clickhouse/github-explorer
mtmail · 2024-01-14
https://browser.geekbench.com/macs/macbook-pro-14-inch-nov-2023-11c-cp… with 18GB RAM. Simon (the blog author) seems to use 64GB M2 MacBook Pro https://til.simonwillison.net/llms/llama-7b-m2
nl · 2023-11-16
This isn't really true at a base level. You can do things like JS/Python interop now without this, eg: https://til.simonwillison.net/deno/pyodide-sandbox
dsherret · 2023-09-27
> Tying a language runtime to a specific KV interface which is tied to a specific hosted service is the opposite of forward thinking.
This is not the case. The Deno runtime itself is not tied to the Deno Deploy hosting service. The KV feature in the Deno runtime can be used without the hosting service.
You can read the details about how Deno KV works in the Deno runtime here: https://til.simonwillison.net/deno/deno-kv (as has been posted in other comments)