dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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