{"id":48380780,"url":"https://github.com/mikevitelli/uconsole-cloud","last_synced_at":"2026-04-15T07:03:38.109Z","repository":{"id":349386154,"uuid":"1182487419","full_name":"mikevitelli/uconsole-cloud","owner":"mikevitelli","description":"Remote telemetery platform for the ClockworkPi uConsole — cloud dashboard, device tools, local webdash, APT repository","archived":false,"fork":false,"pushed_at":"2026-04-09T00:26:13.000Z","size":11871,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-09T01:03:37.071Z","etag":null,"topics":["arm64","clockworkpi","debian","device-management","iot","nextjs","pwa","raspberry-pi","self-hosted","uconsole"],"latest_commit_sha":null,"homepage":"https://uconsole.cloud","language":"Python","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/mikevitelli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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-03-15T15:35:29.000Z","updated_at":"2026-04-09T00:16:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"60e5df9d-7f26-4ffa-8afc-db0cbcb5df4e","html_url":"https://github.com/mikevitelli/uconsole-cloud","commit_stats":null,"previous_names":["mikevitelli/uconsole-cloud"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/mikevitelli/uconsole-cloud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikevitelli%2Fuconsole-cloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikevitelli%2Fuconsole-cloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikevitelli%2Fuconsole-cloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikevitelli%2Fuconsole-cloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mikevitelli","download_url":"https://codeload.github.com/mikevitelli/uconsole-cloud/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikevitelli%2Fuconsole-cloud/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31830158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"online","status_checked_at":"2026-04-15T02:00:06.175Z","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":["arm64","clockworkpi","debian","device-management","iot","nextjs","pwa","raspberry-pi","self-hosted","uconsole"],"created_at":"2026-04-05T20:01:47.405Z","updated_at":"2026-04-15T07:03:38.056Z","avatar_url":"https://github.com/mikevitelli.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cbr/\u003e\n\n\u003cimg width=\"1280\" height=\"640\" alt=\"uconsole-cloud-open-graph-template\" src=\"https://github.com/user-attachments/assets/aa03a58e-078d-4f02-b32f-d5d9b2c3c96e\" /\u003e\n\n\u003cbr/\u003e\n\n**Remote monitoring and management for the [ClockworkPi uConsole](https://www.clockworkpi.com/uconsole).**\n\n[![Live](https://img.shields.io/badge/live-uconsole.cloud-58a6ff?style=for-the-badge)](https://uconsole.cloud)\n\n[![GitHub Release](https://img.shields.io/github/v/release/mikevitelli/uconsole-cloud?style=flat-square\u0026color=58a6ff)](https://github.com/mikevitelli/uconsole-cloud/releases)\n[![CI](https://img.shields.io/github/actions/workflow/status/mikevitelli/uconsole-cloud/ci.yml?branch=main\u0026style=flat-square\u0026label=CI)](https://github.com/mikevitelli/uconsole-cloud/actions)\n[![License](https://img.shields.io/github/license/mikevitelli/uconsole-cloud?style=flat-square\u0026color=yellow)](LICENSE)\n[![Next.js](https://img.shields.io/badge/Next.js-16-black?style=flat-square\u0026logo=next.js)](https://nextjs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5-3178c6?style=flat-square\u0026logo=typescript\u0026logoColor=white)](https://typescriptlang.org)\n[![Tailwind CSS](https://img.shields.io/badge/Tailwind-v4-06b6d4?style=flat-square\u0026logo=tailwindcss\u0026logoColor=white)](https://tailwindcss.com)\n[![Vercel](https://img.shields.io/badge/Deployed%20on-Vercel-black?style=flat-square\u0026logo=vercel)](https://vercel.com)\n\n\u003c/div\u003e\n\n---\n\n## What is this?\n\nA three-tier platform for managing the ClockworkPi uConsole — a modular ARM handheld Linux terminal (RPi CM4, 5\" IPS, QWERTY keyboard, Debian Bookworm).\n\n**On your device:** a `.deb` package installs 45+ management scripts, a curses TUI with 8 categories (including FM radio, GPS globe, Marauder serial, battery discharge testing, forum browser, games), a Flask web dashboard with terminal access, and systemd services that push telemetry to the cloud every 5 minutes.\n\n**On your local network:** the web dashboard runs at `https://uconsole.local` via nginx + self-signed TLS + mDNS, accessible from any phone or laptop on the same WiFi. If no known network is available, the device creates a fallback AP (\"uConsole\") so you can always connect.\n\n**In the cloud:** this Next.js app at [uconsole.cloud](https://uconsole.cloud) shows live device status, backup coverage, system inventory, and hardware info — from anywhere.\n\n\n### Features\n\n- **Live device telemetry** — battery, CPU, memory, disk, WiFi, screen, AIO board — pushed every 5 minutes\n- **Persistent status** — last-known data survives reboots and offline periods, with staleness indicators\n- **Hardware manifest** — detects expansion module, SDR, LoRa, GPS, RTC, ESP32 at setup\n- **Backup monitoring** — coverage across 9 categories, commit history with sparklines and calendar grid\n- **System inventory** — packages, browser extensions, scripts manifest, repo tree\n- **Local web dashboard** — HTTPS at `uconsole.local` via mDNS, with WiFi fallback AP\n- **Same-network detection** — shows a direct link to the local dashboard when you're on the same WiFi\n- **Curses TUI** — 8 categories, 14+ tools (FM radio, GPS globe, Marauder serial, discharge testing, forum browser, games)\n- **PWA** — installable on iOS/Android for quick access from your phone\n- **Device code auth** — link devices with an 8-character code or QR scan, no typing passwords on tiny keyboards\n- **APT repository** — `curl | sudo bash` adds the repo, `apt upgrade` handles future updates\n- **Diagnostics** — `uconsole doctor` checks services, SSL, nginx, connectivity, timer health\n- **Automated releases** — GitHub Actions builds `.deb`, publishes to APT repo, tags release\n\n### Optional hardware\n\nThe [HackerGadgets AIO expansion board](https://www.hackergadgets.com/) adds RTL-SDR, LoRa SX1262, GPS, and RTC to the uConsole. All radio features in the dashboard gracefully degrade when no AIO board is present — most users won't have one, and everything works without it.\n\n---\n\n## Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n\n**Landing Page**\n\n\u003cimg width=\"1239\" height=\"872\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e55515bd-d603-4675-950b-6d2afccaee56\" /\u003e\n\n\n\n*Sign in, install, link your device*\n\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n\n**Repo Linking**\n\n\u003cimg width=\"1239\" height=\"872\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b02570ac-a365-4850-a8f7-63a27ac786df\" /\u003e\n\n\n\n*Auto-detects your uconsole backup repo*\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\n**Dashboard Overview**\n\n\u003cimg width=\"1239\" height=\"872\" alt=\"image\" src=\"https://github.com/user-attachments/assets/4dbcdb42-d82b-42c6-9d83-2d4020b7a394\" /\u003e\n\n\n\n*Backup coverage across 8 categories, repo stats*\n\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\n**Device Status**\n\n\u003cimg width=\"1239\" height=\"872\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cfc6c6bc-8014-4594-866c-91f658991ed8\" /\u003e\n\n\n\n*Battery donut, CPU temp, memory, disk, WiFi, uptime, kernel*\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/div\u003e\n\n---\n\n## Install\n\n```bash\ncurl -s https://uconsole.cloud/install | sudo bash\n```\n\nThat's it. This adds the APT repo and runs `apt install uconsole-cloud`. Then:\n\n```bash\nuconsole setup\n```\n\nThe setup wizard detects your hardware, generates SSL certs, sets passwords, and optionally links to uconsole.cloud. After that, `sudo apt upgrade` handles future updates.\n\nCloud is optional — everything works offline.\n\n---\n\n## Architecture\n\n**Device → Redis → Dashboard.** The device pushes telemetry every 5 minutes via `push-status.sh` (systemd timer) to Upstash Redis. The Next.js dashboard reads from Redis on page load using Server Components. No client-side polling. Data persists indefinitely, so the last-known status is always available, even when the device is offline.\n\nOn the local network, the Flask web dashboard runs behind nginx with self-signed TLS at `https://uconsole.local`. If no known WiFi is available, the device creates a fallback AP so you can always connect from a phone or laptop.\n\n---\n\n## Device telemetry\n\n`push-status.sh` collects from sysfs and procfs every 5 minutes:\n\n| Category | Source | Metrics |\n|----------|--------|---------|\n| Battery | `/sys/class/power_supply/axp20x-battery/` | capacity, voltage, current, status, health |\n| CPU | `/sys/class/thermal/`, `/proc/loadavg` | temperature, load average, core count |\n| Memory | `/proc/meminfo` | total, used, available |\n| Disk | `df` | total, used, available, percent |\n| WiFi | `iwconfig wlan0` | SSID, signal dBm, quality, bitrate, IP |\n| Screen | `/sys/class/backlight/` | brightness, max brightness |\n| AIO Board | `lsusb`, `/dev/spidev4.0`, `/dev/ttyS0`, `i2cdetect` | SDR, LoRa, GPS fix, RTC sync |\n| Hardware | `/etc/uconsole/hardware.json` | expansion module, component detection, system info |\n| Webdash | `systemctl` | running, port |\n| System | `hostname`, `uname`, `/proc/uptime` | hostname, kernel, uptime |\n\n---\n\n## uconsole CLI\n\n```\nuconsole setup       Interactive setup wizard (hardware detect, passwords, SSL, cloud link)\nuconsole link        Link device to uconsole.cloud (code auth + QR, no wizard)\nuconsole push        Push status to cloud now\nuconsole status      Show config, timer status, last push time\nuconsole doctor      Diagnose services, SSL, nginx, connectivity, cron/timer conflicts\nuconsole restore     Run restore.sh from backup repo (detects ~/uconsole)\nuconsole unlink      Remove cloud config and stop timer\nuconsole update      Update via APT (or re-download scripts for curl installs)\nuconsole version     Show installed version\nuconsole help        Show all commands\n```\n\n---\n\n## .deb package\n\n```\napt install uconsole-cloud\n```\n\nInstalls to `/opt/uconsole/` with organized subdirectories:\n\n```\nuconsole-cloud_x.y.z_arm64.deb\n├── /opt/uconsole/\n│   ├── bin/                    uconsole CLI, console TUI launcher\n│   ├── lib/                    tui_lib.py, lib.sh, shared modules\n│   ├── scripts/\n│   │   ├── system/             push-status, backup, restore, update, doctor, setup\n│   │   ├── power/              battery, charge, discharge-test (safety-critical)\n│   │   ├── network/            wifi, hotspot, tailscale\n│   │   ├── radio/              sdr, lora, gps, rtc, marauder (AIO board)\n│   │   └── util/               everything else (forum browser, games, etc.)\n│   ├── webdash/                Flask app, templates, static assets\n│   └── share/                  themes, battery-data, esp32, default configs\n├── /etc/uconsole/              uconsole.conf, hardware.json, ssl/\n├── /etc/systemd/system/        7 unit files (not auto-enabled)\n├── /etc/nginx/sites-available/ uconsole-webdash (not auto-enabled)\n├── /etc/avahi/services/        mDNS advertisement\n└── /usr/bin/uconsole           symlink → /opt/uconsole/bin/uconsole\n```\n\n**Dependencies:** python3, python3-flask, python3-bcrypt, python3-socketio, curl, nginx, systemd, qrencode  \n**Recommends:** avahi-daemon, network-manager  \n**Suggests:** gpsd, rtl-sdr, gh\n\nServices are **not** auto-started on install — `uconsole setup` handles that after the interactive configuration wizard.\n\n### Building\n\n```bash\nmake build-deb          # → dist/uconsole-cloud_x.y.z_arm64.deb\nmake publish-apt        # update APT repo in frontend/public/apt/\nmake release            # bump version, build, publish, commit + tag\n```\n\n### Release automation\n\nReleases are built via GitHub Actions. The workflow builds the `.deb`, updates the GPG-signed APT repository in `frontend/public/apt/`, and creates a GitHub release with the `.deb` attached. On merge to `main`, Vercel auto-deploys the updated APT repo to `uconsole.cloud/apt/`.\n\n---\n\n## API routes\n\n| Route | Method | Auth | Purpose |\n|-------|--------|------|---------|\n| `/api/device/code` | POST | No | Generate device code (rate-limited 5/min/IP) |\n| `/api/device/code/confirm` | POST | Session | Confirm code, generate device token |\n| `/api/device/poll/[secret]` | GET | No | Poll for code confirmation |\n| `/api/device/push` | POST | Bearer | Accept device telemetry |\n| `/api/device/status` | GET | Session | Fetch cached status + online flag |\n| `/api/github/*` | GET/POST | Session | GitHub API proxy (repos, commits, tree) |\n| `/api/settings` | GET/POST/DELETE | Session | User settings, repo linking |\n| `/api/settings/regenerate-token` | POST | Session | Regenerate device token |\n| `/api/scripts/[name]` | GET | No | Serve allowlisted scripts (uconsole, push-status.sh) |\n| `/api/raw` | GET | Session | Fetch raw file content from backup repo |\n| `/api/health` | GET | No | Redis health check |\n| `/install` | GET | No | APT bootstrap script (adds repo + installs package) |\n| `/apt/*` | GET | No | GPG-signed APT repository (Packages, Release, .deb files) |\n| `/link` | Page | No | Device code entry (accepts `?code=` for QR scan) |\n| `/docs` | Page | No | Documentation (install, CLI, architecture, troubleshooting) |\n\nSee [docs/DEVICE-LINKING.md](docs/DEVICE-LINKING.md) for the full device auth flow.\n\n---\n\n## Project structure\n\n```\nuconsole-cloud/\n├── frontend/                       Next.js 16 app (88 TS/TSX files)\n│   ├── src/\n│   │   ├── app/                    Pages, API routes, server actions\n│   │   │   ├── page.tsx            Main dashboard (Server Component)\n│   │   │   ├── link/page.tsx       Device code entry page\n│   │   │   ├── docs/page.tsx       Documentation page\n│   │   │   ├── install/route.ts    APT bootstrap script endpoint\n│   │   │   ├── actions.ts          Server actions (sign in/out, unlink)\n│   │   │   ├── manifest.ts         PWA manifest\n│   │   │   └── api/                16 API routes\n│   │   ├── components/\n│   │   │   ├── dashboard/          17 dashboard sections\n│   │   │   ├── viz/                7 visualization components (sparkline, donut, treemap, etc.)\n│   │   │   └── *.tsx               Shared UI (RepoLinker, DeviceCodeForm, CopyCommand, etc.)\n│   │   ├── lib/                    20 modules (auth, redis, github, device config, etc.)\n│   │   └── __tests__/              10 test suites, 117 tests (vitest)\n│   ├── public/\n│   │   ├── scripts/                Install-time copies of CLI + push-status.sh\n│   │   ├── install.sh              APT bootstrap installer\n│   │   └── apt/                    GPG-signed APT repository (Packages, Release, .deb)\n│   └── next.config.ts              Security headers, APT MIME types, image config\n├── device/                         Canonical device source (TUI, webdash, scripts)\n│   ├── bin/                        uconsole CLI, console TUI launcher\n│   ├── lib/                        tui_lib.py, lib.sh, shared modules\n│   ├── scripts/                    46 scripts (system, power, network, radio, util)\n│   ├── webdash/                    Flask app (app.py, templates, static)\n│   └── share/                      themes, battery-data, esp32, default configs\n├── packaging/                      .deb build system\n│   ├── build-deb.sh                Build script (reads VERSION, organized layout)\n│   ├── control                     Package metadata + dependencies\n│   ├── postinst, prerm, postrm     Lifecycle hooks (config setup, teardown, purge)\n│   ├── defaults/                   uconsole.conf.default\n│   ├── systemd/                    7 unit files (status, backup, update timers + webdash)\n│   ├── nginx/                      HTTPS reverse proxy config\n│   ├── avahi/                      mDNS service advertisement\n│   └── scripts/                    generate-repo.sh, generate-gpg-key.sh\n├── docs/                           Architecture documentation\n│   └── DEVICE-LINKING.md           Device auth flow (ASCII diagrams, API shapes, edge cases)\n├── studio/                         Sanity CMS workspace (landing page content)\n├── .github/\n│   ├── workflows/                  Release automation (build .deb, publish APT)\n│   └── ISSUE_TEMPLATE/             Bug report + feature request templates\n├── Makefile                        build-deb, publish-apt, release, version bumps\n├── VERSION                         Package version (semver)\n└── package.json                    npm workspace root (frontend + studio)\n```\n\n---\n\n## Security\n\n| Protection | Implementation |\n|------------|----------------|\n| Auth | NextAuth v5 + GitHub OAuth, middleware-enforced on all API routes |\n| Device auth | Bearer tokens (90-day UUIDs), rate-limited code generation (5/min/IP) |\n| Input validation | Path traversal blocks, SHA regex, strict repo format validation |\n| Headers | CSP, X-Frame-Options DENY, nosniff, Referrer-Policy, Permissions-Policy |\n| Error handling | Typed GitHubError (401/403 surfaced), error boundary hides internals |\n| Data isolation | Redis keys scoped by repo, device tokens scoped by user |\n| Local TLS | Self-signed cert at `/etc/uconsole/ssl/` (generated at install) |\n| Secrets | `status.env` is chmod 600, owned by device user |\n| APT repo | GPG-signed Release files, key distributed via HTTPS |\n\n---\n\n## Tech stack\n\n| Layer | Technology | Purpose |\n|-------|------------|---------|\n| Framework | Next.js 16 | App Router, Server Components, Server Actions |\n| Auth | NextAuth v5 | GitHub OAuth with JWT strategy |\n| Data | Upstash Redis | Device telemetry (persistent), device codes (10-min TTL) |\n| Backup data | GitHub REST API | Commits, tree, raw files, packages |\n| CMS | Sanity v3 | Landing page and dashboard copy |\n| Styling | Tailwind CSS v4 | GitHub-dark theme with CSS variables |\n| Testing | Vitest 4 | 117 tests — parsing, security, API, validation |\n| Hosting | Vercel | Auto-deploy from main, preview on PRs |\n| CI/CD | GitHub Actions | Automated `.deb` builds, APT repo publishing |\n| Device | Bash + Python | 46 scripts, Flask webdash, curses TUI, systemd services |\n| Packaging | dpkg + APT | `.deb` for arm64, GPG-signed repository on Vercel CDN |\n\n---\n\n## Local development\n\n```bash\ngit clone https://github.com/mikevitelli/uconsole-cloud.git\ncd uconsole-cloud\nnpm install\n\n# Configure environment\ncp frontend/.env.example frontend/.env.local\n# Fill in: GITHUB_ID, GITHUB_SECRET, AUTH_SECRET,\n#          UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN\n\nnpm run dev        # frontend :3000, studio :3333\nnpm test           # 117 tests (vitest)\nnpm run build      # production build\nnpm run lint       # ESLint\n```\n\n### Branching\n\n| Branch | Purpose |\n|--------|---------|\n| `main` | Released state — what consumers get via APT. Tags trigger GitHub Releases. |\n| `dev` | Active development. CI runs on push. Merged to `main` at release time. |\n\nFeature branches (`feat/...`, `fix/...`) branch from and merge back to `dev`.\n\n### Development workflow\n\n```bash\n# On the uConsole (or any machine with the repo):\ncd ~/uconsole-cloud\ngit checkout dev\n\n# Edit device source\nvim device/lib/tui/framework.py\n\n# Deploy to device for testing (rsyncs to /opt/uconsole/ and ~/pkg/)\nmake install\nsudo systemctl restart uconsole-webdash   # if webdash changed\n\n# Test, iterate, commit to dev\ngit add device/ \u0026\u0026 git commit -m \"feat: ...\"\ngit push origin dev\n```\n\nPublishing a release merges `dev` → `main`, bumps VERSION, builds the `.deb`, signs the APT repo, tags, and pushes.\n\n### Makefile targets\n\n```\nmake version       Print current version\nmake bump-patch    Bump patch version (x.y.z → x.y.z+1)\nmake bump-minor    Bump minor version (x.y.z → x.y+1.0)\nmake bump-major    Bump major version (x.y.z → x+1.0.0)\nmake install       Deploy device/ to /opt/uconsole/ and ~/pkg/\nmake build-deb     Build .deb package to dist/\nmake publish-apt   Update APT repo from latest .deb\nmake release       Bump + build + publish + commit + tag\nmake clean         Remove build artifacts\n```\n\n---\n\n## Environments\n\n| Environment | Domain | Trigger |\n|-------------|--------|---------|\n| Production | [`uconsole.cloud`](https://uconsole.cloud) | Push to `main` |\n| Preview | `*.vercel.app` | PRs and branches |\n| Local | `localhost:3000` | `npm run dev` |\n\n---\n\n## Self-hosting\n\nYou can run your own instance of the cloud dashboard instead of using `uconsole.cloud`.\n\n### 1. Deploy the dashboard\n\n```bash\ngit clone https://github.com/mikevitelli/uconsole-cloud.git\ncd uconsole-cloud\nnpm install\n```\n\nDeploy to Vercel, Netlify, or any platform that runs Next.js. Set these environment variables:\n\n| Variable | Required | Purpose |\n|----------|----------|---------|\n| `GITHUB_ID` | Yes | GitHub OAuth app ID |\n| `GITHUB_SECRET` | Yes | GitHub OAuth app secret |\n| `AUTH_SECRET` | Yes | NextAuth JWT secret (`openssl rand -base64 33`) |\n| `UPSTASH_REDIS_REST_URL` | Yes | Redis REST endpoint ([Upstash](https://upstash.com) free tier works) |\n| `UPSTASH_REDIS_REST_TOKEN` | Yes | Redis auth token |\n| `NEXT_PUBLIC_SANITY_PROJECT_ID` | No | Sanity CMS for landing page (optional) |\n\nCreate a [GitHub OAuth App](https://github.com/settings/developers) with your deployment URL as the callback.\n\n### 2. Point your device at it\n\nAfter installing the .deb on your uConsole, edit the cloud API URL:\n\n```bash\nsudo nano /etc/uconsole/status.env\n# Change DEVICE_API_URL to your instance:\n# DEVICE_API_URL=\"https://your-domain.com/api/device/push\"\n```\n\nThen run `uconsole setup` to link your device.\n\n### 3. APT repo (optional)\n\nIf you want to host your own APT repository, build and sign the .deb:\n\n```bash\nmake build-deb\nmake publish-apt    # requires GPG key: bash packaging/scripts/generate-gpg-key.sh\n```\n\nThe signed repo lives in `frontend/public/apt/` and is served by whatever hosts your frontend.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Issues and PRs welcome — especially from uConsole owners who can test device-side changes on real hardware.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nBuilt for the [ClockworkPi uConsole](https://www.clockworkpi.com/uconsole).\n\n`88 source files · 16 API routes · 32 components · 46 device scripts`\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikevitelli%2Fuconsole-cloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikevitelli%2Fuconsole-cloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikevitelli%2Fuconsole-cloud/lists"}