PomoDeck — Focus you can feel.
Inspiration
We've all been there. You open a browser tab for "quick research" and surface 45 minutes later deep in a YouTube rabbit hole. Pomodoro apps exist — dozens of them — but they all live on the same screen that's distracting you. They're a notification you dismiss, a tab you forget, a phone timer you ignore.
Then we looked at the Logitech MX Creative Console sitting on the desk. Physical buttons. An LCD touchscreen. A dial. Haptic feedback on the MX Master 4. What if the Pomodoro timer wasn't on your screen at all? What if it was a physical object you could touch, twist, and feel? What if your hardware could actually enforce focus — not just remind you about it?
That's PomoDeck. A Pomodoro timer that lives in your hands, not in your browser. The console becomes a focus coach: color-coded phases you see at a glance, a dial you twist to set your rhythm, a haptic pulse that tells your body it's break time before your eyes even leave the code. And when you're in the zone, distracting apps simply vanish.
We were inspired by the physicality of kitchen timers — the original Pomodoro was a tomato-shaped kitchen timer, after all. PomoDeck brings that tactile, analog feeling back to productivity, powered by modern hardware.
What it does
PomoDeck transforms the Logitech MX Creative Console (and MX Master 4 with Actions Ring) into a dedicated, physical Pomodoro focus station. Here's the full experience:
The Timer Display
The center LCD button becomes a live countdown clock. Deep red background during focus (🍅), calming green during short breaks (☕), ocean blue during long breaks (🌴). The display updates every second with smooth color transitions between phases. An animated progress ring fills around the countdown as time passes, giving you an instant visual sense of where you are in the session — no reading required.
Physical Controls
- Start/Pause button — one tap. No menus, no clicks, no finding the right window. Just press.
- Dial rotation — twist to adjust session duration from 1 to 120 minutes. The encoder display shows the value updating in real-time. Only works when the timer is stopped, so you can't accidentally change it mid-focus.
- Dial press — press the encoder to start/pause (same as the button — two ways to control, zero friction).
- Skip button — jump to the next phase when you're ready early.
- Reset button — start the current phase over.
Multistate Phase Cycling
A dedicated phase button cycles through Work → Short Break → Long Break with distinct visual states. Each state has its own icon, color scheme, and label rendered directly on the LCD. The button physically shows you which mode you're in — no guessing.
Haptic Feedback (MX Master 4)
This is where PomoDeck gets physical:
- Timer complete →
fireworkwaveform — a celebratory multi-burst pattern. You feel it in your hand. Session done. - Session start →
sharp_collision— a crisp, decisive tap. You're in the zone. - Session pause →
subtle_collision— a gentle nudge. Taking a breather. - Mode switch →
damp_state_change— a smooth transition feel. New phase, new energy. - App blocked →
knock— a firm repetitive tap. "Nope, not now."
You can literally feel your productivity rhythm through the mouse.
App Blocking
Toggle a shield button to enable focus enforcement. During work sessions, PomoDeck monitors the foreground window and automatically minimizes distracting apps — Chrome, Discord, Slack, Spotify, Twitter, or any custom list you define. A haptic knock confirms the block. During breaks, everything unlocks. It's not a blunt website blocker — it's context-aware and phase-aware.
Session Tracking
A stats button shows your completed pomodoros as a row of 🍅 emojis rendered on the LCD. Simple, visual, satisfying. Watch them accumulate through the day.
Animated Icon Transitions
When phases change, button icons don't just swap — they transition. The timer display smoothly shifts background color from red to green (or blue) over multiple frames. The phase emoji scales up briefly on transition, creating a "pulse" effect. Button state changes use frame-based animation sequences rendered through BitmapBuilder, making the hardware feel alive rather than static.
Action Editor Settings
A full configuration UI built with the SDK's Action Editor system:
- Sliders for work duration (1–120 min), short break (1–30 min), long break (1–60 min)
- Slider for sessions-before-long-break (2–10)
- Checkbox to enable/disable app blocking
- Text field for custom blocked app list (comma-separated process names)
- All settings persist across sessions via the SDK's encrypted plugin settings
Dynamic Folder
The complete PomoDeck experience lives in a Dynamic Folder — a dedicated workspace on the device with all controls laid out:
[Back] [Timer Display] [Skip]
[Start/Pause] [Reset] [Block Toggle]
[Stats]
Encoder: Duration adjustment + start/pause on press.
Standalone Actions
Every control is also available as an individual action that users can drag onto any button or dial outside the folder. Mix PomoDeck controls into your existing layouts — put the timer display on one button of your Premiere Pro profile, the start/pause on another. Total flexibility.
How we built it
PomoDeck is a pure C# plugin built on the Logi Actions SDK (.NET 8), with no external dependencies beyond the SDK itself.
Architecture:
PomodoroTimer— the core engine. ASystem.Timers.Timerticking every second, managing phase state machine (Work → Short Break → Long Break → Work), countdown logic, session counting, and duration adjustment. Clean event-driven design withTick,PhaseCompleted, andPhaseChangedevents.AppBlocker— a lightweight P/Invoke-based monitor. UsesGetForegroundWindow+GetWindowThreadProcessIdto detect the active app, andShowWindow(SW_MINIMIZE)to dismiss distractors. Polls every 1.5 seconds — low overhead, high effectiveness.PomodoroDynamicFolder— the control surface. Renders all LCD buttons viaBitmapBuilderwith phase-specific color palettes. Handles button presses, dial rotation, encoder press, and touch events. Subscribes to timer events for live updates.StartPauseCommand/PhaseCommand—PluginMultistateDynamicCommandimplementations with 3 visual states each, rendered with distinct colors and icons per state.TimerDisplayCommand— aPluginDynamicCommandthat redraws every second viaActionImageChanged(), creating a live countdown on any button.DurationAdjustment— aPluginDynamicAdjustmentfor the dial, withAdjustmentValueChanged()updating the encoder display in real-time.PomodoroSettingsCommand— anActionEditorCommandwith sliders, checkboxes, and text input for full configuration via the Options+ UI.
SDK features used:
PluginDynamicFolderwith custom navigation, button/encoder/touch layoutPluginMultistateDynamicCommandfor phase and start/pause statesBitmapBuilderfor per-pixel LCD rendering with color, text, and emojiPluginDynamicAdjustmentfor dial control with live value displayActionEditorCommandwith sliders, checkboxes, and text controls- Plugin Events system for haptic feedback (5 distinct waveforms mapped to MX Master 4)
SetPluginSetting/TryGetPluginSettingfor persistent encrypted settings- Event source YAML + waveform mapping YAML for haptic configuration
- Icon templates and action symbols for Marketplace-ready presentation
Design philosophy: Zero external dependencies. No AI, no servers, no network calls. PomoDeck is a self-contained, offline-first plugin that works the instant you install it. The entire codebase is ~600 lines of focused C#.
Challenges we ran into
The "feel" problem. Choosing the right haptic waveform for each event took real thought. firework for timer completion feels celebratory — but is it too much for the 12th pomodoro of the day? knock for app blocking feels authoritative — but is it annoying? We mapped and remapped waveforms to find the right emotional tone for each interaction. Haptics aren't just feedback — they're the plugin's personality.
Animation on constrained hardware. The LCD buttons aren't a 60fps display. Every frame is a full BitmapBuilder render cycle pushed through ActionImageChanged(). We had to balance visual richness (smooth color transitions, progress indicators) against update frequency. Ticking every second is the sweet spot — fast enough to feel live, slow enough to not overwhelm the rendering pipeline.
App blocking ethics. How aggressive should focus enforcement be? We landed on "minimize, don't kill" — the app is still running, your work isn't lost, but it's out of sight. And blocking only happens during work phases with an explicit toggle. The user is always in control.
The Loupedeck.PluginApi NuGet puzzle. The SDK package isn't on nuget.org — it's provided through LogiPluginTool's local NuGet feed. We built the entire plugin against the SDK documentation, writing every API call, every override, every BitmapBuilder render from docs alone. The code is structurally complete and ready to compile the moment LogiPluginTool is installed.
Dial UX decisions. Should the dial adjust duration while the timer is running? We said no — accidentally bumping the dial mid-focus and changing your 25-minute session to 3 minutes would be terrible UX. The dial locks during active sessions and only responds when stopped. Small decision, big impact on trust.
Accomplishments that we're proud of
It's a complete product, not a demo. PomoDeck isn't a proof-of-concept with one button. It has 6 distinct actions, a full dynamic folder layout, persistent settings, an Action Editor configuration UI, haptic feedback on 5 event types, app blocking with a customizable blocklist, session tracking, multistate buttons, and animated LCD rendering. It's Marketplace-ready.
The haptic story. Most plugins treat haptics as an afterthought — a generic buzz on button press. PomoDeck uses 5 different waveforms mapped to specific emotional moments. You can close your eyes and know exactly what just happened from the feel alone. That's the experience we wanted.
Zero dependencies. No Python server. No API keys. No internet connection. No configuration wizard. Install → open folder → press start. That's it. The simplest possible onboarding for the most complete possible feature set.
Every SDK surface used meaningfully. Dynamic Folders, multistate commands, adjustments, Action Editor with sliders/checkboxes/text, BitmapBuilder rendering, haptic events with YAML mapping, persistent settings, touch button images, encoder value display. We didn't use features to check boxes — each one solves a real UX problem.
The blocking toggle. One button to flip between "focus enforced" and "free browsing." It's visible on the device at all times — you always know if blocking is active. No hidden settings, no surprises.
What we learned
Hardware UX is fundamentally different from screen UX. On a screen, you can show a tooltip, a hover state, a modal. On a 4x3 grid of 80x80px LCD buttons, every pixel matters. We learned to communicate state through color (red = work, green = break, blue = long break) rather than text, because color is processed instantly. The emoji icons (🍅☕🌴) became our visual language.
Haptics are an underused superpower. Before this project, we thought of haptics as "vibration on/off." The Logi Actions SDK offers 15+ distinct waveforms, each with a different character. Using them intentionally — firework for celebration, knock for enforcement, subtle_collision for gentle pauses — creates an emotional layer that screens simply can't deliver.
The Pomodoro technique works better when it's physical. There's something about pressing a real button to start a focus session that creates more commitment than clicking a browser tab. The physicality of the dial, the visible countdown on the hardware, the haptic pulse in your hand — it engages more senses, which means more presence.
Plugin settings persistence is powerful. The SDK's SetPluginSetting / TryGetPluginSetting with encrypted local storage means users configure once and forget. Durations, blocked apps, preferences — everything survives restarts, updates, and device reconnections.
What's next for PomoDeck
Animated progress ring. Replace the static emoji at the bottom of the timer display with a circular progress indicator that fills as time passes — rendered frame-by-frame via BitmapBuilder. Visual completion feedback without reading numbers.
Daily/weekly stats page. A second dynamic folder page showing today's pomodoro count, total focus hours, streak counter, and a mini bar chart of the week — all rendered on LCD buttons. Gamification that lives on the hardware.
Sound alerts. Optional audio cues alongside haptics — a gentle chime for break time, a focused tone for work start. Using the system audio APIs already available in .NET.
Smart break suggestions. During long breaks, surface contextual buttons: "Stretch reminder," "Water break," "Eye rest (20-20-20 rule)." Each with its own icon and haptic pattern.
Team sync mode. For co-located teams, a shared Pomodoro session where multiple devices sync their timers via local network broadcast. Everyone starts and breaks together. The ultimate pair programming tool.
Loupedeck CT/Live optimized layouts. Device-specific layouts that take advantage of the CT's larger button grid and additional encoders — dedicated dials for work duration and break duration simultaneously.
Marketplace launch. Package as .lplug4, submit to the Logitech Marketplace, and bring tactile focus to every MX Creative Console user worldwide.
PomoDeck — Focus you can feel. 🍅
Log in or sign up for Devpost to join the conversation.