Contributing
Contributions are welcome — code, documentation, art, or a bug report that saves someone else the afternoon you just lost.
Before You Start
Section titled “Before You Start”Three documents cover the ground, and they live in the repository rather than here because they describe the source tree you will have checked out:
| Document | Covers |
|---|---|
| CONTRIBUTING.md | Style and formatting, the async flow-control convention, error handling and logging, and what a good PR looks like |
| DEV.md | Internal architecture — the art and theme pipeline, the menu module pattern, the view system, and how configuration reaches a module |
| Development Environment | Getting a working checkout, and the editor tasks that come with it |
Two conventions catch people out often enough to repeat here:
- Production code uses
async, not Promises.async/awaitis fine in tests, but not incore/ormods/. - Update
WHATSNEW.mdfor anything user-visible, andUPGRADE.mdfor anything breaking. Those are what a sysop reads on upgrade day.
Working on the Documentation
Section titled “Working on the Documentation”These docs are an Astro + Starlight
site under website/ in the same repository. Each page is a markdown file in
website/src/content/docs/, and there is an Edit page link at the bottom of
every page that takes you straight to it on GitHub.
To run the site locally:
cd websitenpm installnpm run dev # http://localhost:4321Before opening a documentation PR:
npm run verifyThat builds the site and then runs three checks, each of which fails the build rather than warning:
- Links — every internal link resolves to a page that was actually built.
- Navigation — every page that was built is reachable from the sidebar.
- API spec — the OpenAPI document still matches the routes the server registers.
A few conventions specific to this site:
- Link between docs with relative
.mdpaths (../art/mci.md). They work as written on GitHub, and a remark plugin rewrites them to routes for the site. An absolute path works in neither place. - Give every page a
titleand a one-linedescriptionin frontmatter, plus asidebar.order— sections are otherwise alphabetical. - Do not repeat the page title as the first heading; Starlight renders the
frontmatter title as the page’s H1 already. Body headings start at
##. - Use Starlight’s admonitions (
:::note,:::tip,:::caution) rather than raw HTML, and plain fenced code blocks rather than<details markdown="1">, which is a Jekyll idiom that does not render here.
Getting in Touch
Section titled “Getting in Touch”- Discussions and the issue tracker
- Discord
FSX_ENGon fsxNet