Somewhere between debugging a Rust backend at 1am, reading through a codebase with hundreds of contributors to find one stale header bug, and rebuilding a feature from scratch because the first version wasn’t good enough — something shifted. I don’t feel like I’m just following tutorials or gluing things together anymore. I’m reading unfamiliar code and actually understanding why it’s built the way it is, making real architectural calls instead of guessing, and catching my own mistakes before they ship. It’s a strange, quiet kind of confidence. Not “I know everything” — more like “I know how to figure this out.” That’s the closest I’ve come to feeling like an actual engineer instead of someone who codes.
Which brings me to the latest round of work on PinedIn. It’s been a bit over a month since I first wrote about it, and it’s grown a lot since then — new features, a decent amount of debugging, and a couple of things I deliberately cut because they weren’t pulling their weight. Here’s what changed by v0.4.5.
Letting AI agents manage your tasks directly
The feature I’m most excited about is the new MCP server, running locally at 127.0.0.1:7890. If you’re using Claude Desktop, Cursor, or any other agent that speaks the Model Context Protocol, it can now add, list, and complete PinedIn tasks directly — no copy-pasting a to-do list into a chat window and back.
Since PinedIn already stores everything in a local SQLite file with no server or account, exposing an MCP server was mostly a matter of putting a thin protocol layer in front of the same task operations the UI already calls — create_task, list_tasks, complete_task — rather than building a second parallel API.
Compact mode and Zen mode
Floating cards are great until you have fifteen of them stacked on your screen. Compact mode collapses all of them into a single pill that cycles through your active tasks instead of tiling them individually — same always-on-top behavior, far less visual noise.
Zen mode (Ctrl+Shift+Z) goes the other direction: it hides the main window entirely while keeping the floating cards alive, for when you want the “unignorable” part of PinedIn without the full task-list UI sitting open.
Pre-scheduled tasks that actually catch up
You can now say “create this task at 3pm tomorrow” and it’ll surface as a floating card exactly when that time arrives — including if PinedIn wasn’t running yet. A background scheduler checks every 30 seconds and catches up on anything that should have fired while the app was closed, rather than silently missing it.
Time-limit bars replaced the old Remind feature
This is the biggest structural change. Earlier versions had a “remind me in X minutes” feature. I pulled it out completely — UI, backend command, MCP exposure, styling, all of it — and replaced it with time-limit bars: set a 30-minute limit on a task, and a real-time progress bar starts counting down from creation to due date. When it hits red, a notification fires.
The reasoning: “remind me later” is a way of deferring a decision, and PinedIn’s whole premise is that some tasks shouldn’t be deferrable. A countdown bar you can see ticking down in the corner of your screen does more to keep a deadline real than a notification that pops up once and then goes back to being invisible.
Daily Digest
On startup, PinedIn now opens a short summary automatically — something like “3 overdue, 2 due today, 5 active — you’re all caught up” — instead of making you open the task list to get your bearings for the day.
The less glamorous half: debugging
A decent chunk of this cycle was just fixing things that were quietly broken:
- QuickAdd had broken invoke calls — the quick-add shortcut was calling into the Rust backend incorrectly, so tasks created through it weren’t behaving like tasks created through the main UI. Fixed in one of the more recent commits, alongside making the window’s Min/Max/Close buttons properly circular instead of an inconsistent shape.
- Push notifications for the global hotkey were removed entirely. They were fighting with the system tray icon for the same job, so I dropped the notification path and let the tray be the single source of truth for background presence.
- Windows update metadata — added the missing
windows-x86_64entry tolatest.jsonso the auto-updater could actually find and offer the Windows build for the previous release. Small thing, but it meant Windows users weren’t getting update prompts at all until it was fixed.
What the floating card actually looks like under the hood
For anyone curious about the implementation: each card renders at a fixed SQUARE_SIZE of 80px in minimal mode, or 122×110 expanded, with drag-to-move triggered past a 6px movement threshold using Tauri’s startDragging():
const SQUARE_SIZE = 80;
const FULL_WIDTH = 122;
const FULL_HEIGHT = 110;
// drag handling — only start once movement exceeds a small threshold,
// so a click doesn't accidentally register as a drag
if (dragDistance > 6) {
appWindow.startDragging();
}
Each card also carries a live pulse animation, re-checked every 60 seconds, so a card sitting in your peripheral vision has a subtle heartbeat rather than looking static and easy to ignore.
What’s next
Onboarding got a five-step spotlight tour in this update too (Add Task → Task List → Toolbar → Settings → Finish), which has already surfaced a few UX rough edges I hadn’t noticed myself. Full Wayland support and a portable, installer-free build are still the two biggest open items.
If you want to see it in action, pinedin.vercel.app has the latest downloads, and the source for the MCP server and everything else is in the repo.
Looking back
Between this, the Odysseus contributions, and TRIX before it, this year has taught me more than any previous stretch of building things — Rust and Tauri internals, how a large open-source codebase actually gets reviewed, and just as importantly, when to cut a feature instead of forcing it to work. I’m looking forward to seeing where the next few months take this.