TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Block distracting apps until you earn screen time by completing real tasks. AI-verified productivity.
Translation pending
ProductivityJavaScript · PLpgSQLGitHub @Dilan-BOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Work for your scroll. Drift is an iOS app that blocks the apps you choose until you earn screen time by doing real things: a workout, a chapter, a chore. You prove it with a photo or a short video, and an AI check approves it before the time is credited.
· Website
┌────────────────────────────────┐ ┌────────────────────────────────────┐
│iOS app (Expo / React Native) │ │Supabase │
│ Drift.jsx shell, JS/JSX │──JWT──▶│ Edge Functions (Deno/TS) │
│ Native modules (Swift): │ │ verify-task, evaluate-task │
│ ScreenTime, Lockbox, │ │ -> OpenAI (server-side only) │
│ SleepGuard │ │ revenuecat-webhook <- RevenueCat │
└────────────────────────────────┘ │ family + push functions │
│ Postgres + RLS │
┌────────────────────────────────┐ │ is_pro(uuid): one entitlement │
│Extensions (App Group) │ │ definition for every caller │
│ DriftMonitor: DeviceActivity │ └────────────────────────────────────┘
│ DriftShield: shield UI │
│ DriftWidgets │
└────────────────────────────────┘
A few decisions worth calling out:
is_pro(), which every edge
function calls instead of re-implementing the check.revenuecat-webhook (which
authenticates every request) may write a subscription's active/expiry
fields; a database trigger rejects writes from anywhere else.DriftMonitor is a
DeviceActivityMonitor extension that iOS wakes on its own schedule, so the
shield goes up even if Drift is force-quit or the phone is offline.| Path | What's there |
|---|---|
App.js, Drift.jsx, *.jsx | App shell, screens and modals |
screenTime.js, blockedApps.js | JS side of the Screen Time bridge |
ios/Drift/ | Native modules (Screen Time, Lockbox AR, Sleep Guard) |
ios/DriftMonitor, ios/DriftShield, ios/DriftWidgets | App extensions |
supabase/functions/ | Edge functions |
supabase/admin/ | Annotated schema history (schema_v*.sql): explains why |
supabase/migrations/ | The migrations as applied |
i18n/ | Translation sources (i18n/src/*.tsv) and the build that emits JS, Swift and InfoPlist strings |
dashboard/ | Internal metrics page (Vercel) |
docs/ | Public website, served by GitHub Pages |
You'll need a Mac with Xcode, Node, CocoaPods and your own Supabase project. Screen Time features (shields, the app picker, the monitor extension) only work on a real iPhone, not in the simulator or Expo Go.
npm install --legacy-peer-deps
cd ios && pod install && cd ..
cp .env.example .env # Google OAuth client IDs
npx expo start --dev-client
Point SUPABASE_URL / SUPABASE_ANON in supabase.js at your own project.
Then build the Drift scheme from ios/Drift.xcworkspace in Xcode. On Xcode
27, npx expo run:ios can't find the simulator; build with xcodebuild
instead (see CLAUDE.md for the exact command).
The backend runs on Supabase. supabase/migrations/ only starts in August
2026 and assumes the tables created before it, so a fresh project needs the
base schema first:
supabase.js (profiles,
screen time, friendships, challenges).supabase/admin/schema_v*.sql in version order, plus the unnumbered
table files (push_tokens.sql, analytics_events.sql). They are written
to be safe to re-run.supabase/migrations/ with supabase db push.Bootstrapping a brand-new project from scratch this way hasn't been tested end to end, so expect to fix up an ordering issue or two.
Then deploy the functions and set OPENAI_API_KEY, OPENAI_MODEL (must be
vision-capable) and REVENUECAT_WEBHOOK_SECRET as function secrets.