Welcome
ADOS is built in the open and we welcome contributions. Whether you are fixing a typo, reporting a bug, adding a feature, or translating the UI into your language, there is a way to help. This page covers the practical details: where to contribute, how to set up each repo, what the PR process looks like, and the code conventions we follow.Where to Contribute
ADOS has two main repositories. Both are on GitHub, both are GPLv3.ADOS Mission Control
Browser-based GCS. TypeScript, Next.js 16, React 19.
ADOS Drone Agent
Companion computer software. Python 3.11+, FastAPI, Textual.
ground-station profile).
Types of Contributions
Bug reports. Found something broken? Open a GitHub issue with steps to reproduce, expected behavior, actual behavior, and your environment (OS, browser, FC firmware, agent version). Screenshots or logs help a lot. Bug fixes. Small fixes (typos, off-by-one errors, missing null checks) can go straight to a PR. Bigger fixes should have an issue first so we can discuss the approach. Features. Open an issue first to discuss the feature. We want to make sure it fits the project’s direction before you write code. Small features can be a single PR. Larger features should be broken into smaller PRs. Documentation. This docs site, README files, code comments, JSDoc/docstrings. Docs PRs are always welcome and reviewed quickly. Translations. Mission Control supports 16 languages. Translation files are JSON in thelocales/ directory. Adding missing keys or improving existing translations is a great first contribution.
Tests. Test coverage is an area where we can always improve. Vitest for Mission Control, pytest for the Drone Agent.
Setting Up Mission Control
Prerequisites
- Node.js 18+ (LTS)
- npm 9+
- Git
Setup
Useful Commands
Project Structure
Key Architecture Concepts
Protocol adapters. Each firmware (ArduPilot, PX4, Betaflight) has its own adapter that implements theDroneProtocol TypeScript interface. The adapters handle the differences between MAVLink and MSP, between ArduPilot parameter names and PX4 parameter names, and between different capability sets. New firmware support means writing a new adapter.
Zustand stores. All state lives in Zustand stores. Components subscribe to store slices via selectors. Stores are independent. The telemetry store uses ring buffers (300 samples) for time-series data.
Pattern generators. Mission patterns (survey grid, spiral, corridor, etc.) are pure functions. They take configuration in and return waypoints out. No React, no side effects. You can add new patterns by writing a generator function and registering it in the pattern registry.
Setting Up the Drone Agent
Prerequisites
- Python 3.11+
- pip
- Git
- A Linux SBC (for full testing) or macOS/Linux desktop (for development)
Setup
Project Structure
Key Architecture Concepts
systemd services. In production, each agent service (mavlink, api, video, cloud, health, wfb) runs as a separate systemd unit. The supervisor service manages them. For development, you can run individual services directly. HAL board profiles. Each supported SBC has a YAML profile (src/ados/hal/boards/*.yaml) that describes its hardware: serial ports, camera paths, GPIO pins, capabilities. The agent reads the profile at boot and configures itself accordingly.
IPC via Unix sockets. Agent services communicate through Unix domain sockets at /run/ados/. The MAVLink service writes parsed telemetry to /run/ados/mavlink.sock. Other services read from it.
Pull Request Guidelines
Before Submitting
- Check existing issues. Someone may already be working on this.
- For features, open an issue first. Discuss the approach before writing code.
- Keep PRs focused. One feature or fix per PR. If your PR touches 50 files across 5 features, split it.
- Test your changes. Run the linter, type checker, and tests. If you add a feature, add tests.
Branch Naming
Commit Messages
Write clear, short commit messages. Describe what changed and why.The Review Process
- Push your branch and open a PR against
main - Fill in the PR template (summary, test plan, screenshots if UI changes)
- A maintainer will review within a few days
- Address review feedback
- Once approved, the PR is merged
Code Style
Mission Control (TypeScript):- TypeScript strict mode (
noEmittype check must pass) - Functional React components with hooks
- Zustand for state (not Redux, not Context for data)
- Tailwind CSS for styling
- No
anytypes without a comment explaining why
- Python 3.11+ features are fine (match statements,
|union types, etc.) - Type hints on all public functions
- structlog for logging
- Pydantic for config and API models
- Black for formatting (if configured)
Translation Guide
Mission Control supports 16 languages. Translation files live atsrc/locales/<lang>.json.
Current Languages
| Code | Language | Status |
|---|---|---|
en | English | Complete (reference) |
de | German | Partial |
es | Spanish | Partial |
fr | French | Partial |
gu | Gujarati | Partial |
hi | Hindi | Partial |
id | Indonesian | Partial |
ja | Japanese | Partial |
kn | Kannada | Partial |
ko | Korean | Partial |
mr | Marathi | Partial |
pa | Punjabi | Partial |
pt | Portuguese | Partial |
ta | Tamil | Partial |
te | Telugu | Partial |
zh | Chinese (Simplified) | Partial |
How to Contribute Translations
- Open
src/locales/en.json(the reference file) - Open the target language file (e.g.,
src/locales/hi.json) - Find keys that are missing or have English placeholder values
- Translate them
- Submit a PR
- Drone terminology often does not have direct translations. Use the term pilots in your language actually use. For example, “throttle” in Hindi might stay as “throttle” rather than a literal Hindi translation.
- Keep strings short. UI labels have limited space.
- Do not translate parameter names (like
MOT_SPIN_ARM). Those are ArduPilot identifiers.
Adding a New Language
- Copy
src/locales/en.jsontosrc/locales/<code>.json - Translate all keys
- Add the language to the locale registry in
src/lib/i18n.ts - Submit a PR
Reporting Security Issues
If you find a security vulnerability, do not open a public issue. Email team@altnautica.com with details. We will work with you on a fix and coordinated disclosure.Code of Conduct
Be respectful. Be constructive. Help each other learn. We do not tolerate harassment, discrimination, or personal attacks. If you see bad behavior, report it to team@altnautica.com.Need Help?
If you want to contribute but are not sure where to start:- Look for issues labeled
good first issueon GitHub - Ask in the
#contributingchannel on Discord - Read the Architecture section to understand the codebase
Next Steps
Architecture Overview
Understand the system architecture before making changes.
Community
Join the Discord and connect with other contributors.