Thank you for your interest in contributing to Linje.track β a modular, real-time geospatial intelligence engine!
This project is licensed under the Elastic License 2.0. By submitting a contribution, you agree that your code will be made available under those same terms.
- Getting Started
- Development Setup
- Project Structure
- How to Contribute
- Plugin Contributions
- Code Standards
- Commit & Branch Conventions
- Pull Request Process
- Running Tests
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/<your-username>/worldwideview.git cd worldwideview
- Install dependencies:
npm install
- Generate environment file (auto-creates
.env.localwithAUTH_SECRET):npm run setup
- Start the dev server:
npm run dev
Visit http://localhost:3000 to confirm everything is running.
| Requirement | Version |
|---|---|
| Node.js | 18+ |
| npm | 9+ |
See docs/SETUP.md for detailed environment setup, including Cesium Ion token configuration.
src/
core/ # Core engine: state, data bus, plugin registry
plugins/ # Data source plugins (ADS-B, AIS, satellites, etc.)
components/ # React UI components
hooks/ # Custom React hooks
docs/ # Architecture and user guides
See docs/ARCHITECTURE.md for a deep dive into the rendering pipeline and plugin lifecycle.
Ways you can help:
- π Bug fixes β Check the issue tracker
- π§© New plugins β Add a new data source layer (see below)
- π Documentation β Improve guides or add examples
- β‘ Performance β Cesium primitive optimizations, GPU stall reduction
- π§ͺ Tests β Expand Vitest coverage
For large features, open an issue first to discuss the design before writing code.
The core extension point of Linje.track is its plugin system. Each plugin is a self-contained data layer that:
- Fetches or subscribes to a data source
- Transforms raw data into Cesium-ready primitives
- Registers itself with the
PluginRegistry
See docs/PLUGIN_GUIDE.md for a full walkthrough. New plugins are very welcome β if you have access to a live geospatial data feed, a plugin is the best way to contribute.
This project follows these principles:
- Single Responsibility Principle β each file/module does one thing
- DRY & SOLID β avoid duplication, favour composition
- Clean Architecture β UI, logic, and data are separate concerns
- Defensive Programming β validate inputs, handle edge cases explicitly
- File size β keep files under 150 lines; split into modules if needed
Use TypeScript strictly. Avoid any unless absolutely unavoidable.
Branch naming:
feat/short-description
fix/short-description
docs/short-description
refactor/short-description
Commit messages follow Conventional Commits:
feat: add maritime AIS plugin
fix: resolve camera snap on globe reset
docs: update plugin guide with lifecycle diagram
refactor: extract billboard factory from CesiumMap
- Ensure your branch is up to date with
main. - Run tests and confirm they pass:
npm test - Fill out the PR template completely.
- Request a review β PRs need at least one approval before merging.
- Squash commits on merge if the history is noisy.
npm test # Run all tests via Vitest
npm run test:ui # Open Vitest UI (interactive)Tests live alongside source files in __tests__/ directories or as .test.ts files.