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.
翻译准备中
A gamified, privacy-focused macOS to-do app
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Turn any text into a dated task — privately, on your Mac. Then watch your city's lights come on as you get things done.
Copy a message, an email or a web page and press ⌘C once more. TodoCity writes the to-do, finds the due date and reminds you on time. A small AI model runs entirely on your own computer, so nothing you capture ever leaves it.
Free and open source · Apple silicon and Intel · one model download from inside the app
Everything runs on your Mac. There's no account, no cloud and no tracking.
Every task is a home. Finish it, someone moves in, and the lights come on.
You're the mayor of a new city. It starts quiet and dark, and your job is to fill it with people — and the only way anyone moves in is when you get something done.
| In your city | In TodoCity | What you see |
|---|---|---|
| An apartment building | A project | It goes up when you start the project. The older the project, the closer to downtown it stands. |
| A floor | A section of a project | You name it: "1st Floor: Travel", "2nd Floor: Program". Tasks on no floor live on the ground floor. |
| A home | A task | A new task is an empty home with a dark window. Finish it and someone moves in: the lights come on, and stay on for good. |
| A faint glow | Sub-tasks under way | Getting a home ready — paint, keys, boiler — is a checklist. Tick some sub-tasks and the window glows behind the curtains. |
| Blinking amber | An overdue task | Someone's waiting at the door. |
| A house | A task in no project | Little houses line the edge of town; their porch lights come on when they're done. |
| "Coming soon" plots | Someday ideas | Ideas you haven't committed to yet. |
| "Moving in today" billboard | Today's timed tasks | On the building's roof, in time order. |
| A rooftop light | A finished project | Every home in the building is lived in. |
| A crane and trucks | A project just starting | A crane over an empty lot; trucks circle buildings with nobody moved in yet. |
| Luxury cars | Your tallest tower | The project you've finished the most of. |
| Population | Every task you've finished | Your number as mayor: "Mayor Sam · Lumen Bay · population 198". |
Your population is every task you've finished. At each milestone the city gains something new — for good. Open your city and click Milestones to see the rules, what's built and how far it is to the next one.
| Population | Your city gains |
|---|---|
| 10 | 🏮 Street lamps on every corner |
| 25 | 🌳 A park at the south end of town |
| 50 | ⛲ A fountain in the park: the town square |
| 100 | 🚆 A train line looping round the city |
| 250 | ⛵ A harbour with a pier, a lighthouse and boats |
| 500 | 🏟️ A stadium with floodlights |
| 1,000 | 🌉 A bridge across the harbour to a second island |
The rules. What's built stays built: un-ticking or deleting a task never takes anything away. There are no streaks, points or penalties, and rewards are only for your city — every feature of the app is yours from day one. Each milestone is celebrated once and adds a chapter to the city's Story.
The shape of a building. Each floor is as wide as its homes need — a floor with 20 homes is wider than one with 4. Floors are stacked with the most homes at the bottom, so every building narrows as it rises; when a floor outgrows the one below, TodoCity restacks them (their names go with them).
The city is alive. Cars drive every street with soft headlights, a few trees and bushes line the pavements, trucks come and go around buildings under construction, and luxury cars circle your tallest tower. (Everything stays still if your Mac is set to reduce motion.)
Explore it. In full screen your city sits in the bottom-right corner and glows whenever someone moves in. Click it to open the city in 3D:
Share it. Share makes a picture of your city with its name and, if you like, how many things you did this week. Copy it or save it to Downloads. The picture is made on your Mac and contains no task names, notes or times — and project names stay off unless you turn them on.
Prefer a clean screen? Make the city card small, or hide it in Settings → Your city.
| The side panel docks at the edge of your screen: today's list, a week strip to drag tasks onto other days, and everything else one click away in the list menu. Press ⇧⌘H to show or hide it, even over full-screen apps. | |
| The menu-bar dropdown opens from the TodoCity icon: today's agenda next to your calendar, frosted over whatever you're doing. Captures drop down here for review. | |
| Full screen (⌃⌘F, or the expand button in the panel) turns TodoCity into a full window with a sidebar, tasks that open in place, a month calendar on the right, a week calendar — and your city. It gets a Dock icon while it's open; the green button at the top left takes you back to the side panel. |
Press ⇧⌘Space anywhere and type pay rent friday 5pm every month #home. TodoCity shows how it reads the date as you type. (In the app's own add field, @Name also puts the task in a project.)
Today shows what's due and planned for This evening, with a month calendar and the day's hours beside it: drag a task onto an hour to time it, or onto a date to move it there. A dot under a date means something's planned; a red one means something's late. (In the side panel, press V to switch Today between a list and hours.)
Anything whose day, time or deadline has passed gathers in Overdue in the sidebar, with a count — instead of a banner on every screen. Move them to today in one click, reschedule by dragging onto the calendar, or tick them off.
Calendar shows the next seven days, every hour of the day, filling the window — your tasks beside your calendar events. Drag tasks between days and hours, click an empty hour to add one there, and drag tasks with no date onto the week to plan them.
In full screen, every task shows its notes and sub-tasks right under it — tick sub-tasks without opening anything. Click a task and it opens in place: its title, notes, sub-tasks, When (a day, a time, this evening or someday), a separate deadline, its project and section, and repeat. Snooze, skip one repeat, pause a series or delete — everything saves as you go, and Done closes it.
Finished tasks go to the Logbook. A task added with no date and no project goes straight to Someday, where ideas wait until you plan them.
The sidebar's switch at the top picks a mode. In Work, Today, Calendar, Anytime, the menu bar and notifications show only your work projects (and tasks with no project); everything else waits, a click away ("4 more today outside Work · Show"). Personal starts with every project. Make more in Settings → Modes: tick the projects each one shows, which calendars it shows, whether notifications follow it, and which project new tasks go to. Each Mac remembers its own mode — Work on the work laptop, Personal at home — while the tasks stay the same everywhere. Switch with ⌃⌥1, ⌃⌥2…, or ⌃⌥0 for everything.
#tags to filter, ⌘Z undoes anything.Settings → Appearance and Settings → Your city let you pick:
Settings → Import Data brings your whole Things 3 library into TodoCity. It all happens on your Mac: TodoCity reads a copy of Things' database, and Things itself isn't changed, so you can keep using it while you try TodoCity.
Running it again later only brings to-dos that are new since last time, even if you've deleted some here.
| Things 3 | TodoCity |
|---|---|
| Project | Project |
| Heading | Section |
| To-do | Task |
| Checklist | Sub-tasks |
| Area | Its projects come as they are; to-dos right in the area become a project named after it |
| Inbox, loose to-dos | Tasks with no project |
| Today, This Evening, Upcoming | The same day (and evening). Today items from earlier days come in for today, not as overdue |
| Anytime / Someday | No day / Someday |
| Deadline, reminder time | Deadline, time of day |
| Repeating to-do | The same repeat when it's daily, weekdays, weekly, every 2 weeks, monthly or yearly; other patterns come once, with a note |
| Tags | #tags on the task |
| Logbook | Done tasks: lit windows in your city |
Trashed to-dos stay behind. Can't find your library? Click Choose the database myself…: in Finder, Go → Go to Folder… ~/Library/Group Containers/JLMPQHK86H.com.culturedcode.ThingsMac, open the ThingsData-… folder and pick Things Database.thingsdatabase. If macOS blocks it, give TodoCity Full Disk Access in System Settings → Privacy & Security, or copy that folder to your Desktop and choose the copy.
Settings → Import Data → Todoist brings your Todoist into TodoCity. Todoist isn't changed, so you can keep using it while you try TodoCity.
No token? Export each project with ⋯ → Export as CSV in Todoist (or, on Pro, download a backup from Settings → Backups and unzip it), then choose No token? Use CSV files instead and pick all the .csv files. CSV exports carry your open tasks; connect with a token to bring completed ones too.
| Todoist | TodoCity |
|---|---|
| Project (and sub-projects) | Project |
| Inbox | Tasks with no project |
| Section | Section |
| Task | Task |
| Sub-tasks, any depth | Sub-tasks |
| Labels | #tags on the task |
| Priority 1–3 | Priority P1–P3 |
| Description and comments | Notes |
| Date and time, deadline | Day and time, deadline |
| Recurring date | The same repeat when it's daily, weekdays, weekly, every 2 weeks, monthly or yearly; other patterns come once, with a note |
| Completed tasks | Done tasks: lit windows in your city |
Settings → Your other Macs keeps your tasks the same on, say, a work laptop and a personal one — even when the work Mac can't sign in to iCloud.
K7MX-4QRB for 10 minutes.From then on, changes on either Mac show up on the other within about 30 seconds while both are open; a Mac that was asleep or offline catches up within a minute of coming back. Add more Macs the same way.
How it stays private. Your Macs share a key that is made on your Mac, handed over only inside the pairing (sealed with a secret the two Macs work out together) and kept in your Keychain. Every change is locked with it (ChaCha20-Poly1305) before it leaves. In between sits a small relay (relay/) that holds the sealed boxes until your other Macs pick them up and then deletes them — after 30 days at the latest. It never has the key, so it can't read task titles, notes, projects or Mac names, and there's no account behind it.
TodoCity-macOS.dmg.There's nothing else to install. TodoCity opens at login and updates itself — look for Restart to update when a new version is ready.
Verify your download (optional). Every release is built by this repository's public release workflow and carries a signed build-provenance attestation. With the GitHub CLI:
gh attestation verify ~/Downloads/TodoCity-macOS.dmg --repo pillieshwar/TodoCity
Anywhere on your Mac — change them in Settings → Capture & shortcuts:
| Shortcut | Action |
|---|---|
| ⌘C ⌘C | Capture what you just copied (copy, then press ⌘C again) |
| ⇧⌘S | Capture the selected text as a task (when you choose a shortcut instead) |
| ⇧⌘Space | Quick add — type a task |
| ⇧⌘H | Show or hide TodoCity (handy over full-screen apps, where the menu bar is hidden) |
In the task list — press ? to see them in the app:
| Key | Action | Key | Action |
|---|---|---|---|
| ↑ ↓ | Move between tasks | T / M / W | Move to today / tomorrow / next week |
| Space | Complete | S | Snooze |
| E | Edit title | N | Edit description |
| D | Change date and time | O | Open the source |
| F | Today ↔ Anytime | ⌫ | Delete |
| /, ⌘F or ⌘K | Search | ⌘Z | Undo |
| C | Sub-tasks (checklist) | P | Move to a project |
| V | Today as a list or in hours | A | Add a task |
| ⌃⌘F | Full screen ↔ side panel | ⌘\ | Show or hide the sidebar (full screen) |
127.0.0.1, with a random port and key for each session.~/Library/Application Support/TodoCity/ (Settings → Backups & export → Show data folder), with seven days of backups in backups/.select text ─▶ read selection ─▶ local model ─▶ resolve the date ─▶ you confirm ─▶ SQLite ─▶ reminder
Accessibility, JSON-schema in code, against Return to save
clipboard fallback constrained today's real date
src-tauri/src/capture/) reads the selection with macOS Accessibility (AXSelectedText). If an app doesn't expose it, TodoCity sends Copy and restores your clipboard afterwards — only if nothing else wrote to it in the meantime, and never when it holds images or files. Add to TodoCity in the right-click menu receives the text directly from macOS and doesn't touch the clipboard at all.src-tauri/src/engine.rs, crates/todocity-core/src/llm.rs) starts the bundled llama-server on demand and asks for exactly three fields — task, date_text and date_confidence — under a JSON Schema at temperature 0. Output is validated in Rust, with one repair retry. The runtime stops after five idle minutes to give the memory back.src/lib/dates.ts, src/lib/schedule.ts): the model only copies the phrase; deterministic code turns it into a day, time and repeat rule. Ambiguous phrases ("next Friday" on a Tuesday, 3/4) offer both readings.crates/todocity-core/src/store.rs, src-tauri/src/notifications/) keeps tasks in SQLite and shows native notifications with actions when they're due.Selected text is treated as untrusted input: it's wrapped and sanitized as data, instructions live only in the system prompt, and the strict schema means the most any text can do is suggest a task, which you review.
Prerequisites: Rust (stable), Node 20+, CMake and the Tauri prerequisites (xcode-select --install on macOS).
git clone https://github.com/pillieshwar/TodoCity.git && cd TodoCity
npm install
scripts/build-llama-server.sh # build the bundled model runtime once (a few minutes)
npm run tauri dev # run in development
npm run tauri build # TodoCity.app and a .dmg in target/release/bundle/
During tauri dev, macOS grants Accessibility permission to your terminal, not to TodoCity. To use an existing Ollama instead of the bundled runtime, set PLUCK_OLLAMA_URL=http://127.0.0.1:11434 (and optionally PLUCK_MODEL).
Tests
cargo test --workspace # schema, prompt, retries, downloads, clipboard guard, store, sync, shortcuts
npm test # date, time and repeat parsing, quick add, due chips, search and tags
crates/todocity-core/ Platform-independent Rust: prompt and schema, model clients, verified downloads,
clipboard guard, SQLite store, recurrence, Reminders sync logic, Mac-to-Mac sync
src-tauri/ Tauri v2 shell: menu bar, shortcuts, windows, capture, notifications, updates
src/ React + TypeScript UI: task panel, menu-bar popover, quick add; src/lib holds the logic
relay/ The sync relay: a Cloudflare Worker that stores and forwards sealed boxes
scripts/ llama-server build, icon rendering, UI preview screenshots
Built with Tauri 2, Rust, React and TypeScript, llama.cpp and SQLite.
| Problem | Fix |
|---|---|
| ⌘C twice does nothing | Check that Settings → Capture & shortcuts → Press ⌘C twice to capture is on and the TodoCity icon is in the menu bar. Copies made inside TodoCity itself are ignored. |
| ⇧⌘S does nothing | Check that the TodoCity icon is in the menu bar and Accessibility is allowed. If another app uses the same shortcut, pick a new one in Settings → Capture & shortcuts. |
| "Select some text first" | Select the text again, then press the shortcut. Password fields always stay private. |
| Add to TodoCity isn't in the right-click menu | Open TodoCity from Applications once, then log out and back in. You can also enable it in System Settings → Keyboard → Keyboard Shortcuts → Services → Text. Some apps list it under Services. |
| No reminders appear | Settings → Notifications shows whether they're allowed and can send a test notification. |
| Accessibility is asked for again after an update | In Privacy & Security → Accessibility, remove TodoCity with –, then capture again and re-allow it. |
| The menu-bar icon is somewhere you don't want it | Hold ⌘ and drag it. macOS remembers the spot, including across updates. TodoCity starts next to the battery, but never moves the icon again after that. |
| Something else | Settings → Help → Log file opens TodoCity's log. It stays on your Mac — attach it to an issue. |
Quit TodoCity from its menu-bar icon, move it from Applications to the Bin and remove it from Privacy & Security → Accessibility. To delete your tasks and models too:
rm -rf ~/Library/Application\ Support/TodoCity ~/Library/Application\ Support/app.pluck.desktop
If you used sync, turn it off first (Settings → Your other Macs), or delete the "app.todocity.sync" item in Keychain Access afterwards.
Bug reports, ideas and pull requests are welcome.
cargo test --workspace and npm test before opening a pull request. CI builds the app on macOS and Windows and runs the security checks. Commit Cargo.lock and package-lock.json changes along with the dependency change that caused them.By opening a pull request, you agree that your contribution is shared under this project's license, and that the project's author may also use it under other terms.
Maintainers: releases are cut from Actions → Release → Run workflow after bumping version in package.json, src-tauri/tauri.conf.json and Cargo.toml. The workflow builds a universal .dmg, signs the update archive and publishes latest.json for in-app updates.
Found a vulnerability? Please report it privately — see SECURITY.md. Dependencies are locked (Cargo.lock, package-lock.json), updated weekly by Dependabot, and checked on every pull request by cargo-deny, npm audit, OSV-Scanner and zizmor.
🔒 Source-available, non-commercial. TodoCity is free, and its code is open to read, change and share for personal and other non-commercial use under the PolyForm Noncommercial License 1.0.0. Commercial use is not allowed — that includes selling the app, a modified version, or a paid service built on it. Contributions are welcome and are shared under the same terms.
Copyright © 2026 Eshwar Pilli. All rights not granted by the license are reserved. Want to use it commercially? Open an issue to ask.