While I was heads-down sending PRs to Odysseus, I had a side project running in parallel: PinedIn, a task app built on one specific complaint I had with every other task manager I’d tried — they all live in a tab, and tabs are exactly the thing I forget to check.
The actual problem
Todoist, Notion, whatever — they’re all genuinely good apps. But they share one flaw for someone like me: the task list only exists when you go looking for it. Switch to a game, open a different window, get pulled into something else, and the task list is gone until you remember it exists. I didn’t need a better list. I needed something that couldn’t disappear.
So PinedIn’s core idea is simple: tasks render as floating cards that sit above every other window on your system — games, video players, IDEs, anything — using OS-level always-on-top windows rather than browser notifications. Hit a global hotkey (Ctrl+Shift+Space) from literally anywhere and a card appears in seconds.
Why Tauri instead of Electron
For an app whose entire pitch is “lightweight and always running in the background,” Electron was a non-starter. A 150–400 MB app idling at 2–5% CPU just to show me a floating card felt backwards. So I built it with Tauri and Rust instead — the binary is about 8 MB, and the app sits around 12 MB of RAM at idle instead of the hundreds Electron apps typically use. Tauri renders the UI with the OS’s native webview rather than bundling a whole Chromium instance, which is where most of that savings comes from.
The stack under the hood:
- Tauri + Rust — the shell, window management, and always-on-top behavior
- React + TypeScript — the actual card and settings UI
- Zustand — state management for tasks and workspaces
- SQLite — a single local
.dbfile, no server, no account, no sync
That last point matters as much as the performance one. PinedIn makes zero network requests except an optional GitHub Releases check for updates — everything else lives in a SQLite file on your machine.
Designing urgency that can’t be talked down
The part I spent the most time on wasn’t the floating window — it was making urgency levels behave differently instead of just looking different. PinedIn has three: Critical, Medium, and Low. A Medium task lets you snooze indefinitely. A Critical task doesn’t:
Critical task snoozed once → Snooze button still available
Critical task snoozed twice → Snooze button disappears
→ "Done" is the only option left
That’s a deliberate design choice, not a missing feature. If everything can be snoozed forever, “critical” stops meaning anything — so Critical tasks are built to run out of ways to avoid them. Time-boxed tasks reinforce this visually too: a progress bar drains in real time, shifting white → amber → red → flashing red, and fires an OS notification at zero regardless of whether the app window has focus.
Workspaces, and keeping the common case simple
Since I use this for actual work as well as personal stuff, PinedIn supports Workspaces — separate task lists for work, personal projects, or whatever split makes sense, switchable from the settings panel with each workspace keeping its own floating cards. But the card itself stays collapsed by default, showing just the task name and urgency badge, glanceable in under a second — full context only shows up if you actually open it. Getting that balance right (rich when you need it, invisible when you don’t) took more iteration than the always-on-top window logic did.
What’s next
macOS support is currently in preview, and Linux users need GDK_BACKEND=x11 for the moment since full Wayland support isn’t there yet — that’s the next thing on the list. A portable, installer-free build is planned too, since right now the Windows build needs the installer to register the system tray icon and startup entry.
If you want to try it, it’s free with no account required — pinedin.vercel.app has downloads for Windows, macOS, and Linux.