dumbtv
dumbtv takes the ads, screen tracking and update nags out of your Fire TV over ADB. No root, none of your apps touched, every step can be undone. Free and open source.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证数字钥匙管理软件,用实时仪表板取代手动日志簿,提供不可变更的审计追踪,并通过 AI 驱动的风险评分。
AI 翻译
A digital key management system that replaces a manual logbook with real-time dashboards, an immutable audit trail, and AI-driven risk scoring.
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
SmartKey is a key management web application for the University of Lagos Senate
Building. It replaces the paper logbook at the security desk with role-specific
dashboards, an immutable audit trail, and three supporting AI components.
The Senate Building has two zones (New Senate and Old Senate). Staff borrow
physical room keys from a security desk. SmartKey tracks who is authorised to
collect each key, issues a short-lived verification code for each request,
records every issue and return, and flags requests that fall outside normal
patterns.查看完整 README ↗SmartKey is a key management web application for the University of Lagos Senate Building. It replaces the paper logbook at the security desk with role-specific dashboards, an immutable audit trail, and three supporting AI components.
The Senate Building has two zones (New Senate and Old Senate). Staff borrow physical room keys from a security desk. SmartKey tracks who is authorised to collect each key, issues a short-lived verification code for each request, records every issue and return, and flags requests that fall outside normal patterns.
Four roles share the application, each with its own dashboard:
hod_decisions, HOD_APPROVED,
/api/requests/hod-decision — keep the older "HOD" name for historical
continuity; the role itself is DEAN.)External (non-registered) people can also submit a weekend-only request through a public form; a Dean authorises it and the guest collects with a code, checked against their physical ID at the desk.
/cso/settings), and
emails it. The code reserves one copy until it is used or lapses.A key record is a room's set of interchangeable copies (keys.key_count), not a
bunch handed over as a unit. A room with three keys can be with three people at
once and the fourth request is refused; most rooms have one, where this behaves
exactly as a single key always did.
Weekend access is a separate flow. It needs Dean approval first (or CSO approval, for Administration keys) — the Dean can decide straight from the notification email through a one-click link, without signing in. The code is not issued at approval time: the requester mints it themselves on the requested day, so it is never long-lived.
docs/AI.md. A mismatch never auto-blocks: it holds the action (a weekend
request approval, or a Dean replacing their own reference signature/stamp) and
raises a review item on the CSO dashboard, where the CSO approves or declines
it after comparing the images side by side.All AI runs server-side, and every AI output is inspectable rather than presented as a black-box decision.
pg_cron inside Postgres (there is no separate scheduler,
and the Edge Functions that once held these jobs have been removed)docs/TESTING.md for what is
and is not covered.Seven pg_cron jobs run inside Postgres. Three of them (the reminder, digest,
and export jobs) call an API route over HTTP with a shared bearer secret,
because sending email and writing to Blob storage cannot be done from plpgsql.
All times are UTC.
| Job | Schedule | What it does |
|---|---|---|
expire-lapsed-codes | every 10 min | Tidies up unclaimed collection codes¹ |
overdue-key-check | hourly | Marks overdue keys, then emails overdue reminders |
daily-shift-summary | 18:00 | Queues a shift report for the day's last shift |
expire-stale-weekend-requests | 00:15 | Expires weekend requests whose date has passed |
weekend-code-reminders | 06:00 Sat, Sun | Reminds approved requesters to mint their code |
daily-digest | 07:00 | Sends the opt-in activity digest to Deans and the CSO |
audit-log-export | 02:00 | Exports the previous day's audit log to Vercel Blob |
¹ It marks the request EXPIRED; it is not what frees the key. A code stops
reserving its copy the moment it lapses, so the key is requestable again
immediately rather than up to ten minutes later.
Install dependencies and start the development server:
bun install
bun run dev
Open http://localhost:3000.
Copy .env.local.example to .env.local and fill in the required values
(Supabase URL and keys, Gemini API key, Gmail SMTP credentials, and risk-engine
thresholds) before running against a real backend.
To confirm the app can reach the database:
curl http://localhost:3000/api/health
GET /api/health is unauthenticated and runs a real query, returning 200 when
Postgres answers and 503 when it does not. It exists for external uptime
monitoring: the landing page is statically rendered and returns 200 with the
database completely down, so a monitor pointed at / would stay green through a
total outage.
bun run dev # Start the development server
bun run build # Production build
bun run lint # Run ESLint
bun run typecheck # Type-check with tsc
bun run format # Format src/** with Prettier
bun run test # Unit and component tests
bun run test:e2e # Playwright E2E tests
bun run test:db # pgTAP suites (needs a local Supabase stack, so Docker)
bun run db:migrate # Apply Supabase migrations
bun run db:types # Regenerate src/types/database.ts from the local schema
src/app/ App Router routes, one group per role plus public and api
src/components/ ui/ (shadcn primitives) and smartkey/ (app components)
src/hooks/ Realtime subscriptions, connection status, small utilities
src/lib/ Supabase clients, audit writer, AI integrations, utilities
src/types/ Shared TypeScript types and zod schemas
src/tests/ Unit and component tests (not co-located with components)
src/proxy.ts Auth and role gating (Next.js 16's rename of middleware.ts)
supabase/ Migrations, RLS policies, seed data, pgTAP tests
tests/ Playwright E2E specs and the post-deploy smoke test
design-system/ DESIGN.md (design tokens), screens, prompt files
docs/ Long-form documentation
CLAUDE.md — conventions and project rulesdocs/PRODUCT.md — domain and product contextdocs/ARCHITECTURE.md — architectural decisionsdocs/BACKEND.md — backend system designdocs/API.md — API route cataloguedocs/DATABASE.md — database schemadocs/AI.md — AI integration detailsdocs/TESTING.md — testing strategydocs/SCREEN_CHECKLIST.md — required states and checks for any new screendocs/GLOSSARY.md — project and UNILAG-specific termsdocs/GITHUB.md — labels, milestones, branch and PR conventionsdocs/CHANGELOG.md — what changed and why, newest firstdocs/adr/ — architectural decision recordsdesign-system/DESIGN.md — design system and tokens