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 three 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 visualization (Svelte)
The system collects vehicle speed data from radar/LIDAR sensors, stores it in SQLite, and provides multiple ways to visualize and report on the dataβall while maintaining complete privacy (no license plate recognition, no video recording).
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.
velocity.report/
βββ cmd/ # Go CLI applications
β βββ radar/ # Radar sensor integration
β βββ bg-sweep/ # Background sweep utilities
β βββ tools/ # Go utility tools
βββ internal/ # Go server internals (private packages)
β βββ api/ # HTTP API endpoints
β βββ db/ # SQLite database layer
β βββ radar/ # Radar sensor logic
β βββ lidar/ # LIDAR sensor logic
β βββ monitoring/ # System monitoring
β βββ units/ # Unit conversion utilities
βββ web/ # Svelte web frontend
β βββ src/ # Frontend source code
β βββ static/ # Static assets
βββ tools/ # Python tooling
β βββ pdf-generator/ # PDF report generation
β βββ pdf_generator/ # Python package
β β βββ cli/ # CLI tools
β β βββ core/ # Core modules
β β βββ tests/ # Test suite
β βββ output/ # Generated PDFs
βββ data/ # Data directory
β βββ migrations/ # Database migrations
β βββ align/ # Data alignment utilities
βββ docs/ # Documentation Site
βββ 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 visualizations with matplotlib
- Processes statistical summaries
- Highly configurable via JSON
- Comprehensive test suite
3. Web Frontend (/web/)
- Real-time data visualization
- Interactive charts and graphs
- Built with Svelte and TypeScript
- Responsive design
See ARCHITECTURE.md for detailed architecture documentation.
For Go Development:
- Go 1.21+ (installation guide)
- SQLite3
For Python PDF Generation:
- Python 3.9+
- 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 visualization, analysis scripts).
Setup:
make install-python # Creates .venv and installs all dependenciesActivate manually (optional):
source .venv/bin/activateWhat's installed:
- PDF generation: PyLaTeX, reportlab
- Data analysis: pandas, numpy, scipy
- Visualization: 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:
- docs/deployment-guide.md - Complete 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
- 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 - Documentation site
make testcd 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 |
|---|---|---|---|---|
| install | - | install-python |
install-web |
install-docs |
| dev | dev-go |
- | dev-web |
dev-docs |
| dev (variant) | dev-go-lidardev-go-kill-server |
- | - | - |
| test | test-go |
test-python |
test-web |
- |
| test (variant) | - | test-python-cov |
- | - |
| format | format-go |
format-python |
format-web |
- |
| lint | lint-go |
lint-python |
lint-web |
- |
| clean | - | clean-python |
- | - |
test- Run all tests (Go + Python + Web)format- Format all code (Go + Python + Web)lint- Lint all code (Go + Python + Web), fails if formatting needed
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-web- Build web frontend (SvelteKit)build-docs- Build documentation site (Eleventy)
setup-radar- Install server on this host (requires sudo)
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
log-go-tail- Tail most recent Go server loglog-go-cat- Cat most recent Go server log
plot-noise-sweep- Generate noise sweep line plotplot-multisweep- Generate multi-parameter grid plotplot-noise-buckets- Generate per-noise bar chartsstats-live- Capture live LiDAR grid snapshotsstats-pcap- Capture snapshots during PCAP replay
Grid operations: api-grid-status, api-grid-reset, api-grid-heatmap
Snapshots: api-snapshot, api-snapshots
Acceptance metrics: api-acceptance, api-acceptance-reset
Parameters: api-params, api-params-set
Export: api-persist, api-export-snapshot, api-export-next-frame
Status & PCAP: api-status, api-start-pcap, api-stop-pcap, api-switch-data-source
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.
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.
