The "No Compromise" IoT Platform
PidgeIoT is an open-source, edge-native IoT platform built entirely in Rust. It eliminates the traditional trade-off between edge performance and data sovereignty. By routing device-facing logic through Cloudflare Workers and allowing you to self-host your own data plane, PidgeIoT gives you massive global scale without vendor lock-in.
This project is structured as a Cargo Workspace containing three primary crates:
- 🗄️
dovecote(Backend): A serverless edge router built with Cloudflare Workers and Durable Objects. It handles low-latency ingestion, device provisioning, and session validation. - 🖥️
fancier(Frontend): A blazing-fast WebAssembly Single Page Application (SPA) built with Dioxus and styled with TailwindCSS & DaisyUI. This is the human-facing dashboard. - 💊
capsules(Shared Models): The shared data structures, serialization logic, and RPC schemas ensuring the frontend and backend are always 100% in sync.
A Cloudflare Workers runtime is HTTP-only, so the protocols that constrained devices actually speak are terminated by two small services that run on an ordinary VPS in front of dovecote and translate onto its device HTTP routes. Each lives in its own repository:
- 📡
loft(CoAP terminator):coaps://over DTLS/UDP andcoaps+tcp://over TLS/TCP on one port, pre-shared-key authentication, block-wise transfer. - 📬
pigeonhole(MQTT broker): MQTT 5 and 3.1.1 over TLS, certificate or pre-shared-key authentication, one session per device, the device shadow fed back as a retained message.
🕊️ Device library: pigeon is the Zephyr RTOS client module devices run, with sample applications in pigeon-examples.
📖 API Reference: the full dovecote HTTP surface (dashboard + device routes, auth models, request/response shapes) is documented in docs/api.md.
Before you begin, ensure you have the following installed:
- Rust & Cargo (Latest stable)
- Bun or Node.js (for Cloudflare Wrangler)
- Dioxus CLI (
cargo install dioxus-cli) - Docker
- Docker Compose
PidgeIoT uses Ory Kratos for identity and session management. Start the local authentication and database containers from the root of the project:
docker-compose -f infra/docker-compose.yml up --force-recreate- Kratos Admin UI: http://127.0.0.1:3000
- MailSlurper (Local Email Capture): http://127.0.0.1:4436
Open a new terminal window and start the Cloudflare Worker locally using Wrangler:
cd dovecote
bunx wrangler dev --ip 127.0.0.1 --port 8787 --env devThe API will be available at http://127.0.0.1:8787
Open a third terminal window and start the Dioxus development server:
cd fancier
dx serve --addr 127.0.0.1 --port 4455The Dashboard will be available at http://localhost:4455 — browse it as localhost, not 127.0.0.1: WebAuthn/passkeys refuse an IP-literal RP id, and the auth cookies are scoped to the host the pages share.
For live CSS changes run tailwindCSS in watch mode
cd fancier
bunx @tailwindcss/cli -i ./assets/tailwind.css -o ./assets/styling/main.css --watchTo rebuild the Architecture diagram run
cd fancier
bunx mmdc -i assets/architecture.mmd -o assets/images/architecture.svg -b transparentPidgeIoT is open-source. Contributions to the dashboard, to core backend stability, and to the device library are all welcome. Protocol work belongs in the repository that owns the transport: CoAP in loft, MQTT in pigeonhole, on-device support in pigeon. Cellular NIDD has no implementation anywhere yet and is open to anyone who wants it. Please open an issue before submitting major architectural pull requests.
AGPL-3.0. See LICENSE; third-party components are listed in THIRD_PARTY_NOTICES.md.