- Add Dockerfile with multi-stage build (node -> caddy)
- Add docker-compose.yml for caddy-docker-proxy
- Update astro.config.mjs with production site URL
- Add Documentation link to README.md header
- Add Documentation URL to pyproject.toml
Multiple bugs preventing stable HFP connections with real hardware
(ESP32 Bluedroid HFU):
- Add AF_BLUETOOTH/BTPROTO_RFCOMM fallback constants for Python builds
compiled without bluetooth.h
- Fix NewConnection fd handling: validate, os.dup, transfer to socket
via socket.fromfd with proper protocol param, close intermediate fd
- Remove premature +BCS codec selection from AT+BAC handler — sending
+BCS during SLC setup confuses Bluedroid's state machine
- Add post-SLC command handlers: AT+BIA (indicator activation),
AT+CCWA (call waiting), AT+CLIP (caller line ID) — without these
the HF drops the RFCOMM connection after ~22 seconds
- Route AT+VTS= to DTMF handler (standard HFP command, alongside
the non-standard AT+DTMF=)
- Fix simulate_call_end to handle OUTGOING/ALERTING call states
- Respect AT+BIA flags in _update_indicator
- Only send +CLIP during RING when HF has enabled it
- Clean up debug logging: remove file-based logger, use log.debug
- Add ruff per-file-ignores for dbus-fast D-Bus type annotations
Validated: 85/86 E2E tests PASS with ESP32 HFP Hands-Free Unit
Comprehensive BlueZ MCP server exposing Linux Bluetooth stack to LLMs:
- Adapter management (list, power, discoverable, pairable)
- Device discovery and management (scan, pair, connect, trust)
- Audio profiles with PipeWire/PulseAudio integration (A2DP/HFP switching)
- BLE/GATT support (services, characteristics, read/write/notify)
Built on:
- FastMCP 2.14.4 for MCP protocol
- dbus-fast 4.0.0 for async BlueZ D-Bus communication
- pulsectl-asyncio 1.2.2 for audio control