How to wiki
The Garuda Linux wiki is a static Astro site built with Starlight and themed with Catppuccin Mocha / Latte. Every article is a single Markdown file, so contributing only needs a text editor and a GitLab account.
Quick start
Section titled “Quick start”-
Clone the repository
Terminal window git clone https://gitlab.com/garuda-linux/website/wiki.gitcd wiki -
Install dependencies
The wiki needs Node.js 26 or newer and pnpm 11 or newer, set in
devEnginesinpackage.json.nix developprovides both. With direnv, rundirenv allowonce and the shell loads oncd.Terminal window pnpm install -
Start the dev server
Terminal window pnpm devOpen
http://localhost:4321/en/. The server reloads on every saved change. -
Verify your work before opening a merge request
Terminal window pnpm build
pnpm build runs astro check (TypeScript and content validation) and then a production
build, including the internal link checker. A merge request with a failing build will not
be merged.
Command reference
Section titled “Command reference”| Command | What it does |
|---|---|
pnpm dev | Development server with hot reload at /en/. |
pnpm build | astro check + production build + link validation. Run before a MR. |
pnpm check | Type and content check only, without building. |
pnpm preview | Serve the built dist/ locally, closest to production. |
pnpm fmt | Format the whole repository with Prettier. |
nix develop | Shell with Node.js and pnpm that installs the pre-commit hooks. |
nix flake check | Runs the Nix formatting and spell check, the same as the CI flake check. |
nix fmt | Format and lint the Nix files with nixfmt, deadnix and statix. |
The pre-commit hooks run on every commit:
- treefmt formats and lints the Nix files, the same as
nix fmt. - typos checks the spelling. Words that are correct
but unknown to it, such as product names, go into
_typos.toml. - Prettier formats the staged files, the same as
pnpm fmt. When it changes a file, the commit stops. Stage the formatted file and commit again. astro checkchecks types and the content schema, the same aspnpm check.- Vale checks the writing style with the rules in
.vale/styles/Garuda/: no semicolons in prose, and no sentences that name forum threads or their authors as the source. Link the source at the end of the page instead. - The content check (
pnpm check:content) fails on missing images and on alastUpdateddate in the future. It also lists unused images and pages that were not updated for 12 months. - The shell check (
pnpm check:shell) runs shellcheck on everyshandbashcode block. Label config files astextorini, notsh. A block with placeholders that are not valid shell can opt out withsh nocheckafter the opening fence.
Prettier and astro check use the versions in package.json, so they need pnpm install
first and skip themselves without node_modules. The CI build job runs both, plus the
full pnpm build. The other checks need no npm packages and also run in
nix flake check. The three migration guides are listed in .prettierignore and are
skipped by Vale, so their wording and formatting never change.
Two checks need the network and run in a scheduled CI pipeline, for example once a week:
pnpm check:packageslooks up every package from apacman -S,paru -Soryay -Scommand in the Arch, Garuda and Chaotic-AUR repositories and the AUR.- lychee checks the external links with
lychee.toml, one request at a time.
Project layout
Section titled “Project layout”Directorysrc/
Directoryassets/ static images imported by articles
- …
Directorycomponents/ Astro overrides of Starlight components
- …
Directorycontent/
Directorydocs/en/ the English articles, one folder per topic, one
.mdxfile per page- …
- content.config.ts collection and frontmatter schema
- plugins/remark-locale-links.mjs rewrites
/en/links on translated pages Directorypublic/ files served from the site root (
_redirects, the favicons and downloadable config files)- …
- astro.config.ts site, theme, sidebar and locale configuration
Anatomy of a page
Section titled “Anatomy of a page”Each article starts with YAML frontmatter. title and sources are required, everything
else is optional. Copy this template for a new page.
---title: Example articledescription: Shown in search results and link previews.tags: - examplelastUpdated: 2026-10-18sources: - pkgbuilds/garuda-update - https://wiki.archlinux.org/title/Pacmansidebar: order: 1---## First section
Body copy in Markdown.sources lists where the facts on the page come from, so the page can be checked again
later. Each entry is a Garuda GitLab repository name, optionally followed by a path inside it
(for example pkgbuilds/garuda-update, iso-profiles/garuda/dr460nized or toolbox),
or a full URL such as an Arch Wiki page or a forum topic. Use wiki for pages that only
link to other wiki pages. The build fails when a page has no sources.
Callouts
Section titled “Callouts”Use Starlight asides for notes, tips and warnings. An optional [Title] replaces the
default label.
:::noteSomething worth knowing.:::
:::tip[Optional title]A shortcut or a better way of doing things.:::
:::cautionSomething that may break and how to recover.:::
:::dangerIrreversible or destructive actions. Use sparingly.:::Code blocks
Section titled “Code blocks”Always set a language so the highlighter and copy button behave. sh, bash, ini,
yaml, json, conf and text are the common ones here.
```shgaruda-update```text is the right choice for plain console output and file listings that are not
shell commands.
Components
Section titled “Components”Starlight ships components that replace plain link lists and long instructions.
import { Card, CardGrid, LinkCard, Steps, Tabs, TabItem,} from "@astrojs/starlight/components";
<CardGrid> <LinkCard title="Garuda Update" href="/en/maintenance/garuda-update/" /> <LinkCard title="Snapshots" href="/en/maintenance/restoring-snapshots/" /></CardGrid>Adding a page
Section titled “Adding a page”- Create the file in the topic folder under
src/content/docs/en/where it belongs. File names are lowercase kebab-case (this-is-a-page.mdx). The path becomes the URL, soen/gaming/steam.mdxis served at/en/gaming/steam/. - Add frontmatter with at least a
titleandsources. Use the template above. - Set
sidebar.orderin the frontmatter to place the page within its group. The sidebar is generated from the folders, soastro.config.tsonly needs a change for a new top-level folder. - Run
pnpm buildand fix anything the checker reports. - Commit with a conventional commit message,
for example
docs(gaming): add the Steam pageorfix(boot): correct the bootloader ID. Runcz commitinsidenix developto write one with Commitizen. The commit hook rejects other messages, and the CI checks the commit title again. - Push to your fork and open a merge request. Check that its pipeline passes.
Images
Section titled “Images”Put images in a folder under src/assets/ that mirrors the page path, for example
src/assets/hardware/touchpad-gestures/ for en/hardware/touchpad-gestures.mdx. Section index
pages use an index folder, for example src/assets/gaming/index/. Images that more than one
page uses go in src/assets/shared/. Reference them with the ~/assets/ alias, which works from
every page and every language. Prefer WebP or PNG screenshots, and keep file sizes small.
Links and redirects
Section titled “Links and redirects”- Internal links are written as absolute site paths, for example
/en/maintenance/garuda-update/. plugins/remark-locale-links.mjsrewrites the/en/prefix on translated pages, so write the English path once and it adapts per locale.- Moved or renamed a page? Add a
301rule topublic/_redirectsso old URLs keep working. pnpm buildfails on broken internal links. Fix them rather than removing the validator.
Translations
Section titled “Translations”Translations run through Transifex, the same way as the other Garuda projects:
transifex.ymlin the repository root tells the Transifex GitLab integration that the English pages insrc/content/docs/en/and the UI strings insrc/content/i18n/en.jsonare the source.- Transifex pushes finished translations to a
translations_*branch. Pages go tosrc/content/docs/<lang>/, UI strings tosrc/content/i18n/<lang>.json. - The
transifex-automergejob fromgitlab-ci-commons, included in.gitlab-ci.yml, merges that branch into the default branch. astro.config.tsturns every folder next toen/into a locale, labelled with the language’s own name. Pages that are not translated yet fall back to English, andplugins/remark-locale-links.mjskeeps links inside the reader’s language.- In CI, Lunaria compares the git dates of every translation with
its English page.
/localizationshows which pages are translated, missing or outdated, and an outdated page links to the current English page in its translation notice. Lunaria fails on uncommitted changes, so local builds skip both.
Never edit translated files by hand. Fix the English page or the translation in Transifex instead.
Troubleshooting
Section titled “Troubleshooting”Astro cannot write its telemetry or the pnpm store inside a container
Point both at a writable directory:
export ASTRO_TELEMETRY_DISABLED=1export XDG_RUNTIME_DIR="$TMPDIR/run"The site root shows a 404 in the dev server
Expected. The root redirect to /en/ only exists on Cloudflare Pages, so use /en/
locally.