Nocturne
The tokens, type, and machinery this whole site is built from. Dark is the canonical design; light exists for daylight. Flip the theme and this page re-renders itself in it.
palette
Surfaces, ink, and accents. Hex values follow the theme you are currently reading in.
- --canvas#1a1b26#f2f2f6page
- --canvas-deep#16161e#e4e5ecfooter
- --panel#292e42#ffffffraised
- --hairline#3b4261#cfd2e0borders
- --prose#c0caf5#262a38body
- --prose-strong#ffffff#1a1b26headings
- --subtle#7c83a8#5263a4meta
- --iris#7aa2f7#1769dalinks
- --ember#e0af68#7b5f37hover
tags
Each tag draws a syntax colour, brand-faithful where that was free.design gets the comment colour on purpose — it isn’t a language, it’s a comment on languages. Every value clears 4.5:1 against the canvas in both themes.
- dotnet#bb9af7#8245f0.NET purple
- laravel#f7768e#da0d33Laravel coral
- rust#ff9e64#bd4700Rust orange
- angular#de5959#d12a2ared shield
- php#7aa2f7#1f62f2PHP blue-purple
- zig#e0af68#93641eZig yellow
- react#7dcfff#0072b5React cyan
- astro#9d7cd8#7f54ccAstro purple
- design#7c83a8#646b96not a language
type
Two families, two jobs, neither doing both. JetBrains Mono owns the chrome, the headings and the code — it is the one actually running in Ghostty. Geist keeps the prose, because 117,000 words of monospace is a tax on the reader.
Terminally driven, Laravel inspired
So I’ve taken the last month or so to completely rethink my workflow for Laravel development, and it turned out to be my entire editor.
~/blog · 2026-01-22 · 8 min · laravel
components
The post card, in both states the schema allows — hero image present, and the tag-tinted plate that stands in when it isn’t.

Artisanally Laravibing
Singularity or not, I'm just along for the ride.

Local Laravel with nix and devenv
We have Herd at home.
Code blocks read as buffers, labelled by language.
test('parses markdown docs', function () {
expect($rows)->toHaveCount(1);
});We have Herd at home. The Herd at home: a pile of nix expressions and a suspicious amount of confidence.
provenance
Nocturne started as a hand-built palette on the old Laravel site, picked by eye with no reference. It landed within a couple of hex digits of the tokyonight colorscheme that had been open in the editor the whole time. Left column is what got picked; right is what it was quietly copying.
- accent
#9aa7ff#7aa2f7blue - secondary
#e0b978#e0af68yellow - canvas
#0e1016#1a1b26bg - prose
#e8e6df#c0caf5fg
The config that made it true:
require("tokyonight").setup({
style = "night",
styles = { floats = "transparent", sidebars = "transparent" },
transparent = true,
})
vim.cmd([[let $BAT_THEME = 'tokyonight']])
colorscheme tokyonighthow it’s built
Astro, static output, no adapter, deployed to Cloudflare. Content is markdown in git and filenames are slugs. Every number here was measured from dist, not estimated.
- JavaScript bundles
- 0 — no framework, no external script files
- Inline script, heaviest page
- 2,600 bytes — search + tag filter, theme resolution, theme toggle
- CSS, whole site
- 27.9 KB — one system, Tailwind utilities
- Fonts
- 2 files, 59 KB — self-hosted, latin subset
- Images
- 93 — sharp-optimised to webp at build time
- Degrades without JS
- All posts visible, dark theme intact — both scripts are progressive enhancement
by the numbers
- Posts
- 33
- Words
- 117,047
- Span
- 7 years
- First
- Oct 2019
The tag breakdown, in the tag colours. Read top to bottom and it’s the arc: .NET, then the framework years, then Rust, then Laravel.