Inspiration

Remote collaboration is broken in one specific way: navigation control.

Every day, millions of remote workers sit on video calls saying "can you scroll up?", "go back to that slide", "zoom into that corner." The reviewer has zero control over what they're looking at. They're passengers, not participants.

Screen sharing solved visibility. But navigation? Still completely broken. We looked at the MX Creative Console — the precision ring, the tactile buttons, the Actions SDK — and realized this is the perfect physical interface to solve it.

What it does

SharedSession is a fully working Logitech Actions SDK plugin. The host presses one button on their MX Creative Console to start a session. A native Windows overlay appears with the session code and a shareable link (auto-copied to clipboard via ngrok tunnel). The reviewer clicks the link in any browser and instantly joins — no hardware, no install needed.

The reviewer uses a virtual ring in the browser (or keyboard W/A/S/D, scroll wheel, or touch gestures on mobile) to scroll, zoom, navigate, and highlight on the host's actual screen. Actions execute in real-time via WebSocket relay. A pop-out controller window lets the reviewer keep commands working even when they switch to Teams, Meet, or Zoom — the compact window maintains its own WebSocket connection independently of the main browser tab.

The host controls everything from the native overlay:

  • Permission levels — VIEW, NAVIGATE, PRESENT, MEDIA — changeable mid-session
  • Multi-reviewer support — up to 20 simultaneous reviewers
  • Per-reviewer enable/disable — one click to pause any reviewer's control
  • Max reviewers setting — adjustable from the overlay
  • Hide for screen sharing — overlay hides during Meet/Teams calls, toggle back with the MX button
  • End session confirmation — inline card with Cancel/End Session buttons prevents accidental termination

Destructive actions (edit, delete, type, run commands) are never allowed — enforced server-side in the permission engine.

How we built it

The entire system runs inside a single Logi Plugin Service process — no separate server, no terminal:

  • Embedded Relay Server: HTTP + WebSocket server starts automatically when the plugin loads, listening on localhost. Handles session management, permission validation, and real-time action relay. Serves the browser dashboard directly.
  • ngrok On-Demand: Public tunnel starts only when the host creates a session — not on plugin startup. The share link works worldwide.
  • Plugin Actions: Built with the Actions SDK — CommandAction for button presses (start session, navigate, highlight), AdjustmentAction for ring rotations (scroll, zoom). A PluginSyncBridge singleton connects to the embedded relay via WebSocket.
  • Native Windows Overlay: PowerShell + WPF pill bar with expandable settings panel, reviewer list with per-user enable/disable toggles, permission switcher, and inline end-session confirmation. Communicates with the plugin via file-based IPC (avoids stdin/stdout deadlocks with the WPF UI thread).
  • Permission Engine: Four scoped levels (VIEW, NAVIGATE, PRESENT, CONTROL_MEDIA) with a strict action-to-permission map. Validation happens server-side before any action reaches the host. Per-reviewer control toggling.
  • System Control: PowerShell scripts execute real keyboard/mouse actions (scroll via Win32 mouse_event, zoom via SendKeys, keystrokes for navigation) on the host machine.
  • Browser Dashboard: Particle background, virtual ring with directional segments, action grid, real-time feed, reviewer list management. Scroll wheel, Ctrl+zoom, and touch gestures are intercepted and forwarded as actions.
  • Pop-out Controller: Separate controller.html window with its own WebSocket connection and BroadcastChannel sync to the main tab. Stays active alongside video call apps.

Challenges we ran into

WPF overlay freezing — stdin/stdout pipes deadlocked the WPF UI thread. We switched to file-based IPC with temp files and polling at 200ms intervals, which solved it completely.

Duplicate session creation — rapid button presses on the MX Console created multiple sessions. Fixed with guards at three levels: the server returns the existing session if one is active, the bridge checks sessionCode before sending create_session, and the action checks if the overlay is alive before creating.

Session state surviving server restarts — the bridge kept stale session codes after WebSocket reconnection. Fixed by clearing sessionCode on the close event.

Pop-out controller losing connection — when the main browser tab went to background, the WebSocket would throttle. Solved by giving the pop-out its own independent WebSocket connection plus BroadcastChannel as a sync backup.

Accomplishments we're proud of

  • Zero-setup for reviewers — click a link, you're in. No install, no hardware, no account.
  • Pop-out controller — compact window stays active alongside Teams/Meet/Zoom with its own WebSocket.
  • The overlay — a native Windows pill bar with expandable settings, reviewer list with one-click enable/disable, permission switcher, hide for screen sharing, and inline end-session confirmation. All built in PowerShell + WPF.
  • Embedded server — the relay runs inside the plugin process. Users install the plugin and press a button. That's it.
  • Permission system — genuinely novel. No collaboration tool scopes physical device control this way.

What we learned

The Node.js Logi Actions SDK is alpha — some features (runtime button images, ActionTextChanged) aren't wired up yet. But the core architecture is solid. The separation of CommandAction and AdjustmentAction maps perfectly to the host/reviewer paradigm — buttons for discrete actions, ring for continuous control.

The biggest product insight: the best collaboration tools don't give everyone equal power — they give everyone the right power for their role.

What's next

  1. Per-application permission profiles — different defaults for VS Code vs Figma vs PowerPoint
  2. Haptic feedback — reviewer's device vibrates when action is received
  3. Cloud relay deployment — permanent hosted server, no ngrok dependency
  4. Enterprise features — team management, session analytics, admin-controlled policies

Built With

Share this project:

Updates