{"id":50693996,"url":"https://github.com/decoded-cipher/nodrix","last_synced_at":"2026-06-09T05:06:19.922Z","repository":{"id":358391881,"uuid":"1241218480","full_name":"decoded-cipher/nodrix","owner":"decoded-cipher","description":"The IoT platform Cloudflare didn't build. Telemetry, realtime dashboards, and automations on Workers + D1 + R2 + Durable Objects — in your own Cloudflare account.","archived":false,"fork":false,"pushed_at":"2026-06-08T08:04:10.000Z","size":2231,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-08T09:26:01.286Z","etag":null,"topics":["cloudflare","iot","iot-dashboard","iot-platform"],"latest_commit_sha":null,"homepage":"https://nodrix.live","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/decoded-cipher.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T05:21:01.000Z","updated_at":"2026-06-08T08:04:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/decoded-cipher/nodrix","commit_stats":null,"previous_names":["decoded-cipher/nodrix"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/decoded-cipher/nodrix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decoded-cipher%2Fnodrix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decoded-cipher%2Fnodrix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decoded-cipher%2Fnodrix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decoded-cipher%2Fnodrix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/decoded-cipher","download_url":"https://codeload.github.com/decoded-cipher/nodrix/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decoded-cipher%2Fnodrix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34092349,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare","iot","iot-dashboard","iot-platform"],"created_at":"2026-06-09T05:06:19.489Z","updated_at":"2026-06-09T05:06:19.913Z","avatar_url":"https://github.com/decoded-cipher.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nodrix\n\n**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.\n\n## Features\n\n- 📡 **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.\n- 📊 **Realtime dashboards** — a drag-and-drop widget grid streams updates over hibernating WebSockets; share any dashboard read-only by public link.\n- 🧩 **Embeddable widgets** — every widget is a framework-agnostic Web Component you can lift straight into your own app.\n- 🎮 **Two-way control** — toggles, sliders, color pickers, and buttons write values back to hardware via short polls or a control socket.\n- 🤖 **Visual automations** — variable, schedule, sunrise/sunset, and event triggers run conditions and actions: webhooks, code snippets, and service integrations.\n- 🔌 **Integrations** — fan out to HTTP, email, and chat (Slack, Telegram, Discord, and more).\n- 📖 **Clean read API** — latest state, time-series, and variable listings behind one token.\n- 🧠 **Native MCP server** — an owner-gated Model Context Protocol endpoint with a Claude connector for AI clients (off by default).\n- 👥 **Multi-user** — owner / admin / member roles, email invites, and social sign-in (Google, GitHub).\n- 📝 **Audit log** — every privileged action recorded and paginated in the UI.\n\n## Quick start\n\n1. **Deploy** to your Cloudflare account — [one click](https://nodrix.live), or `bun run deploy:platform` from a clone.\n2. **Create the owner account** — the first visit prompts a \"Create owner account\" page; the first signup becomes `owner`.\n3. **Create a project** and mint a project token from the dashboard.\n4. **Send telemetry** — variables are created the moment data arrives:\n\n   ```bash\n   curl -X POST https://\u003cyour-worker\u003e/v1/telemetry \\\n     -H \"Authorization: Bearer $NODRIX_TOKEN\" \\\n     -H \"Content-Type: application/json\" \\\n     -d '{\"metrics\":{\"temperature\":23.4,\"humidity\":61}}'\n   ```\n\n5. **Read it back:**\n\n   ```bash\n   curl https://\u003cyour-worker\u003e/v1/projects/\u003cproject\u003e/state \\\n     -H \"Authorization: Bearer $NODRIX_TOKEN\"\n   ```\n\n## Architecture\n\n- **Worker** ([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).\n- **Web** ([web/](web/)) — Vue 3 + Tailwind + Reka UI admin panel and drag-and-drop dashboard builder, built and served as Worker static assets.\n- **Shared** ([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.\n- **Deploy** ([deploy/](deploy/)) — the small config carrier behind the one-click Deploy to Cloudflare.\n\n```\nworker/   Cloudflare Worker — API, Durable Objects, Workflow\nweb/      Vue 3 admin panel + dashboard builder\nshared/   Web Component widgets, integration catalog, automation blocks\ndeploy/   One-click Deploy to Cloudflare config\nscripts/  Build, version, and migration generators\n```\n\n## Storage\n\n| Store | Holds |\n|---|---|\n| Project DO (SQLite) | Latest variable state, recent ring buffer, pending control writes, flush cursor |\n| R2 | Cold telemetry history (NDJSON, partitioned by project + hour) |\n| D1 | Users, sessions, accounts, projects, variables, dashboards, tokens, automations, integrations, audit log, OAuth provider config (metadata only — never any telemetry point) |\n| KV | Cached `/state` responses and JWKS |\n| Dashboard DO | Per-dashboard subscriptions + hibernated WebSockets |\n| Scheduler DO | One alarm at the next schedule/sunset automation fire time |\n\n## Authentication\n\n[Better Auth](https://www.better-auth.com) 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).\n\nThe 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**.\n\n## Development\n\nnodrix uses [Bun](https://bun.sh).\n\n```bash\nbun install\nbun run dev              # worker (wrangler dev)\nbun run dev:web          # web (vite)\nbun run typecheck\nbun run build\nbun run deploy:platform  # build + deploy the worker\n```\n\n## Links\n\n- **Site** — https://nodrix.live\n- **Changelog** — https://nodrix.live/changelog\n- **Roadmap** — https://nodrix.live/roadmap\n\n## License\n\n[MIT](LICENSE) © Arjun Krishna\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecoded-cipher%2Fnodrix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdecoded-cipher%2Fnodrix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecoded-cipher%2Fnodrix/lists"}