tools.simonwillison.net colophon

The tools on tools.simonwillison.net were mostly built using AI-assisted programming.

This page lists the commit messages for each tool, many of which link to the LLM transcript used to produce the code.

css-text-wrapping.html

bfc5f5e March 11, 2025 08:00

california-clock-change.html

e62d0d November 02, 2024 22:23
e7c655 November 03, 2024 08:30
5f7244 November 03, 2024 08:44
Clarify gain/loss one hour of sleep
2fcb00 March 10, 2025 21:14
Update California clock change to include text about if is currently daylight savings time or not

Prompt was:

> Update California clock change to include text about if is currently daylight savings time or not

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/simonw/tools?shareId=XXXX-XXXX-XXXX-XXXX).
fb99136 March 10, 2025 21:26
Fix DST bug

I prompted Claude 3.7 Sonnet thinking with this file and:

> Check the DST display logic

It suggested this fix.

social-media-cropper.html

b4a2bc December 10, 2024 20:35
a10954 February 28, 2025 16:02
a57b5c February 28, 2025 16:10
zoom in and out and background color

https://gist.github.com/simonw/a3e7f3ce34e26ab7c207fe641853e4a0

Pure vibe based coding, I hacked at it until it seemed to work, didn't even look at the code
43d55a March 09, 2025 09:22
Note it's for Substack
0b619c1 March 09, 2025 09:31

paste-rich-text.html

fd9daf March 07, 2025 14:58
63852f March 07, 2025 15:05
Maybe fix for Windows?
49c382e March 07, 2025 20:35
Paste rich text in README

encrypt.html

b4e3e15 March 07, 2025 20:34

json-schema-builder.html

0a186e5 March 07, 2025 18:17

schema-dsl.html

e3f4763 March 05, 2025 11:17
Create schema-dsl.html

https://claude.ai/share/c89fc8fd-b868-491f-bece-bd5b97acac1c but then I had to modify it a bunch to get it to work - the micropip install of llm didn't work because not all dependencies work in Pyodide.

pipfile.html

0a11eb2 March 03, 2025 16:30
Pipfile.lock Dependency Parser

Built this today to help fix an old development environment.

https://gist.github.com/simonw/e13064e2e830db77887373ced5df1b5b

llm-prices.html

148bc1 October 16, 2024 20:50
2e0a70 October 25, 2024 16:32
o1-preview and o1-mini
3e633a October 25, 2024 16:38
Clarify prompt/completion tokens, use sentence case
720f22 November 04, 2024 10:34
7dcb4c December 03, 2024 16:51
Prices for Amazon Nova models

https://aws.amazon.com/bedrock/pricing/
561dc2 December 05, 2024 06:12
cbba87 December 30, 2024 08:52
o1 and o1-preview same cost
c510cb January 21, 2025 08:44
deepseek-chat and deepseek-reasoner
639629 January 21, 2025 09:13
All per million tokens
576800 January 21, 2025 09:21
e94be7 January 21, 2025 09:51
Display dynamic prices correctly
0f3607 January 21, 2025 09:51
Update disclaimer
4f1863 January 31, 2025 12:52
o3-mini
c29b97 January 31, 2025 19:12
o1-mini price drop to match o3-mini
b2b5a8 February 16, 2025 12:23
chatgpt-4o-latest
08b464 February 25, 2025 12:11
gemini-2.0-flash-lite and updated Gemini pricing

https://ai.google.dev/gemini-api/docs/pricing

Also Claude 3.7 Sonnet
9cab8d6 February 27, 2025 12:54
GPT-4.5 is eye-poppingly expensive

https://openai.com/api/pricing/

word-counter.html

e831d3 December 19, 2024 12:11
98408b December 19, 2024 12:24
40aa7b December 19, 2024 17:31
Show textarea when page first loads

I didn't even use an LLM to write this!
cb33238 February 25, 2025 21:52

progress.html

1cba17 February 21, 2025 20:17
Create progress.html

Prompt to my custom Claude project for artifacts was:

> Build a progress bar through the current US presidency

It did the 2021 to 2025 one so I said:

> That's wrong it started in January 2025 and ends four years later
c90501a February 21, 2025 20:20
Update progress.html

Prompt:

> Make it larger on my phone

jina-reader.html

7acfb0 October 14, 2024 09:24
5a8732 October 14, 2024 10:51
206d99 October 14, 2024 18:01
box-sizing: border-box on iframe
727bbf October 14, 2024 18:14
7d7e2ce February 12, 2025 08:45
Optionally run Jina reader output through Claude with summary prompt

https://gist.github.com/simonw/f768916929eb5b7268354ddcb1021b94

apsw-query.html

0af3172 February 06, 2025 17:47

gemini-bbox.html

4be279 August 26, 2024 08:34
Rename gemini-bbox-tool.html to gemini-bbox.html
3aa392 August 26, 2024 08:39
Better h1
665528 August 26, 2024 10:41
b382ff August 27, 2024 14:34
Ability to try different models

https://gist.github.com/simonw/d77ab3ef497ed79f353633322cc6d38a

I tweaked it so the initial image preview would be hidden on prompt response, and changed the sort order of the select box options.
79898f October 03, 2024 15:08
Update Gemini model lists
15376f October 03, 2024 15:24
06a135 December 11, 2024 09:18
gemini-2.0-flash-exp
c8706b4 February 05, 2025 09:43
New Gemini models for bbox tool

https://simonwillison.net/2025/Feb/5/gemini-2/

Plus fixed cropped image display to have a max width 100

sql-pretty-printer.html

71a762d February 03, 2025 22:38

github-issue-to-markdown.html

d47fdbd February 03, 2025 14:43

image-resize-quality.html

5b41e7 July 25, 2024 15:01
Create image-resize-quality.html

Adapted from this Claude artifact https://claude.site/artifacts/45ecf75e-d8e2-4d2a-a3b9-d8c07c7bd757
fa5a39 August 01, 2024 10:46
Added paste support

curl 'https://tools.simonwillison.net/image-resize-quality' | llm -m claude-3.5-sonnet --system 'output just the new HTML for a version of this page that also allows users to paste images'
41c4d15 January 29, 2025 09:43
Add background color feature to image-resize-quality

https://gist.github.com/simonw/04e9fd78af5f739d97deb69a75c9aa2a

image-to-jpeg.html

a124524 January 27, 2025 10:49
image-to-jpeg.html

I built this one using GPT-4 back in April 2023

https://gist.github.com/simonw/66918b6cde1f87bf4fc883c67735195d

render-claude-citations.html

b9a55d January 23, 2025 16:11
d97ff4e January 23, 2025 20:05
Use Title Case

php-deserializer.html

4c11c72 January 22, 2025 15:26

aria-live-regions.html

f34d1d January 07, 2025 19:34
30ad8d4 January 07, 2025 19:50
Switch between polite and assertive

bluesky-resolve.html

e71a60 January 06, 2025 09:57
1472c5d January 06, 2025 10:49
Use public.api.bsky.app instead

Much higher rate limits: https://bsky.app/profile/futur.blue/post/3lf3q6hlqgk2o

bluesky-firehose.html

d79ba5 November 19, 2024 19:45
7c6af8e January 06, 2025 10:05
Ability to send messages back to Bluesky firehose

https://gist.github.com/simonw/9c4525e0364d60c1a8a7bd663ff0df35

yaml-explorer.html

ee48769 December 22, 2024 14:44

openai-webrtc.html

3b2429 December 17, 2024 14:06
Rename openai-webrtc to openai-webrtc.html
8bb09d December 17, 2024 14:12
55c754 December 17, 2024 14:28
c9f3085 December 18, 2024 07:36

gpt-4o-audio-player.html

e92642 October 27, 2024 20:32
0f89a8f December 17, 2024 18:15
Update gpt-4o-audio-player.html

Handle long truncated gists

Claude prompt was:

> This breaks if the JSON is too long and is truncated by the gist API

openai-audio-output.html

4b61d0 October 27, 2024 20:55
8c026b October 27, 2024 21:20
b9fa5d October 27, 2024 21:25
box-sizing: border-box;
fb5160 November 28, 2024 09:18
e717ab December 17, 2024 13:48
d6c784 December 17, 2024 13:54
Updated list of voices

https://platform.openai.com/docs/api-reference/chat/create#chat-create-audio says:

> The voice the model uses to respond. Supported voices are ash, ballad, coral, sage, and verse (also supported but not recommended are alloy, echo, and shimmer; these voices are less expressive).
668115e December 17, 2024 18:04

json-to-yaml.html

5426b54 December 15, 2024 12:47

nav-for-headings.html

43100d December 15, 2024 11:21
2dbdc12 December 15, 2024 11:25
Update nav-for-headings.html

I prompted in the existing conversation:

> Make sure to populate existingIds with the IDs on the page to start

writing-style.html

93175b December 13, 2024 11:34
fb04bd December 14, 2024 09:58
ac6a1f December 14, 2024 10:06
0fbf511 December 14, 2024 11:10

gemini-chat.html

2f2bfd August 27, 2024 14:57
4983cf August 27, 2024 16:24
79898f October 03, 2024 15:08
Update Gemini model lists
06a135d December 11, 2024 09:18
gemini-2.0-flash-exp

timezones.html

1459a6 July 04, 2024 13:18
Experimental timezones.html

Not fully tested yet, built this with Claude 3.5 Sonnet
a142037 December 10, 2024 18:43
Timezone Meeting Planner

A better version, brand new.

https://gist.github.com/simonw/3cb034fa3d327f1114da18219f2192fd

prompts-js.html

afbc22 December 06, 2024 16:52
Rename prompt-js.html to prompts-js.html
3d76b53 December 07, 2024 14:14
Load latest prompts.js from CDN

unix-timestamp.html

9c10367 November 20, 2024 19:36

bluesky-timeline.html

7eff228 November 20, 2024 17:36

zip-wheel-explorer.html

429eb8 November 19, 2024 11:08
zip-wheel-explorer

Created first version using a Claude 3.5 Haiku prompt similar to this:

> web app with an input box to paste in a URL to a zip or .tar.gz or wheel file - it then uses fetch() to fetch that binary file and uses the necessary JavaScript libraries to unzip it and then shows a list of the files in that package, clicking each of those shows the content of that file

But had to edit a lot - to use jsdelivr for example, and to remove the .tar.gz support which didn't work.
6025f62 November 19, 2024 11:19
Simplified

iframe-api-explorer.html

2b8f87 November 14, 2024 19:22
52c094 November 14, 2024 19:30
Note this is a sandbox experiment
3011fee November 14, 2024 19:39
sandbox=allow-forms for Chrome, new APIClient class

In Chrome the form wouldn't submit because no allow-forms so I added that

Got Claude to write a neat APIClient class using promises so I can do const response = await api.callAPI(url);

https://gist.github.com/simonw/54d91de17fdde1bce715f6a7859c935e

bbox-cropper.html

d117432 November 12, 2024 08:04

mdn-timelines.html

59323c November 10, 2024 17:54
mdn-timelines

I didn't save all the prompts for this one (I'm using a new tool).
472b46 November 10, 2024 18:21
58e7ef November 10, 2024 18:59
Use GitHub tree API to get more than first 1000 files

Also some CSS tweaks and autocomplete search now does term1.*term2
ab7baa November 10, 2024 19:02
Remove console.log
c81ecb November 11, 2024 04:19
link to blog post
41ce0b8 November 11, 2024 04:25
fix for back button bug

I prompted Claude:

> `There's a bug where hitting back cannot get to the previous page`

iframe-sandbox.html

e62bd12 November 07, 2024 07:18

animated-rainbow-border.html

99021c5 November 03, 2024 12:30

claude-token-counter.html

033c0a7 November 02, 2024 11:25

link-temp.html

457c6de October 27, 2024 16:15
Create link-temp.html

svg-sandbox.html

705838 October 26, 2024 13:34
a7289c8 October 26, 2024 13:49
Display decoded SVGs on page

Some help from https://gist.github.com/simonw/e07899a173ffe9f5723994e1405f909a

svg-progressive-render.html

ba6a1be October 25, 2024 17:51

github-issue.html

c7e297c October 23, 2024 13:26

qr.html

ff3869 October 17, 2024 14:50
47b5cd October 17, 2024 14:55
Add jsQR credit
345bdc9 October 21, 2024 11:29
box-sizing: border-box;

clipboard-viewer.html

55d804 October 20, 2024 21:16
0b18227 October 20, 2024 21:20
box-sizing: border-box;

text-wrap-balance-nav.html

a36eaf October 20, 2024 05:39
1a8556 October 20, 2024 05:42
No need for margin-bottom on inline element
2c59da7 October 20, 2024 16:20
max-width: 100% for phones with screens narrower than 400px

https://urbanists.social/@georgelund/113342149599402190

ares.html

9da6f96 October 20, 2024 07:47

escape-entities.html

4ac8c4f October 19, 2024 15:43

openai-audio.html

cdf77e October 17, 2024 12:09
3e8687 October 17, 2024 12:38
6edb36 October 17, 2024 12:41
font-size: 16px; on input
0d07f5 October 17, 2024 12:44
box-sizing: border-box;
bf3b3a October 18, 2024 10:05
white-space: pre-wrap;
1c63c27 October 18, 2024 10:08

extract-urls.html

0f7fb49 October 15, 2024 16:19

sqlite-wasm.html

9521114 October 15, 2024 11:44

click-grid-to-expand.html

1faccef October 13, 2024 11:42

event-planner.html

1d19215 October 10, 2024 19:17

image-to-svg.html

4ff37f2 October 06, 2024 20:37

svg-render.html

2c1095 October 06, 2024 09:56
b20a4c October 06, 2024 10:00
Background color default to white
c10d66 October 06, 2024 10:12
tweak CSS
c0608a October 06, 2024 12:03
Reset color to white, not black
d911c2 October 06, 2024 12:32
Various fixes to SVG tool

Tweaked CSS
Selecting transparent now toggles to PNG
Copy to clipboard button no longer uses alert()
bc43f4c October 06, 2024 12:33
Tool is now called SVG to JPEG/PNG

openfreemap-demo.html

7ee20d September 28, 2024 10:58
4507280 September 28, 2024 14:01
map.setPitch(50)

user-agent.html

d053b94 September 26, 2024 19:23

markdown-math.html

112b42 September 20, 2024 19:30
ceff93 September 20, 2024 21:50
Better HTML export + no alert on copy button
fe5c3a September 20, 2024 22:51
Avoid zoom on textareas on iOS
b04b092 September 20, 2024 22:54
textarea width

github-api-write.html

4b7902d September 20, 2024 17:08

jina-embeddings-image-token-calculator.html

8ad34e5 September 19, 2024 22:54
Create jina-embeddings-image-token-calculator.html

https://gist.github.com/simonw/7f3d2ff63423078f04d1fb2fc2b3e2a5

youtube-thumbnails.html

11dddd September 19, 2024 20:53
994cfc September 19, 2024 20:58
Improved click area and layout of copy URL thing

And I didn't even get an LLM to write this for me!
8d67d6c September 19, 2024 21:03

pomodoro.html

d22c1e August 28, 2024 14:30
1e1e75 August 28, 2024 14:49
Fix bug where timer did not run in background

https://gist.github.com/simonw/cd3e400f5d09e8ed6482c7c6e8af2db2
9c0765 August 28, 2024 16:53
a678b5 August 30, 2024 07:22
CSS tweaks
ddaf7da August 30, 2024 08:08

gemini-bbox-tool.html

33199b August 25, 2024 21:17
469aeb August 25, 2024 21:27
lineWidth = 5
71c413 August 26, 2024 08:33
Re-compress image first and display grid lines

There was a VERY weird bug where the TIFF orientation of a photo could cause the wrong coordinates to be returned.

Working around that bug by first doing a round-trip through custom canvas JPEG compression.

Also added grid to make it easier to debug.

Many prompt sessions got here, most recently this one: https://gist.github.com/simonw/0a8b8e76cd73b1bfb72daa716641a57e
4be279 August 26, 2024 08:34
Rename gemini-bbox-tool.html to gemini-bbox.html
85126d August 26, 2024 08:35
Redirect to gemini-bbox
ce18cd2 August 26, 2024 08:37
Fix redirect

tiff-orientation.html

9b6cdd5 August 26, 2024 08:20
tiff-orientation

Debug tool for figuring out if a JPEG has TIFF orientation data in it.

Claude prompts: https://gist.github.com/simonw/9bf1bd4cce6d113c55db0e5a03769b52

audio-spectrum.html

1390c40 August 23, 2024 22:04
audio-spectrum visualizer

By Claude 3.5 Sonnet: https://gist.github.com/simonw/48b2762d1c77e529d3c36e75ee6f478b

haiku.html

e4975a April 15, 2024 16:26
haiku.html
e7512f April 15, 2024 16:45
ow switch button if more than one camera
03ce79 April 15, 2024 16:51
More tweaks to switch camera button
9d5f90 April 15, 2024 16:51
Switch camera button inline, not block
0249ab8 August 22, 2024 19:10
Use anthropic-dangerous-direct-browser-access: true

Now talks to the Anthropic API directly using their new anthropic-dangerous-direct-browser-access: true header.

Also shows a "Generating..." message.

Code change mostly by Claude: https://gist.github.com/simonw/6ff7bc0d47575a53463abc3482608f74

exif.html

687d450 July 17, 2024 09:28
EXIF data viewer

Created with Claude 3.5 Somnet

box-shadow.html

18f741 July 08, 2024 12:22
Box shadow CSS generator

Mostly by Claude 3.5 Sonnet: https://twitter.com/simonw/status/1810335524017877240
44e0b09 July 08, 2024 13:05
Link to how I built it

chrome-prompt-playground.html

be05fc July 03, 2024 10:09
Chrome Prompt Playground

Claude 3.5 Sonnet built most of this - transcript here: https://gist.github.com/simonw/e62440114960bc98f200eb3d92593896
e16f128 July 03, 2024 12:37
About this project link

compare-pdfs.html

b3fcfe7 July 02, 2024 12:53

arena-animated.html

9a2450d June 26, 2024 05:39
Add /arena-animated

ocr.html

5dffa7 March 30, 2024 09:34
Change URL to /ocr - since it does more than PDfs now, refs #1
5ca65c March 30, 2024 09:37
margin-bottom on dropzone, refs #1
cc6091 March 30, 2024 09:49
Upgrade to latest PDF.js, refs #1
9fb049 March 30, 2024 11:10
Source code. How I built this.
711cb7 March 31, 2024 15:21
Remove some indentation
8872d1 March 31, 2024 15:32
Language support for OCR, closes #4
495be5 March 31, 2024 16:19
Set and get ?language= in URL bar, refs #4
0efe8a March 31, 2024 16:20
Remove console.log, refs #4
eae14a March 31, 2024 17:11
Query string history now works for English default too, refs #4
c4c833 March 31, 2024 20:00
Support pasted images, refs #7
17f46e March 31, 2024 20:19
Re-run OCR if language is changed, refs #6
4c6c9e March 31, 2024 20:28
Add rough progress indicator to rerunOCR, refs #6
c4cd84 March 31, 2024 21:16
Don't re-run OCR if no file provided, closes #6
c1233df May 20, 2024 08:55

csv-marker-map.html

82fd5da May 02, 2024 20:14
Create csv-marker-map.html

render-markdown.html

782395 April 21, 2024 22:47
86ac9d April 21, 2024 22:49
Fix link to TIL
a278a1b April 21, 2024 22:59
Clean up markdown heading elements

pdf-ocr.html

497178 March 29, 2024 14:01
Create pdf-ocr.html

Refs #1
fb7041 March 29, 2024 14:02
Tiny bit of text at the top

Refs #1
bb6c87 March 29, 2024 15:02
Update full document after each page

Refs #1
16a97a March 29, 2024 15:19
Plausible analytics
f3410f March 30, 2024 09:26
A ton of UI tweaks

- Shows full document textarea at top, but only if there are multiple pages
- Prevents user from selecting a new file while a file is being processed
- Better indications of progress, including a done x of y message
4caf66 March 30, 2024 09:29
Bump width from 800 to 1000

This is the width used for the images extracted from the
PDF. I found that the Claude 3 Model Card PDF had OCR
errors at 800px what went away at 1000px.

Refs #1
d89c22 March 30, 2024 09:33
Upgrade to latest Tesseract.js, refs #1
5dffa7e March 30, 2024 09:34
Change URL to /ocr - since it does more than PDfs now, refs #1