Note: This project was built during a hackathon! 🚀
SillyPult is a local macOS MVP where the catapult is the notification channel: any detected macOS notification can trigger it. Focus mode is an optional toggle that switches the helper into work-only notification filtering, and Chrome distraction handling is layered on top of that focused state.
control-panel/: Next.js dashboard, settings editor, helper lifecycle UI, test toolshelper/: Swift helper that captures notifications, stores state in SQLite, evaluates rules, and drives the host-side activation flowchrome-extension/: Chrome MV3 extension that posts active-domain updates to the helperfirmware/: ESP32 catapult controller with WiFi HTTP control
Run the control panel:
npm run dev:panelRun the helper directly:
npm run dev:helperIf the ESP32 is reachable over WiFi, the helper defaults to the firmware mDNS
hostname. Override it only if your network cannot resolve sillypult.local:
export SILLYPULT_FIRMWARE_HOST=sillypult.local
export SILLYPULT_FIRMWARE_PORT=80
export SILLYPULT_FIRMWARE_TIMEOUT_SECONDS=30Set the station-mode WiFi credentials directly in firmware/src/main.cpp
before flashing the ESP32.
Helper tests:
npm run test:helperControl panel lint/build:
npm run lint:panel
npm run build:panelLoad chrome-extension/ as an unpacked extension in Chrome. It reports active
tab domains to http://127.0.0.1:42424/api/browser-activity, which the helper
uses for focus-mode distraction events.
- Live macOS notification capture is best effort and currently keyed off
usernotificationsdcreate events in the system log. - Default behavior is
any notification triggers. - Focus mode is a manual toggle in the control panel.
- Test notifications emit a macOS toast and then mirror into the same helper rules engine, including the focus filter when active.
- Firmware launches are sent over WiFi as
POST /launch. - Completion is tracked by polling
GET /statusuntilready: true. - Firmware advertises itself on the local network as
http://sillypult.local/. - Helper stdout now emits
[FIRMWARE]logs when commands are sent to the ESP32, when HTTP responses arrive, and while readiness is being polled. - Local helper data is stored in
~/Library/Application Support/SillyPult/.
- Firmware and 3D Modeling: I wrote the C++ firmware for the ESP32 and designed the 3D models for the physical catapult.

