nodrix
The IoT platform Cloudflare didn't build. Point your hardware at one endpoint over HTTPS or WebSocket, watch variables appear on their own, build realtime drag-and-drop dashboards, automate, and read it all back through a clean API โ entirely on infrastructure you own. nodrix is single-tenant and open source: it deploys into your Cloudflare account on Workers, Durable Objects, D1, and R2.
Features
- ๐ก Telemetry over HTTPS or WebSocket โ hardware POSTs JSON to a project; variables auto-create on first sight. No schema to define, no MQTT broker to run.
- ๐ Realtime dashboards โ a drag-and-drop widget grid streams updates over hibernating WebSockets; share any dashboard read-only by public link.
- ๐งฉ Embeddable widgets โ every widget is a framework-agnostic Web Component you can lift straight into your own app.
- ๐ฎ Two-way control โ toggles, sliders, color pickers, and buttons write values back to hardware via short polls or a control socket.
- ๐ค Visual automations โ variable, schedule, sunrise/sunset, and event triggers run conditions and actions: webhooks, code snippets, and service integrations.
- ๐ Integrations โ fan out to HTTP, email, and chat (Slack, Telegram, Discord, and more).
- ๐ Clean read API โ latest state, time-series, and variable listings behind one token.
- ๐ง Native MCP server โ read telemetry and control hardware from an AI assistant, on devices you are not physically next to. Owner-gated and off by default; see AI assistants (MCP).
- ๐ฅ Multi-user โ owner / admin / member roles, email invites, and social sign-in (Google, GitHub).
- ๐ Audit log โ every privileged action recorded and paginated in the UI.
Quick start
-
Deploy to your Cloudflare account โ one click, or bun run deploy:platform from a clone.
-
Create the owner account โ the first visit prompts a "Create owner account" page; the first signup becomes owner.
-
Create a project and mint a project token from the dashboard.
-
Send telemetry โ variables are created the moment data arrives:
curl -X POST https://<your-worker>/v1/telemetry \
-H "Authorization: Bearer $NODRIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"metrics":{"temperature":23.4,"humidity":61}}'
-
Read it back:
curl https://<your-worker>/v1/projects/<project>/state \
-H "Authorization: Bearer $NODRIX_TOKEN"
AI assistants (MCP)
nodrix ships a native Model Context Protocol server, so an assistant can read a project's telemetry and โ once you allow it โ act on the hardware. Because devices report to your deployment rather than to your laptop, the board does not need to be plugged into the machine running the assistant; it can be in another building.
Two endpoints, both Streamable HTTP:
| Endpoint | Auth | For |
|---|
/v1/mcp | Bearer token | CLI and IDE clients |
/v1/mcp/oauth | OAuth | claude.ai-style connectors |
Both are off by default. The owner flips them in Settings โ More:
mcp_enabled โ the master switch. While it is off, /v1/mcp returns 404, so a disabled server looks absent rather than merely forbidden.
mcp_write_enabled โ gates the management and control tools. Until it is on, even an admin-scope token gets read-only tools, so an assistant cannot command hardware by default.
12 read tools โ list_projects, list_variables, get_state, get_series, list_dashboards, get_dashboard, list_widget_types, list_widgets, list_block_types, list_integration_kinds, list_automations, list_integrations.
16 write tools โ creating and updating projects, variables, dashboards, widgets, automations, and integrations, plus set_variable (how an assistant turns a relay on), run_automation, emit_event, and test_integration.
There are no delete tools, by design. Every tool resolves its target project through the token's scope before it runs, so it cannot reach a project the token cannot.
Architecture
- Worker (worker/) โ a single Hono app. Durable Objects for Project, Dashboard, Scheduler, and the MCP agent; one Workflow for provisioning; D1 (metadata), R2 (telemetry history), KV (read cache + JWKS).
- Web (web/) โ Vue 3 + Tailwind + Reka UI admin panel and drag-and-drop dashboard builder, built and served as Worker static assets.
- Shared (shared/) โ framework-agnostic Web Component widgets, the integration catalog, and automation blocks, consumed by both web and worker so there is a single source of truth.
- Deploy (deploy/) โ the small config carrier behind the one-click Deploy to Cloudflare.
worker/ Cloudflare Worker โ API, Durable Objects, Workflow
web/ Vue 3 admin panel + dashboard builder
shared/ Web Component widgets, integration catalog, automation blocks
deploy/ One-click Deploy to Cloudflare config
scripts/ Build, version, and migration generators
Storage
| Store | Holds |
|---|
| Project DO (SQLite) | Latest variable state, recent ring buffer, pending control writes, flush cursor |
| R2 | Cold telemetry history (NDJSON, partitioned by project + hour) |
| D1 | Users, sessions, accounts, projects, variables, dashboards, tokens, automations, integrations, audit log, OAuth provider config (metadata only โ never any telemetry point) |
| KV | Cached /state responses and JWKS |
| Dashboard DO | Per-dashboard subscriptions + hibernated WebSockets |
| Scheduler DO | One alarm at the next schedule/sunset automation fire time |
Authentication
Better Auth handles sign-in. Email + password is on by default; Google and GitHub OAuth can be enabled at runtime from Settings โ Sign-in providers (the owner enters a client ID + secret per provider, and the login page shows the matching buttons immediately).
The first signup on a fresh deployment becomes owner. After that, registration is closed: the owner invites people from Users, each with an owner / admin / member role. Sessions are cookie-based and persist 30 days; each device is a separate session, listed and revokable from Users.
Development
nodrix uses Bun.
bun install
bun run dev
bun run dev:web
bun run typecheck
bun run build
bun run deploy:platform
Links
License
MIT ยฉ Arjun Krishna