https://dondibogusky.com/notes/curl-view-of-this-site/Back to notes

A curl View of This Site

Inspired by nytpu’s curl site, I added a terminal view to this Astro site with generated text, a small Netlify switch, and the same content.

Reading nytpu’s Fancy Curl Sites made me want to try something pleasantly unnecessary: let people read this site with curl.

curl https://dondibogusky.com/

The response is readable text, with a little color for headings, full URLs, and the same writing you get in a browser. No terminal application to install. Just a different response to the same page URL.

$ curl -fsS https://dondibogusky.com/

# Dondi Bogusky

Hello, world! I'm a designer and developer leading web platforms and shipping
production code, from SugarCRM and ThreatMetrix to VAST Data, where I took the
site's average search position from 35.7 to 9.1.

Now

Working on fast content sites, durable design systems, and sharper publishing
workflows.

What I'm focused on right now.

Read the full Now page [https://dondibogusky.com/now/]

Web | Information | Print

## Portfolio

Browse the portfolio [https://dondibogusky.com/portfolio/]

### ThreatMetrix website
[https://dondibogusky.com/_astro/web-tmx-2018-03-28.DB5E_sQx_Z1MJFhJ.webp]

Web | Corporate website

### Customer Journey Wheel graphic
[https://dondibogusky.com/_astro/graphic-customer-journey-wheel.BK63PUa-_Z1UCiSL.webp]

Information | Journey diagram

### Boeing Distinguished Lecture poster
[https://dondibogusky.com/_astro/print-boeing-poster.MnVFlT-K_Rlb9Q.webp]

Print | Poster
The opening of the homepage, captured from the local Netlify preview. This is actual curl output, shown as selectable text.

A Good Fit Before I Wrote the Converter

The useful detail in nytpu’s post was the groundwork. Their Gemroff publishing system already supported ANSI text output, so adding curl versions of the blog could build on a capability they already had.

This site had a different head start. Astro builds static HTML. The notes live in MDX. Most of the experience is headings, paragraphs, dates, lists, and links. Vue handles a few bounded interactions; the writing is already there before any client JavaScript runs.

That makes the reading side of this site close to a perfect fit. I could derive another view from the finished HTML without maintaining a second set of articles or changing the original MDX.

The portfolio is the qualification. A terminal can carry the title, context, and description of a poster, but the typography and composition are still in the image. Those entries include direct links to the full-size files. Interactive demos likewise point readers back to the browser.

Build the Text, Then Choose the Response

The implementation has two parts:

  1. At build time, a script runs after Astro. It uses html-to-text to convert each eligible page’s main content, keeping the reading order and removing browser controls, hidden UI, and modal markup. Small formatters handle code blocks, compact topic labels, and portfolio entries. The build writes plain text and an ANSI version with cyan headings.
  2. At request time, a small Netlify Edge Function recognizes curl’s user agent on GET and HEAD requests and selects the matching static text file. Browser requests keep the HTML response. Each representation has its own file, keeping the text and HTML variants separate for caching.
The content conversion happens during the build. The edge function selects a representation.

Topic-filtered note views are also generated ahead of time. Search is the exception: an edge handler queries a text index produced from the same public pages and returns titles, excerpts, and links. It does not need a database or a browser session.

Make It Useful Beyond the First Command

You can filter notes or search from the shell:

curl --get --data-urlencode 'tag=CSS' https://dondibogusky.com/notes/
curl --get --data-urlencode 'q=astro' https://dondibogusky.com/search/
$ curl -fsS --get --data-urlencode 'tag=CSS' https://dondibogusky.com/notes/

Archive

# Notes: CSS

Short essays and durable notes on content systems, frontend craft, static
publishing, and the habits that keep projects moving.

## Making Contrast a Build Constraint

How this site turns APCA contrast targets into build-time checks for semantic
color roles across light and dark themes.

[https://dondibogusky.com/notes/making-contrast-a-build-constraint/]
August 7, 2026 ~4 min read
Topics: Accessibility, Design, CSS

## How This Site Uses Design Tokens

How this site's layered design tokens keep color, typography, motion, focus,
and expressive pages consistent without replacing Tailwind utilities.

[https://dondibogusky.com/notes/design-system-tokens/]
July 11, 2026 ~3 min read
Topics: Design, CSS, Frontend
Filtering the local preview’s note archive by CSS. The response keeps the same descriptions as the browser view.

The escape hatches matter too. Following nytpu’s example, X-Original: true returns the original HTML. X-Color: false removes ANSI styling for files, pipes, or a quieter terminal:

curl -H 'X-Original: true' https://dondibogusky.com/
curl -fsS -H 'X-Color: false' https://dondibogusky.com/notes/ -o notes.txt

The server cannot see a local NO_COLOR setting or tell whether curl’s output is piped, so that choice is explicit. A short footer points to terminal help instead of repeating every command on every page.

Another Way to Check the Site

Trying the HTML in Lynx uncovered a related problem: CSS gaps had been doing work that the markup should have supported. Tags ran together, and separate mobile and desktop menus both appeared. Semantic lists made those groups readable without the styles. Theme buttons now appear only when the JavaScript that makes them work initializes.

The curl view started as a neat trick. Building it was also a useful check on whether this site’s content could stand on its own. A static publishing site had already done most of the hard work; giving it another way to be read felt like a natural next step.