The website and documentation for Komorebi, a small, fast, free and open-source email client for Windows 10 and 11. Served at https://komorebi.rusticstack.com, in English and European Portuguese.
Next.js 16 (App Router, static export) with Fumadocs headless (fumadocs-core, fumadocs-mdx, no fumadocs-ui, no Tailwind). The styles are plain CSS in app/site.css with the system fonts, in the Fluent 2 look of the app.
Node 22.18 or newer and pnpm.
pnpm install
pnpm devBuild and preview the static output:
pnpm build
pnpm preview # serves out/ on http://localhost:3000
pnpm check:links # every internal link, image and #fragment in out/
pnpm typecheckpnpm build first runs scripts/upstream.mjs. It asks the GitHub API for the latest Komorebi release and fetches CHANGELOG.md, PRIVACY.md and README.md at that release's tag into .generated/ (ignored by git):
- the download button and the JSON-LD
downloadUrlpoint at that release's installer; - the Changelog page renders
CHANGELOG.md, the Privacy page rendersPRIVACY.md; - the Keyboard shortcuts page is generated from the README's "Keyboard" table. Portuguese rows are translated in
lib/shortcuts.tsby their English text; a row that has no translation yet stays in English and the build prints a warning.
When GitHub cannot be reached, the build uses the snapshot committed in upstream/. Refresh it after a release with pnpm sync:upstream and commit the result. A new Komorebi release shows on the site after the next deploy.
- Docs:
content/docs/<page>.mdx(English) and<page>.pt.mdx(European Portuguese, never Brazilian). Order comes frommeta.jsonandmeta.pt.json. Every page must exist in both languages. - Home page copy:
lib/home-copy.ts. Interface strings:lib/i18n.ts. - MDX components:
<Shot name="compose-table" alt="..." lang="pt" />(a light and dark screenshot),<Callout title="..." variant="caution">,<Shortcuts />,<DownloadLink />.
English pages are at /..., Portuguese pages at /pt/.... Each language has its own root layout, so <html lang> is right in the HTML.
Screenshots and brand files in public/ come from the Komorebi launch assets, made with the app's offline snapshot tool on a throwaway cache with made-up messages. scripts/prepare-images.mjs copies them and writes the 640 px copies; it needs sharp (KOMOREBI_ASSET_TOOLS), which is not a dependency of the site.
scripts/render-og.mjs renders the Open Graph card of every page, in both languages, with resvg and the Geist font, into public/og/ at build time.
The Vercel project komorebi-website is linked to this repository. vercel.json sets the framework to none, pnpm install --frozen-lockfile, pnpm build and the output directory out. Pushes to main deploy to production; other branches get preview URLs. The domain komorebi.rusticstack.com points at Vercel with a DNS record in rusticstack.com.
GPL-3.0-or-later, as Komorebi itself. See LICENSE.