This blog used to be Hexo with the default theme. The default theme is fine, but it assumes one thing: a blog is a reverse-chronological list of posts, and that list is the whole structure.

I wanted the homepage to say something on its own — that going up happens in stages. So the site is organised by altitude above the ground:

Chapter Altitude Subject
Launch pad 0 km Me, and this site
Troposphere 12 km Tech stack
Kármán line 100 km Projects
Low Earth orbit 400 km The log itself
Geostationary 35,786 km Everyday life
Deep space 384,400 km Contact, and further out

Why the axis is logarithmic

Four of the six chapters sit below 400 km, and the last one jumps to 384,000 km. Drawn linearly, the first four nodes would collapse into a single point.

So the altitude axis uses a log10 scale:

export const altitudeOffset = (altitudeKm: number) =>
  (Math.log10(altitudeKm + 10) - minOffset) / (maxOffset - minOffset);

The +10 keeps 0 km inside the logarithm. Every chapter keeps a position you can actually see and click.

Technical choices

  • Astro: content becomes HTML at build time; the homepage ships no framework runtime.
  • Plain CSS and inline SVG: all six scenes — pad, clouds, Kármán line, Earth’s limb, geostationary ring, Moon — are drawn in code, with zero image downloads.
  • Dual themes: one set of semantic variables. Dark is space; light is mission control.

Each chapter is meant to be a place that can keep growing content, not decoration.