I’m excited to share that I’ve just given Sonar—a FastAPI-based BLE device counter I built years ago—a full overhaul and relaunched it as an open-source project on GitHub: https://github.com/viktopia/sonar
Why Sonar?
When I first created Sonar, the goal was simple: track Bluetooth Low Energy devices nearby to estimate foot traffic in a space without specialized hardware. Over time, the codebase drifted, dependencies aged, and the project paused. Now, with modern Python tooling and container best practices, Sonar is leaner, easier to deploy, and more powerful than ever.
What’s New
-
Modern service architecture Sonar has been fully migrated from its original Django codebase to a lean FastAPI service, with the old
manage.pyand Django apps removed and a newapp/main.pypowering all BLE scanning logic. -
Improved code quality We’ve adopted Ruff for linting and import sorting, and fortified the test suite with Pytest (including async tests and coverage checks). The new
requirements-test.txtlistspytest,pytest-asyncio,pytest-cov, andruff, ensuring consistent style and at least 80 percent coverage. -
Docker-first deployments Sonar now ships with a production
Dockerfilefor building a container image and a simplifieddocker-compose.ymlthat sets up the BLE scanner with persistent storage and hardware access. -
Simplified API A new set of REST endpoints in
app/api/endpoints.pyprovides comprehensive device monitoring capabilities. The/latestendpoint returns current scan results and historical statistics,/time-seriesoffers detailed 24-hour data with customizable intervals, and/healthprovides system status checks. All endpoints return well-structured JSON responses with robust error handling. -
Removed legacy code The old Django analytics application, static assets (like jQuery bundles), and deprecated Balena/Raspbian scripts have been stripped away, leaving a focused, modern codebase.
Getting Started
- Clone the repo
git clone https://github.com/viktopia/sonar.git
cd sonar
- Run with Docker Compose (recommended)
docker-compose up -d --build
- Verify it’s working
curl http://localhost:8000/health
# Expect: { "status": "healthy", "message": "System requirements met" }
While Sonar is primarily designed for Raspberry Pi, it should be compatible with most other boards and devices that have Bluez-compatible Bluetooth hardware. Feel free to dive into the API endpoints, inspect the source, and contribute—issues and pull requests are very welcome. Happy scanning!
Enjoyed this post? Check out my podcast!
If you found this interesting, you might enjoy "Nerding Out with Viktor" - my podcast where I dive deep into tech, entrepreneurship, and security with industry experts.