A privacy-focused traffic logging tool for neighborhood change-makers.
Measure vehicle speeds, make streets safer.
ββββ
ββββββββββ
ββββ
ββββββββββββββ ββββ
βββββββββββββββ ββββββ
βββββββ ββββ
ββββ βββ
ββββββββββββββββββββββββββββββ
ββββββββββββββ ββββ
βββββββ βββββββ
βββββββ ββββ βββ ββββ βββ ββββββββ
βββββββββββββββββ ββββ ββββ βββββββββββββββββ
ββββββββ β βββββββ ββββ ββββ ββββββ ββ ββββββ
ββββββ ββ ββββββββ βββ βββ βββββββββ ββ βββββ
βββββββ ββ ββββ βββββ βββ ββββββ ββββ ββββ ββββ ββ βββββββ
ββββ ββ ββ βββ βββββ βββ βββ ββββ ββββββ βββ β ββ βββββ
ββββ βββ βββββ ββββββββββββ ββββ ββββ ββ βββ β ββ βββββ
ββββ βββββββββββββββββββββββββββββ ββββ ββββββββ ββββ
ββββββββββββββββββββββββ ββββββββββββββ ββββ βββββββββββββββββββββ
ββββ ββββββ ββββββββββββββ ββββββββββ ββββββ ββββ
βββββ βββ ββ ββ ββββ ββββββββ ββββ ββ β βββ βββββ
βββββ ββ β ββ βββββ ββ ββββ β ββ βββ βββββ
ββββββ ββ ββ ββββ βββ βββββ ββ ββ ββββββ
ββββββ β βββββ ββββββ ββββββ ββ ββββββ
ββββββββ β ββββββββ βββββββ ββ ββββββββ
βββββββββββββββββ ββ βββββββββββββββββ
βββββββββββββββββββββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ
ββββββββββββββββββββββ ββββ ββββββββββ βββββββββββββββββββββ βββββββββ
βββ ββββββ ββββ ββββββββββββ βββββ ββββββ ββββββ βββββββββββ ββββ
βββ ββββ ββββ ββββ βββ ββββ βββββ βββββ βββββ
velocity.report is a complete citizen radar system for neighborhood traffic monitoring. The system consists of four main components:
- Go Server - High-performance data collection and API server
- Python PDF Generator - Professional PDF report generation with LaTeX
- Web Frontend - Real-time data visualisation (Svelte)
- macOS Visualiser - Native 3D visualisation for LiDAR tracking (M1+ Macs)
The system collects vehicle speed data from radar/LIDAR sensors, stores it in SQLite, and provides multiple ways to visualise and report on the dataβall while maintaining complete privacy (no license plate recognition, no video recording).
This project is designed with privacy as a core principle:
- β No license plate recognition
- β No video recording
- β No personally identifiable information
The goal is to empower communities to make data-driven decisions about street safety without compromising individual privacy.
git clone git@github.com:banshee-data/velocity.report.git
cd velocity.report
make build-radar-local
./velocity-report-local --disable-radarIf an existing SQLite database is available, place it in ./sensor_data.db (the default location for development). For production deployments, use the --db-path flag to specify a different location (see Deployment section).
See tools/pdf-generator/README.md for detailed instructions.
Quick version:
cd tools/pdf-generator
make install-python # One-time setup
make pdf-config # Create config template
make pdf-report CONFIG=config.jsonSee web/README.md for detailed instructions.
The macOS visualiser provides real-time 3D visualisation of LiDAR point clouds, object tracking, and debug overlays. Requires macOS 14+ and Apple Silicon (M1/M2/M3) or Intel Mac with Metal support.
See tools/visualiser-macos/README.md for detailed instructions.
Quick version:
# Build the visualiser
make build-mac
# Start synthetic data server for testing
go run ./cmd/tools/visualiser-server -rate 10 -points 5000
# Launch the visualiser
open tools/visualiser-macos/build/Build/Products/Release/VelocityVisualiser.app
# Or replay recorded data
go run ./cmd/tools/visualiser-server -mode replay -log /path/to/recording.vrlogM1 Features (Milestone 1):
- β Recorder/Replayer with deterministic playback
- β Pause/Play/Seek/Rate control via gRPC
- β Frame-by-frame navigation
- β Timeline scrubbing
- β 3D camera controls (orbit, pan, zoom)
- β Mouse/trackpad gesture support
velocity.report/
βββ cmd/ # Go CLI applications
β βββ radar/ # Radar/LiDAR sensor integration
β βββ deploy/ # Deployment management tool
β βββ sweep/ # Parameter sweep utilities
β βββ tools/ # Go utility tools
β β βββ visualiser-server/ # Synthetic data generator and replay server
β β βββ gen-vrlog/ # Generate sample .vrlog recordings
β β βββ pcap-analyse/ # PCAP packet analysis
β β βββ ... # Other utilities
β βββ transit-backfill/ # Transit data backfill tool
βββ internal/ # Go server internals (private packages)
β βββ api/ # HTTP API endpoints
β βββ db/ # SQLite database layer + migrations
β βββ radar/ # Radar sensor logic
β βββ lidar/ # LiDAR sensor logic + tracking
β β βββ visualiser/ # gRPC streaming for 3D visualisation
β β βββ recorder/ # Record/replay .vrlog files
β βββ monitoring/ # System monitoring
β βββ security/ # Path validation and security
β βββ serialmux/ # Serial port multiplexing
β βββ units/ # Unit conversion utilities
β βββ version/ # Version information
βββ web/ # Svelte web frontend
β βββ src/ # Frontend source code
β βββ static/ # Static assets
βββ tools/ # Python tooling and native apps
β βββ pdf-generator/ # PDF report generation (Python)
β β βββ pdf_generator/ # Python package
β β β βββ cli/ # CLI tools
β β β βββ core/ # Core modules
β β β βββ tests/ # Test suite
β β βββ output/ # Generated PDFs
β βββ visualiser-macos/ # macOS LiDAR visualiser (Swift/Metal)
β βββ VelocityVisualiser/ # SwiftUI app
β β βββ App/ # Application entry
β β βββ gRPC/ # gRPC client
β β βββ Rendering/ # Metal renderer
β β βββ UI/ # SwiftUI views
β βββ VelocityVisualiserTests/ # XCTest suite
βββ data/ # Sample data and alignment utilities
βββ docs/ # Internal project documentation
βββ public_html/ # Public documentation site (Eleventy)
βββ scripts/ # Development shell scripts
βββ static/ # Static server assets
βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββββ
β Sensors ββββββΊβ Go Server ββββββΊβ SQLite Database β
β (Radar / LIDAR) β β (API/Processing) β β (Time-series) β
βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββββ
β
β
βββββββββββββββββββ΄βββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
β Web Frontend β β Python PDF Generator β
β (Real-time via Svelte) β β (Offline Reports via LaTeX) β
βββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
1. Go Server (/cmd/, /internal/)
- Collects data from radar/LIDAR sensors
- Stores time-series data in SQLite
- Provides HTTP API for data access
- Handles background processing tasks
- Runs as systemd service on Raspberry Pi
2. Python PDF Generator (/tools/pdf-generator/)
- Generates professional PDF reports using LaTeX
- Creates charts and visualisations with matplotlib
- Processes statistical summaries
- Highly configurable via JSON
- Comprehensive test suite
3. Web Frontend (/web/)
- Real-time data visualisation
- Interactive charts and graphs
- Built with Svelte and TypeScript
- Responsive design
See ARCHITECTURE.md for detailed architecture documentation.
For Go Development:
- Go 1.25+ (installation guide)
- SQLite3
For Python PDF Generation:
- Python 3.11+
- LaTeX distribution (XeLaTeX)
- See tools/pdf-generator/README.md
For Web Frontend:
- Node.js 18+
- pnpm
- See web/README.md
Build the development server:
make build-radar-local
./velocity-report-local --disable-radarRun tests:
make testBuild for production (Raspberry Pi):
make build-radar-linux
# or manually:
GOOS=linux GOARCH=arm64 go build -o velocity-report-linux-arm64 ./cmd/radarThe repository uses a single shared Python virtual environment for all Python tools (PDF generator, data visualisation, analysis scripts).
Setup:
make install-python # Creates .venv and installs all dependenciesActivate manually (optional):
source .venv/bin/activateWhat's installed:
- PDF generation: PyLaTeX
- Data analysis: pandas, numpy
- Visualisation: matplotlib, seaborn
- Testing: pytest, pytest-cov
- Formatting: black, ruff
Run PDF Generator:
make pdf-test # Run test suite
make pdf-demo # Run interactive demo
make pdf-config # Create config template
make pdf-report CONFIG=config.json # Generate PDF reportOption 1: Format on demand (recommended for new contributors)
make format # Format all code before commit
make lint # Verify formatting (what CI checks)Option 2: Editor integration
- VS Code: Install Prettier, ESLint, Go extensions
- Format-on-save handles most cases
Option 3: Pre-commit hooks (recommended for regular contributors)
pip install pre-commit
pre-commit installHooks auto-format code on every commit β no manual make format needed.
What runs on commit (if hooks enabled):
- File hygiene (trailing whitespace, large files, etc.)
- Go formatting (gofmt)
- Python formatting (ruff + black) for PDF generator code
- Web formatting (prettier)
Note: CI lint jobs are advisory (non-blocking), so PRs can merge even without perfect formatting. A weekly automated workflow cleans up any missed formatting issues. See .github/workflows/lint-autofix.yml for details.
cd web
pnpm install
pnpm devSee web/README.md for details.
The Go server runs as a systemd service on Raspberry Pi. Use the new velocity-deploy tool for comprehensive deployment management.
Quick Start - Deploy to Raspberry Pi:
# Build the binary and deployment tool
make build-radar-linux
make build-deploy
# Deploy to remote Pi
./velocity-deploy install \
--target pi@192.168.1.100 \
--ssh-key ~/.ssh/id_rsa \
--binary ./velocity-report-linux-arm64Or use Make shortcuts for local deployment:
make build-radar-linux
make deploy-installThe deployment will:
- Install the binary to
/usr/local/bin/velocity-report - Create a dedicated service user and working directory
- Install and enable the systemd service
- Optionally migrate existing database
Upgrade to new version:
make build-radar-linux
./velocity-deploy upgrade --target pi@192.168.1.100 --binary ./velocity-report-linux-arm64Monitor service health:
# Comprehensive health check
./velocity-deploy health --target pi@192.168.1.100
# Check status
./velocity-deploy status --target pi@192.168.1.100
# View logs
sudo journalctl -u velocity-report.service -fSee also:
- public_html/src/guides/setup.md - Complete setup and deployment guide
- cmd/deploy/README.md - velocity-deploy CLI reference
Legacy deployment:
The previous scripts/setup-radar-host.sh script is still available but the new velocity-deploy tool is recommended for all deployments.
The PDF generator is deployed as a Python package via PYTHONPATH:
cd tools/pdf-generator
make install-python
# PDF generator is now ready at tools/pdf-generator/pdf_generator/No installation required - use PYTHONPATH method as documented in tools/pdf-generator/README.md.
- ARCHITECTURE.md - System architecture and component relationships
- docs/coverage/coverage.md - Code coverage setup and usage guide
- internal/db/migrations/README.md - Database migration guide and reference
- CHANGELOG.md - Version history and release notes
- web/README.md - Web frontend documentation
- tools/pdf-generator/README.md - PDF generator documentation
- docs/README.md - Internal project documentation
- public_html/README.md - Public documentation site
make testPerformance regression testing:
make test-perf NAME=kirk0 # Run performance test against baselineThis compares current performance against saved baselines. If no baseline exists, it creates one.
cd tools/pdf-generator
make pdf-test
# or with coverage:
make test-python-covThe project uses a consistent naming scheme for all make targets: <action>-<subsystem>[-<variant>]
| Action | Go | Python | Web | Docs | macOS |
|---|---|---|---|---|---|
| install | - | install-python |
install-web |
install-docs |
- |
| build | build-radar-* |
- | build-web |
build-docs |
build-mac |
| dev | dev-go |
- | dev-web |
dev-docs |
dev-mac |
| dev (variant) | dev-go-lidardev-go-kill-server |
- | - | - | - |
| run | - | - | - | - | run-mac |
| test | test-go |
test-python |
test-web |
- | test-mac |
| test (variant) | test-go-covtest-go-coverage-summary |
test-python-cov |
test-web-cov |
- | - |
| format | format-go |
format-python |
format-web |
format-markdown |
format-mac |
| lint | lint-go |
lint-python |
lint-web |
- | - |
| clean | - | clean-python |
- | - | clean-mac |
Cross-cutting formatting targets:
format-sql- Format SQL files (migrations and schema)
test- Run all tests (Go + Python + Web + macOS)format- Format all code (Go + Python + Web + macOS + SQL + Markdown)lint- Lint all code (Go + Python + Web), fails if formatting neededcoverage- Generate coverage reports for all components
build-radar-linux- Build for Linux ARM64 (no pcap)build-radar-linux-pcap- Build for Linux ARM64 with pcapbuild-radar-mac- Build for macOS ARM64 with pcapbuild-radar-mac-intel- Build for macOS AMD64 with pcapbuild-radar-local- Build for local development with pcapbuild-tools- Build sweep toolbuild-deploy- Build velocity-deploy deployment managerbuild-deploy-linux- Build velocity-deploy for Linux ARM64build-web- Build web frontend (SvelteKit)build-docs- Build documentation site (Eleventy)
test- Run all tests (Go + Python + Web + macOS)test-go- Run Go unit teststest-go-cov- Run Go tests with coveragetest-go-coverage-summary- Show coverage summary for cmd/ and internal/test-python- Run Python PDF generator teststest-python-cov- Run Python tests with coveragetest-web- Run web tests (Jest)test-web-cov- Run web tests with coveragetest-mac- Run macOS visualiser tests (XCTest)test-perf- Run performance regression tests (NAME=kirk0)coverage- Generate coverage reports for all components
build-mac- Build macOS LiDAR visualiser (Xcode)clean-mac- Clean macOS visualiser build artifactsrun-mac- Run macOS visualiser (requires build-mac)dev-mac- Kill, build, and run macOS visualisertest-mac- Run macOS visualiser tests (XCTest)format-mac- Format macOS Swift code (swift-format)
proto-gen- Generate protobuf stubs for all languagesproto-gen-go- Generate Go protobuf stubsproto-gen-swift- Generate Swift protobuf stubs (macOS visualiser)
setup-radar- Install server on this host (requires sudo, legacy)deploy-install- Install using velocity-deploy (local)deploy-upgrade- Upgrade using velocity-deploy (local)deploy-status- Check service status using velocity-deploydeploy-health- Run health check using velocity-deploydeploy-install-latex- Install LaTeX on remote target (for PDF generation)deploy-update-deps- Update source, LaTeX, and Python deps on remote target
format- Format all code (Go + Python + Web + macOS + SQL + Markdown)format-go- Format Go code (gofmt)format-python- Format Python code (black + ruff)format-web- Format web code (prettier)format-mac- Format macOS Swift code (swift-format)format-markdown- Format Markdown files (prettier)format-sql- Format SQL files (sql-formatter)
lint- Lint all code (Go + Python + Web), fails if formatting neededlint-go- Check Go formattinglint-python- Check Python formattinglint-web- Check web formatting
migrate-up- Apply all pending migrationsmigrate-down- Rollback one migrationmigrate-status- Show current migration statusmigrate-detect- Detect schema version (for legacy databases)migrate-version- Migrate to specific version (VERSION=N)migrate-force- Force version (recovery, VERSION=N)migrate-baseline- Set baseline version (VERSION=N)schema-sync- Regenerate schema.sql from latest migrations
pdf-report- Generate PDF from config filepdf-config- Create example configurationpdf-demo- Run configuration demopdf-test- Run PDF tests (alias for test-python)pdf- Convenience alias for pdf-report
set-version- Update version across codebase (VER=0.4.0 TARGETS='--all')log-go-tail- Tail most recent Go server loglog-go-cat- Cat most recent Go server loglog-go-tail-all- Tail most recent Go server log plus debug loggit-fs- Show the git files that differ from main
plot-noise-sweep- Generate noise sweep line plot (FILE=data.csv)plot-multisweep- Generate multi-parameter grid (FILE=data.csv)plot-noise-buckets- Generate per-noise bar charts (FILE=data.csv)stats-live- Capture live LiDAR snapshots (INTERVAL=10 DURATION=60)stats-pcap- Capture PCAP replay snapshots (PCAP=file.pcap INTERVAL=5)
Grid endpoints:
api-grid-status- Get grid statusapi-grid-reset- Reset background gridapi-grid-heatmap- Get grid heatmap
Snapshot endpoints:
api-snapshot- Get current snapshotapi-snapshots- List all snapshots
Acceptance endpoints:
api-acceptance- Get acceptance metricsapi-acceptance-reset- Reset acceptance counters
Parameter endpoints:
api-params- Get algorithm parametersapi-params-set- Set parameters (PARAMS='{}')
Persistence and export endpoints:
api-persist- Trigger snapshot persistenceapi-export-snapshot- Export specific snapshotapi-export-next-frame- Export next LiDAR frame
Status & data source endpoints:
api-status- Get server statusapi-start-pcap- Start PCAP replay (PCAP=file.pcap)api-stop-pcap- Stop PCAP replayapi-switch-data-source- Switch live/pcap (SOURCE=live|pcap)
Run make help or make to see all available targets with descriptions.
We welcome contributions! Please see CONTRIBUTING.md for:
- Development workflow (Go + Python + Web)
- Testing requirements
- Code style guidelines
- Pull request process
Apache License 2.0 - See LICENSE for details.
Join our Discord community to discuss the project, get help, and contribute to making streets safer.
