Contributing
Reporting issues
Section titled “Reporting issues”- Bug? Use the bug report template — run
meridian doctorfirst - Connection issue? Use the connection issue template — run
meridian testandmeridian checkfirst - Feature idea? Use the feature request template
- Security vulnerability? See Security — do NOT open a public issue
Development setup
Section titled “Development setup”git clone https://github.com/getmeridian/meridian.git && cd meridian
# Install CLI in editable mode with dev dependenciesmake install
# Install the pre-push hook (fast checks before every push)make hooks
# Run full CI locallymake ci
# Individual checks:make test # pytestmake lint # ruff checkmake format-check # ruff format --checkmake typecheck # mypymake templates # Jinja2 template validationProject structure
Section titled “Project structure”The CLI is a Python package (src/meridian/) distributed via PyPI as meridian-vpn.
Key modules:
cli.py— Typer app, subcommand registrationcommands/— one module per subcommandcluster.py+cluster_persistence.py— typedcluster.ymlstate and persistenceservers.py—ServerRegistryfor known serverssetup/—meridian setupwizard state and the shared runtime behind deploy, setup, and applycompiler/— turns the topology into a reviewed, hash-identified list of resources (no I/O)reconciler/— observes and applies those resources with checkpointsprovision/— server preparation steps (packages, hardening, Docker, Realm)
Pull requests
Section titled “Pull requests”- Fork the repo and create a branch from
main - Make focused, minimal changes
- Ensure CI passes:
make ci - Test on a real server if possible
- Open a PR with a clear description
Key conventions
Section titled “Key conventions”- Shell values use
shlex.quote()— never interpolate unsanitized values - PWA assets must stay in sync (
templates/pwa/and the application catalog) - nginx config is written per resource as
meridian-v4-*.conffiles under/etc/nginx/stream.d/and/etc/nginx/sites-available/ - Provisioner steps return
StepResult(ok/changed/skipped/failed)
Testing
Section titled “Testing”CI validates: Python tests, ruff lint, mypy types, template rendering, and shell script syntax. Full deployment testing requires a real VPS.
