TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A small dashboard that scores and ranks your Todoist tasks so you can see
what to work on next.
It's read-mostly by design: it fetches your active tasks, computes a score
for each one, and shows them ranked. It never writes priorities, due dates,
or content back to Todoist. Two things it does write: checking a task off
directly from here (see below), and applying/removing the "Up Next" label
when you drag a task in or out of that section (see Up Next) —
both because that's the point of using the app for anything beyond looking.README 전문 보기 ↗A small dashboard that scores and ranks your Todoist tasks so you can see what to work on next.
It's read-mostly by design: it fetches your active tasks, computes a score for each one, and shows them ranked. It never writes priorities, due dates, or content back to Todoist. Two things it does write: checking a task off directly from here (see below), and applying/removing the "Up Next" label when you drag a task in or out of that section (see Up Next) — both because that's the point of using the app for anything beyond looking.
Each task's score is a weighted combination of three signals, each first
normalized to its own small range and then scaled by its weight × 20. With
the default weights (priority 1, due 2, staleness 0), each signal can
contribute up to roughly 20 and 40 points respectively, plus whatever
label bonuses apply. Staleness defaults to off (0) but is there if you
want it — turn its slider up in Settings to start factoring in how long a
task has sat idle. The exact formula lives in src/lib/scoring.js; this
just walks through it.
Todoist's P1-P4 flag, weighted so each tier is worth double the one below it (P4=1, P3=2, P2=4, P1=8), normalized against the top so P1 still maxes out at 1.0:
priorityScore = 2^(todoistPriority - 1) / 8
(Todoist's API represents P1 as 4 and P4 as 1 internally, hence the
- 1 to get a 0-indexed rank first.) That gives P4=0.125, P3=0.25, P2=0.5,
P1=1.0 — P4 no longer scores exactly zero, since "zero" isn't expressible
in a pure doubling ratio, but it's a small share (1/8th of P1's).
This is the only signal that can exceed 1, so overdue tasks can genuinely dominate the ranking. It's driven by precise hours until due — using the task's actual due time when it has one, or 23:59:59 local time on the due date when it doesn't — not by which whole day it falls on. That's what makes "due today" reliably outscore "due tomorrow," and an earlier time outscore a later time on the same day, at any distance out:
1 + hoursOverdue / (14 × 24), capped at 2.0. So a
task 14+ days overdue is maxed out.How long ago the task was created, so an old task with no due date doesn't sit buried forever just because it never got scored on urgency:
stalenessScore = min(daysSinceCreated / 30, 1)
It grows linearly and caps out at 1.0 once a task is 30+ days old. A brand-new task contributes essentially nothing here; a month-old (or older) one contributes its full share.
Unlike the three signals above, label bonuses are a flat addition to the
final score rather than a normalized/weighted component — they don't scale
with the weight sliders. One is pre-configured: long adds 5 points.
Fully editable from Settings (see below) — add your own, change the
points on this one, or remove it entirely.
total = (priorityScore × priorityWeight × 20)
+ (dueScore × dueWeight × 20)
+ (stalenessScore × stalenessWeight × 20)
+ labelBonuses
Hovering a row in the task table shows a tooltip with that task's actual per-component numbers, so you can see exactly why it landed where it did.
Drag a task into the Up Next section to pull it out of the ranking and line it up manually instead.
Dragging a task in (or hitting the ↓ next to it, to send it back down to the ranked list) actually applies (or removes) an "Up Next" label on the task in Todoist — this is the one place besides marking a task complete where the app writes back. That means which tasks are in Up Next is the same everywhere you sign in, not just this browser: label a task from your phone's Todoist app directly and it'll show up here too.
Each item also shows its due date, same formatting as the ranked table (including overdue styling) — a task with no due date just shows nothing there. Besides matching the ranked table, this is what makes it obvious when a recurring task has looped back around with a new due date (see below) instead of it just quietly showing back up unexplained.
Manual order within Up Next is different — Todoist has no concept of a custom order within a label, so drag-to-reorder stays local to this browser (persisted, but not synced) and never touches the network. A task that's in Up Next because of its label but has no saved position here yet (e.g. it was labeled on another device) gets appended in score order until you drag it somewhere specific.
On a mouse or trackpad, click-drag anywhere on the row. On touch, the drag zone is deliberately confined to the small leading circle instead of the whole row — otherwise your finger swiping down the middle of a task to scroll the page would get mistaken for a drag. That circle doubles as a "mark complete" checkbox on both: a plain tap/click checks the task off in Todoist and removes it from the list; a press-and-hold-then-move picks it up to drag. The brief hold before a drag starts is what lets a tap still reach the checkbox instead of always starting a drag.
Completing a recurring task that's in Up Next also strips the Up Next label. Todoist doesn't actually remove a recurring task when you close it — it just advances the same task to its next occurrence, labels and all — so without this it would silently reappear in Up Next with a new due date right after you finished it. This is best-effort: the completion itself never fails because of it, so on the rare chance the label write fails, the task just falls back to reappearing in Up Next like it would have before.
The app quietly re-fetches from Todoist every 15 seconds, so a task added or changed elsewhere — the Todoist app on your phone, say — shows up here on its own, no manual Refresh needed. A few things keep this cheap and out of your way:
15 seconds was chosen with real margin against Todoist's rate limits in mind (sources put the limit somewhere around several hundred to a thousand requests per 15 minutes per token — at this interval a full refresh's ~5 requests works out to roughly 225–300 requests per 15 minutes), including room for having the app open in more than one tab or device at once, which multiplies the request rate since each polls independently.
The gear icon opens a settings panel with:
long.https://todoist.com/... link to a todoist://task?id=...
one, which the desktop (and mobile) app registers itself as the handler
for, so it opens straight into the native app instead of a browser tab.
Off by default and not synced anywhere: it's stored in this
browser's localStorage like the other settings, so it's a per-device
choice on purpose. Turn it on only on a machine that actually has the
Todoist desktop app installed — anywhere else, clicking a task will do
nothing, since there's no page to fall back to and no way for this app
to detect whether a handler is registered before you click.Each task's project (and section, if it's in one) shows in small type under its title. A small document icon there means the task has a description; a speech-bubble icon means it has comments — no counts, just a nudge that there's more worth a look before you start it. The description icon is always current (it comes free with every task); the comments icon is refreshed only on a full load or manual Refresh, not on every 15-second background poll — see Live updates for why (Todoist's task data doesn't include a comment count, so checking means one extra request per project, too much to do every 15 seconds).
The Due column reads relative to today ("Today," "Tomorrow," "in 3 days," "3 days ago") within a week either direction, and a calendar date beyond that — see How scoring works for the exact breakpoints. When a task has an actual time set (not just a date), it's appended, e.g. "Today at 3:00 PM" — never fabricated for a task that's only due on a date.
The search box above the ranked table filters it as you type, matching a task's title, description, or labels (case-insensitive, substring match — no need for exact wording). It only affects the ranked list; Up Next is short and manually curated, so there's nothing there worth searching. Clearing the box (or the × next to it) brings everything back.
The 🎯 button in the header hides the ranked table entirely and shows just Up Next — for when you want to work through what you've already queued up without the rest of the list competing for attention. Click it again (now labeled to exit) to bring the ranked table back, which is also how you add more tasks to Up Next, since dragging one in requires seeing it in the table first. The setting persists across reloads, same as your other preferences.
npm install
npm run dev
On first load, paste in a Todoist API token (Todoist → Settings →
Integrations → Developer). The token is stored only in your browser's
localStorage and used to call Todoist's unified API v1 directly — it
never passes through any server of ours.
This is a static Vite app — deploy the dist/ output anywhere static
(Vercel config is included). Since the Todoist token lives client-side,
there's no backend or environment variable to configure.
The app icon lives at public/icon.svg — Vite copies anything in
public/ to the build output root as-is, so it's referenced from both
index.html (the favicon) and the header logo in src/App.jsx by the
same root-relative path, /icon.svg. It's a plain SVG reconstruction of
a design made in Claude Design (three stacked bars, widest-to-narrowest,
in a rounded badge) — vector rather than a fixed-resolution export, so it
stays crisp at both favicon and logo size. There's also a dark-background
variant of the same design that isn't wired in anywhere currently; swap
public/icon.svg for it (or add it alongside and reference it from a
prefers-color-scheme media query in index.html) if the light version
ever stops being the right call for the tab-bar/OS chrome it was chosen
for.
public/apple-touch-icon.png is a separate 180×180 PNG for the same
design — iOS's "Add to Home Screen" doesn't look at the SVG favicon at
all, only at an apple-touch-icon link, and only accepts a raster image.
Without it iOS quietly falls back to a generated letter tile instead of
erroring, which is why this is easy to miss. It's a flattened render of
the same artwork with the background as a plain full-bleed square rather
than the SVG's pre-rounded corners — iOS applies its own corner mask to
home screen icons, so a source image with transparent corners (from the
rounded rect) risks iOS's transparency-becomes-black behavior showing
through where the two roundings don't quite line up. Regenerate it with
node + Playwright (rendering the same three-bar artwork at 180×180) if
the design ever changes; there's no build-time step that keeps it in sync
with icon.svg automatically.