warning:this site is a work in progress, so some things are broken

Colophon

~ $ cat colophon.md

# how this site is made, features and curiosities

~ $ cat stats.txt
commits246merged prs45from my phone42first commitjuly 31, 2024content8 articles · 2 reviews · 22 workoutsbucket list16 of 51 done
~ $ cat stack.txt
frameworknext.js 16 · react 19languagetypescriptstylestailwind css 4runtimebunhostingvercelcodeshiki + twoslashfontsjetbrains mono, ibm plex mono, geistthemeslight, dark, dracula, gruvbox
~ $ git log --reverse --oneline
  • 2023-09-24first commit of the old site, alvseven.com. a day later, a commit called "production ready"
  • 2024-07-31first commit of this repo. alves.sh is a placeholder and the articles live on alvseven.com
  • 2024-08-22first article published: type narrowing vs type widening, on alvseven.com
  • 2026-07-30the blog moves here, and every old alvseven.com link redirects to the same page on alves.sh
  • 2026-09-24three designs on a canvas. the terminal starts as a toggle and ends as the only look
  • 2026-09-25the reviews page
  • 2026-09-28first workout in the gym log
  • 2026-11-04this page
~ $ ls designs/
The minimal design: a light page with sections for today, now, writing and off the clock.
a · minimal
The terminal mode: a dark page where each section is a shell command and its output.
a′ · terminal mode, the one that won
The bento design: rounded cards for the intro, Spotify, chess, despensa, writing and links.
b · bento grid, discarded
~ $ cat how-it-works.md

## the name

alves plus a domain, and .sh is the extension of a shell script. I like terminals, so a terminal-like site behind a .sh domain was the obvious match.

## the design

Before any code, there were three directions on a canvas: a minimal site, a bento grid, and the minimal site with a terminal mode you could switch on with >_. The bento grid lost first. Then the toggle took over: the terminal fit the domain and my style better, so it became the whole site.

## favorites

The parts I'm proudest of are the gym log, the Spotify widget and the chess board.

## the shell

Every command is a plain function from what you typed to a result, so they're tested without a browser. There's tab completion, history (arrow up) and a few pipes: head, tail, grep and wc.

## the home page

Every block on the home page is a command and its output: whoami, now.txt, neofetch, the latest articles, the bucket list, Spotify, chess and the gym. Type one of them on any page and you're taken home with it already running.

## shortcuts

1, 2 and 3 open home, writing and reviews, t changes the theme, l the language, and / jumps to the shell. They're off while you're typing, so they never get in the way.

## the window bar

On a computer, the bar at the top works like a terminal window: hi@alves.sh followed by where you are, like ~/writing.

## the gym log

There's no database. An iPhone Shortcut sends the workout to an API on this site, which commits it to a JSON file in the repo, and Vercel redeploys. I can also undo a log or log a past day, and the reply says how many days I trained that week. the full story →

## spotify

The widget asks what's playing every 15 seconds. When nothing is, it shows the last song, which is cached for 5 minutes and the profile for 6 hours, because asking for everything on every poll got the site rate-limited.

## chess

I mostly play on chess.com. Ratings and the last game come from chess.com and lichess, cached for 10 minutes so neither API sees per-visitor traffic. The daily puzzle is lichess's, and your moves are checked against the solution, not against the rules, so there's no chess engine here.

## two languages

English lives at /, Portuguese at /pt, and articles have Portuguese URLs too. Press l to switch. Shell commands stay in English, but their output is translated.

## curl alves.sh

Command-line clients get the home page as plain text, with colors.

## preview images

The cards you see when a link is shared are rendered by a script and committed, not generated on each request.

## fonts

A script trims them down to only the characters the site uses, to keep them small.

## reviews

Every photo goes through one script that crops it to 4:3 and 1200×900, so a phone picture and a screenshot look the same on the page. The price is in reais, plus dollars at the exchange rate of the day the review was written. The rating bar has one # per point. Each review has its own page and preview card, and the category filter lives in the address, so a filtered list can be shared.

## articles

Each one has a table of contents that follows you as you read, the reading time, and a share button. On phones it opens the share sheet, so Instagram works too.

## articles in vim

On a computer, articles have a vim status line at the bottom, and vim's keys scroll them: j and k, d and u, gg to the top, G to the bottom. I'm not a vim nerd, but I like to LARP a little, in honor of a friend :p

## page transitions

Moving between pages uses React's view transitions, so the content swaps smoothly instead of blinking.

## neofetch and uptime

neofetch shows the machine this site is written on, and uptime counts my age and how long I've been coding.

## themes

Dracula because it's famous and I've used it before, Gruvbox because it's cool and reminds me of a friend. Whichever you pick is applied before the first paint, so switching pages never flashes the wrong colors. Dark is the default, whatever your system says.

## the chess board

It's text, not an image: one unicode glyph per piece, drawn from the game's FEN, seen from the side I played.

## no javascript

The collapsible bits (the warning at the top, the gym log, the easter egg in whoami) are plain HTML, so they work with JavaScript off.

## rss

Every article is in feed.xml, in both languages, for anyone who still reads with a feed reader.

~ $ cat todo.txt

# what's next

  • -a man page (man alves)
  • -a quote of the day page, for my random thoughts
  • -a page where visitors can draw and leave their mark on the site forever
~ $ cat fun-facts.txt
  • -Most commits happen at 7 PM.
  • -53 of the 246 commits were made between midnight and 6 AM.
  • -The busiest day had 44 commits: november 4, 2026.
  • -Wednesday is the busiest day of the week.
  • -Take the last letter of alves and add the domain: s.sh. Read it again: ssh.
  • -This repo went quiet for 695 days, from September 2024 to July 2026. The articles kept coming on the old site.
  • -The old site's history has commits like "e tome e tome e dalhe" (Brazilian slang, roughly "take that, and that, and let's go") and "design system, layout, we going huge".
  • -The first article I started, a type challenge of level extreme, in July 2024, still isn't published.
  • -iOS draws ♟ as a color emoji unless you ask for the text version with an invisible character, U+FE0E. The chess board asks.
  • -The gym graph is drawn like GitHub's contribution graph, month labels included.
  • -The 404 page has a working shell too, so you can `cd` your way out.
  • -The favicon is the "a" from the neofetch logo, and it looks like an Among Us crewmate. The bigger icons show the whole word.
  • -`help` doesn't list every command.
  • -This page was made in 13 commits and about two hours, counting the commit that wrote this line.
~$