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.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A subscription daily planning app: GTD inbox + task list + Google/M365 calendars on one
planning surface with drag-and-drop time blocking. Phase 1 of LifeOS — the daily driver
that replaces Akiflow.
Paid, per-account: $29/mo or $19/mo billed annually, after a 14-day no-card trial.
Billing setup and the gating model live in docs/billing-setup.md.
Single-player, multi-tenant. One person's funnel per account, no shared objects — and
many independent accounts on one deployment. The two are different claims; see
docs/product/overview.md §2.1.查看完整 README ↗A subscription daily planning app: GTD inbox + task list + Google/M365 calendars on one planning surface with drag-and-drop time blocking. Phase 1 of LifeOS — the daily driver that replaces Akiflow.
Paid, per-account: $29/mo or $19/mo billed annually, after a 14-day no-card trial.
Billing setup and the gating model live in docs/billing-setup.md.
Single-player, multi-tenant. One person's funnel per account, no shared objects — and
many independent accounts on one deployment. The two are different claims; see
docs/product/overview.md §2.1.
Core model decision: a scheduled task IS a time block. One row in tasks:
do_date set + start_time null = planned for the day (unblocked); both set =
scheduled on the calendar. There is no separate event entity for tasks.
docs/README.md is the map. Two layers:
docs/product/ — the why. The canon
(overview.md), the rules
(principles.md), who it's for and the questions on their
minds (personas.md), the story
(brandscript.md), the field
(landscape.md), the bets
(roadmap.md), the log
(decisions.md), the names
(glossary.md), and the methods for auditing
(audit.md) and ideating
(ideation.md).docs/*.md — the how. Mechanism specs, each with its own status header.src/ SPA source
marketing/ Public one-pager (separate Vite app + Vercel project)
packages/design/ Shared design tokens stub (app + marketing)
supabase/migrations/ schema, RLS, vault wrappers, rollover fn, cron jobs
supabase/functions/ edge functions (all server-side logic)
google-oauth/ OAuth consent + callback, mirror-calendar setup
google-sync/ full/incremental sync, watch channels, poll fallback
google-webhook/ push notification receiver
google-events/ write-back for real Google events (create/move/resize/retitle,
invite, RSVP, delete, and Google Meet links)
task-mirror/ scheduled task → "Nuvo" Google calendar reconciler
m365-oauth/ Microsoft identity platform OAuth
m365-sync/ Graph calendarView delta polling (read-only)
icloud-connect/ iCloud CalDAV connect (Apple ID + app-specific password)
icloud-sync/ iCloud CalDAV read sync (per-calendar calendar-query)
icloud-events/ iCloud CalDAV write-back (create/move/resize/delete)
rollover/ 00:05 LA rollover + mirror cleanup
supabase link --project-ref YOUR_REF
supabase db push # applies migrations
supabase functions deploy google-oauth google-sync google-webhook google-events \
task-mirror m365-oauth m365-sync icloud-connect icloud-sync icloud-events \
rollover agent
In the SQL editor, seed the two Vault secrets that pg_cron uses to invoke edge functions:
select vault.create_secret('https://YOUR_REF.supabase.co', 'project_url');
select vault.create_secret('YOUR_SERVICE_ROLE_KEY', 'service_role_key');
Auth → Google only (disable the Email provider). Signups must stay enabled —
Nuvo sells subscriptions, so anyone who can't sign up can't become a customer.
(This used to say the opposite, back when it was a single-user app.) The new-user
trigger seeds the settings row and a 14-day trial — see docs/billing-setup.md.
It no longer seeds domains: migration 42 removed the Work / Church / Trading /
Family seed, which was one operator's life handed to every account. A new account
names its own via the first-run picker (D-026 in
docs/product/decisions.md).
supabase secrets set \
GOOGLE_CLIENT_ID=... GOOGLE_CLIENT_SECRET=... \
MS_CLIENT_ID=... MS_CLIENT_SECRET=... \
APP_URL=https://your-app-host \
OPENAI_API_KEY=sk-... \
OPENAI_MODEL=gpt-4.1-mini
The Nuvo agent reads/writes tasks via the agent edge function. Do not put
OPENAI_API_KEY in the frontend .env — it lives in Supabase secrets only.
For local function dev: supabase functions serve agent --env-file .env.local.
https://YOUR_REF.supabase.co/functions/v1/google-oauth, Calendar API enabled.
Push notifications require the domain to be verifiable; if events.watch fails the
app automatically falls back to 5-minute polling (check sync_log).https://YOUR_REF.supabase.co/functions/v1/m365-oauth, delegated
permissions Calendars.Read, User.Read, offline_access.supabase secrets.cp .env.example .env # fill VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY
npm install
npm run dev # or: npm run build → dist/ static bundle
inbox (raw captures) → backlog (processed, deliberately
undated: project/initiative tasks live here, never in the inbox, never on Today, never
rolled) → Week (sprints row per week; tasks point at it via sprint_id) → Day
(do_date, optionally a block). The Week is the only gate between the vertical and
the calendar.useVertical) read/write live Supabase rows; the
localStorage prototype is gone. Domain invested/quarter/last-touched derive from
completed blocks. Calendar blocks and rail rows are tinted by domain color.agent edge
function: {scaffold:{projectId}} (ordered project tasks), {blueprint:{…}}
(initiative subtree), {prepare:{taskId}} (pre-work written to the task: approach,
drafts, pitfalls — ✦ badge, surfaced at Sunrise, boosted in Now),
{narrate:{…}} (one gain-framed sentence over the measured deltas).user_settings
(work_start_minutes/work_end_minutes) and per-day contexts on the week
(day_contexts: normal / ◐ light / ✈ travel / — off): travel days get no deep
blocks, off days get nothing, light days stay half-empty. Both editable inside
the Sunday flow.src/lib/calibration.ts) — completed blocks are the evidence:
the proven weekly pace (last 4 weeks) caps the composer (+15% room to grow), and
the composed week gets a confidence read (planned vs proven, deep-work morning
share, roll-rate friction per energy). No history → it says so instead of guessing.After pulling: supabase db push (applies migrations 04-09 — incl. the
recurrences table) and supabase functions deploy agent google-events
(the latter gained native RRULE support for repeating calendar events).
Apple Calendar support (migration …32_icloud.sql + the icloud-* functions)
also arrives via supabase db push and
supabase functions deploy icloud-connect icloud-sync icloud-events. No new
supabase secrets are required — the credential is each user's app-specific
password, entered in the app.
do_date = today, start_time cleared (they land
in the anytime row, not on yesterday's hour), duration kept, roll_count + 1,
mirror event deleted, ↻ badge in the Today list.recurrences row holds the rule (daily / weekly
with weekday picks / monthly, an interval, and an optional end) plus the template
every occurrence is stamped from. Occurrences are materialized as ordinary
tasks/slots rows up to a 35-day horizon (HORIZON_DAYS), topped up client-side
on every app open and after rollover — so drag, resize, and slot-children all keep
working with zero special-casing. A recurring occurrence never rolls over (a
missed one is just missed; tomorrow already has its own). If a repeat skips the
day you drew on (e.g. "every weekday" on a Saturday) the create card says "first
on Mon Jun 15" and the calendar jumps to that first occurrence so it never seems
to vanish. Set a repeat from the drag-to-create card or the ↻ chip in a task/slot
popover; editing one occurrence (drag/resize) pins it so a later "edit all" leaves
it be. Deleting offers this occurrence · this & following · whole series.
Materialized occurrences are not pushed to the Google "Nuvo" mirror calendar —
firing ~25 concurrent mirror writes raced on the OAuth token refresh and 500'd, so
series live in Nuvo only for now (phone-mirroring a series is a follow-up).
Repeating calendar events are handled natively by Google (an RRULE on create);
the read-sync pulls the instances back and the existing THIS/ALL dialog edits them.⌘K capture/command bar · ⌘J Nuvo assistant · C focus capture · P new project · I new initiative ·
1/2/3 inbox/week/today · ↑↓/jk navigate · Enter open · E today · T tomorrow · W next week ·
S pick date/time · D done · X trash · # labels · Esc close
The fast composer (P / I, or any + new button) is a Todoist-quick lane: pick a domain,
name it, then rattle off subtasks — ⏎ drops the next line, ⌘⏎ saves the whole thing in one
write. more options… swaps in the full moment (outcome, context, AI-drafted backlog).
Capture syntax: call David tomorrow 9am 30m #church !high — chrono-node dates,
30m/1h/1h30 durations, #label, !low/!medium/!high.
icloud-synccalendar-queryparseIcsicloud-eventsPUTDELETERECURRENCE-IDEXDATEneeds_reconnectneeds_reconnect on the account, which surfaces the orange
reconnect banner — sync never fails silently. All sync operations write to sync_log.