curl olragon.com: walk the garden from your terminal
🌱 seedlingplanted #terminal#curl#tui#web#minimalism
Written for People who live half the day in a terminal, and anyone who has winced at curl | bash.
I've loved the curl wttr.in trick for years. One line and a whole weather forecast shows up right in your terminal: no browser, no ads, no cookie banner. So when I built this garden, I kept wanting my pages to read the same way.
Honestly, I did it more for fun than because anyone needed it. Every number below was measured on the live site while I wrote this.
Tiếng Việt: curl olragon.com: dạo vườn ngay trong terminal.
The box below isn't a screenshot. Each time you open this page it sends that very curl request to the server and paints back every ANSI code it gets: bold headings, dim text, clickable links, code blocks, and pictures drawn in block characters. Click a tab at the top to switch pages.
Open a terminal and type: curl olragon.com/garden/adbdav-en
What to type
curl olragon.com # home
curl olragon.com/garden # the notes
curl olragon.com/garden/adbdav-en # one note
curl -fsSL olragon.com/sh | bash # full-screen
The last line opens a proper TUI: a menu bar pinned at the top, scrolling with keys or the mouse wheel, click a note to open it, press l to switch language. On Windows: iwr -useb olragon.com/sh | iex.
For plain text add ?nocolor, to drop pictures ?noimg, and ?w=60 wraps at column 60. If you're in a browser and curious, add ?term to any address to preview its text version.
One address, two answers
There's no subdomain or separate page for the terminal. On every request the server reads the User-Agent: curl, wget, httpie or PowerShell get text/plain with colour codes, everyone else gets HTML as usual. So any link you copy from the browser pastes straight into a terminal.
| Page | curl gets | A browser gets |
|---|---|---|
| Home | 25 KB | 8.7 KB |
| The adbdav note | 51 KB, or 13 KB with ?noimg | 18 KB |
The terminal version is heavier than the HTML, and nearly all of that is pictures. Every character cell in a picture carries two 24-bit colour codes, one for the stroke and one for the background. Without pictures the terminal version is lighter than the HTML, and each request takes about 40 milliseconds from my machine.
The second renderer drifted within a day
The first version had two renderers: one for HTML, one for the terminal. Before the day was out, the two were telling different stories. Fix a sentence on the web and forget it in the terminal; add a page and it only existed in one of them.
So I dropped the second renderer and had the terminal read the very HTML the browser gets. It takes the <main> part and turns each tag into text: bold headings, paragraphs wrapped to width, tables, quotes, code blocks. Links become real clickable links (OSC 8, which most modern terminals understand). The whole converter is about 260 lines of TypeScript with no dependencies, because this site's HTML is my own tidy output and doesn't need a real parser.
Since then, writing a note gives you its terminal version for free. The tag filters added in late October came along the same way: the chips are plain links, so curl can filter too without a single extra line.
Drawing pictures in characters
The garden's illustrations are SVG, and a terminal only understands characters. The server renders SVG to PNG with resvg, then chafa turns the PNG into block characters: each terminal cell is split into six parts and painted with two colours, so lines come out far finer than the usual half-block look. Both tools are tiny, only run when someone asks, and keep the result in memory for next time.
Under every picture is the full address of the original, not one character trimmed. Click it and the real image opens. I leave it long on purpose, because an address you can't read in full is one you can't type on another machine.
Can you trust curl | bash
You're right to be wary. curl … | bash means running someone else's code on your machine, and I don't want anyone trusting it blindly. So I did three things:
The script can be read first. curl olragon.com/sh | less shows exactly the file bash would run, about 270 lines of ordinary bash that only use curl, stty and printf.
The script can be checked. curl olragon.com/sh | shasum -a 256 must match curl olragon.com/sh.sha256. While I wrote this, both gave 13f85856…57dc5d.
A partial download runs nothing. The whole script sits inside one run() function, and only the very last line calls it. If the connection drops halfway, bash gets an unclosed function and no command runs.
The script only fetches pages from olragon.com and draws them. It writes no files and sends nothing anywhere.
The times the terminal played tricks on me
With curl | bash, the keyboard isn't on stdin. Stdin is the pipe, so a script reading keys from stdin ends up reading the rest of itself. It has to open /dev/tty directly. In CI, with no /dev/tty, the script prints one page and exits.
The Enter key vanished. By default the terminal turns CR into NL, and read treats NL as end of line, so Enter reached the script as an empty string. Turn icrnl off and Enter is Enter again.
The menu bar got pushed away. On a narrow terminal a long line wraps by itself, the screen scrolls up one row, and the menu bar on the first line flies off. Now the script turns auto-wrap off, and the server wraps lines to your terminal's exact width.
Windows PowerShell 5.1 printed a literal e[32m. The ` e ` escape only exists from PowerShell 7 on. Switching to [char]27` works in every version.
Writing this turned up three bugs
Measuring for this note, I ran straight into three bugs that had been sitting there quietly. All three are fixed now.
The info line under each title was glued together. In curl, every note showed buddingupdated 2026-10-18#macos, and each tag dragged a full path behind it. The glued words were there from the start; the path after each tag came with the tag filters. Nobody reported it, probably because nobody reads that closely.
A new chafa changed its mind. On version 1.18.3 it quietly drew pictures with ASCII letters instead of block characters. Now the server names the symbol set it wants instead of letting it guess.
?nocolor still left colour in pictures. The text went plain, the pictures kept every colour code. Now pictures in this mode are drawn in plain monochrome symbols, with no colour codes at all.
An old lesson that feels new every time: writing about the thing you built is the most thorough test there is.
What it can't do yet
- Pictures need a terminal with 24-bit colour. An old terminal shows a smudge.
- The PowerShell version is keyboard-only, no mouse yet. I've only tried it on PowerShell 7 on a Mac, never on a real Windows PowerShell 5.1.
- No search box yet. With a handful of notes it isn't needed; as the garden grows it will be.
What I still don't know is whether anyone actually walks the garden this way. The garden deliberately has no tracking, no measuring, no analytics, so I can't count. If you just typed curl olragon.com and read this far, do tell me.
Write papa dragon a letter
If this note stirred something, write to me here. A letter reaches only me and never shows up on the page by itself. If one is lovely and you allow it, I may quote it under the note, without your name.
Works from a terminal too: curl -d 'msg=…' olragon.com/garden/curl-garden-en/letter