Live wind tracking platform for water sports, powered by custom IoT meteostations.
Aiolos is a modern, scalable platform for collecting, storing, and serving real-time wind and weather data from custom-built IoT stations. The system is designed for reliability, extensibility, and developer-friendliness.
- Live wind & weather data for water sports and research
- Custom hardware: Aiolos meteostation
- Remote administration: Station config management via Bruno API client
- Modern backend: AdonisJS REST API
- OpenAPI/Swagger docs: Auto-generated for the API
- Monorepo: Managed with pnpm and Turborepo
- Production infra as code: See infra/README.md for AWS/Terraform/Docker Compose setup
/
├── apps/
│ ├── adonis-api/ # RESTful backend API (AdonisJS v6)
│ ├── bruno-api/ # API client for managing station configuration
│ └── react-frontend/ # User interface for live data (React, Vite)
├── firmware/ # ESP32/SIM7000G code for weather stations
├── hardware/ # 3D models and hardware specs
├── package.json
├── pnpm-workspace.yaml
├── turbo.json
└── README.md (this file)
- Each app has its own README with setup, usage, and API details.
Adonis API Service (docs)
- Stores and exposes sensor data (wind, temperature)
- RESTful, IoT-friendly routes:
/station/:station_id/readings
- Direct HTTP endpoint for weather stations to submit data
- Auto-generated OpenAPI docs with adonis-autoswagger
Bruno API Client (docs)
- API client collection for managing station configuration and viewing diagnostics
- Git-friendly alternative to Postman/Insomnia that stores collections as files
- Used for remote configuration and diagnostics of weather stations
- Includes environments for development and production
- Provides easy access to station configuration without requiring the frontend
React Frontend (docs)
- User interface built with React, Vite, and TypeScript.
- Displays live wind speed (with unit conversion) and direction using dynamic gauges and a compass.
- Connects to the Adonis API via Server-Sent Events (SSE) for real-time data.
- Provides controls for interacting with mock data streams from the backend.
Firmware (docs)
- Embedded code for the Aiolos meteostation hardware
- Written for Arduino-compatible microcontrollers (ESP32 + SIM7000G)
- Handles sensor readings, power management, and HTTP communication
- Includes configuration and usage guides for hardware setup
From the repo root:
pnpm install
See each app's README for how to run, configure, and test the services.
- Add new sensors or data types by extending the API routes/models
- Use JSDoc comments for OpenAPI docs
- See code comments and each app's README for details
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See the LICENSE file for details.
This project uses GitHub Copilot extensively as an AI-first development approach. We've configured a comprehensive setup to maximize Copilot's effectiveness on complex IoT and web development tasks.
- Custom Instructions:
.github/copilot-instructions.md
provides project-specific guidance including architecture patterns, development workflows, and integration points - Environment Setup:
.github/workflows/copilot-setup-steps.yml
pre-installs all dependencies (Node.js, Python, PlatformIO, databases) so Copilot can build, test, and validate changes in its development environment - Multi-Component Architecture: Copilot understands the relationships between firmware (ESP32), backend (AdonisJS), and frontend (React) components
When assigning tasks to Copilot, follow these guidelines based on GitHub's best practices:
✅ Good Tasks for Copilot:
- Bug fixes and user interface improvements
- Test coverage expansion and documentation updates
- API endpoint additions and database schema changes
- Frontend component development using our shadcn/ui + Tailwind stack
- Firmware sensor integration and power management optimizations
❌ Tasks to Handle Yourself:
- Complex cross-repository refactoring requiring deep domain knowledge
- Production-critical issues and security-sensitive changes
- Ambiguous tasks lacking clear requirements
- Major architectural decisions affecting multiple components
📝 Writing Effective Issues:
- Provide clear problem descriptions and complete acceptance criteria
- Specify which files/components need changes
- Include context about the IoT hardware constraints and API compatibility requirements
- Reference relevant documentation sections when applicable
Use pull request comments to iterate with Copilot - it will read comments from users with write access and make required changes automatically. Batch multiple comments using "Start a review" for more efficient collaboration.