The site for Nimbus, a Velocity-style proxy for Vintage Story. Landing page, a long-form overview, and the documentation.
Built with Astro 5 and Tailwind CSS 4. Static output, no runtime, no external requests: no CDN, no remote fonts, no analytics. Everything the browser loads comes from this repository.
npm install
npm run dev # http://localhost:4321/nimbus/
npm run build # static output in dist/
npm run check # type checkThe base path is a two-line switch at the top of astro.config.mjs:
const SITE = 'https://stratumvs.dev'; // or 'https://nimbus.stratumvs.dev'
const BASE = '/nimbus'; // or '/'Every internal link goes through url() in src/lib/links.ts, so flipping those two
constants is the whole job. Hosting is not settled yet: a subpath on stratumvs.dev means
deploying into a subdirectory of that docroot, and a subdomain means GitHub Pages can host
it directly.
Documentation lives in src/content/docs/ as Markdown. Frontmatter drives the sidebar:
---
title: Transfers
description: How a player moves between backends.
group: Operations
groupOrder: 3
order: 1
---Two things worth knowing before editing:
Features that are not released yet get marked. The site documents v0.2.0, the release
people can download, and anything newer carries a "Coming soon" badge. Write <span data-unreleased /> at the start of the paragraph and a rehype plugin turns it into the badge.
Keep it out of headings: Astro builds anchor ids from heading text, so a badge there ends up
in the URL and in the contents panel. The version and the label live in src/lib/unreleased.mjs.
The code is the source of truth, not the wiki. Porting the wiki here turned up nine places
where it described commands and signatures that do not exist, including nimctl ban, which the
CLI had never implemented. Check anything load-bearing against
the repository before writing it down.
Astro caches rendered content, so if a change to the Markdown pipeline seems to do nothing,
delete .astro/ and build again.
The mark in public/nimbus-mark.svg is inlined rather than used as an image, so its two
fill-less paths inherit currentColor and follow the theme. The same paths are scaled into
the hero illustration as the proxy node, which is why the drawing and the logo are the same
object. The palette comes out of that file: #F2F2F4 for lit faces, #B0B6C5 for shaded
ones, #242A33 for the wordmark slate.
Docs rails fold from the handles on their inner edges, and each side remembers its own state.
They are sized with flex-basis rather than width, and the folded rail carries no overflow
clipping: an ancestor that clips becomes the scroll container for position: sticky and the
handle drops by its own offset the moment the rail folds.