Config now uses top-level dark/light sections (each with running/completed
styles) and a theme option ("dark", "light", "auto"). The daemon resolves
the active theme at flash time via NSApp.effectiveAppearance().
Made-with: Cursor
- Add MIT LICENSE
- Polish README: tagline, permissions docs, clone URL
- Add license, authors, readme, and repository URL to pyproject.toml
- Remove stale docs/plans/ (relocated to .cursor/) and requirements.txt
- Deduplicate and clean up .gitignore
Made-with: Cursor
Major changes:
- Add StyleConfig dataclass with independent color, width, opacity,
duration, pulse_speed, sound, and volume per mode (running/completed)
- Replace flat flash_*/sound_*/play_on config with running: and
completed: YAML sections
- Replace CGEventTap (silently fails in forked daemon) with
CGEventSourceSecondsSinceLastEventType polling for reliable
input-based pulse dismissal when Cursor is already frontmost
- Update overlay, sound, and daemon to pass StyleConfig per call
- Rewrite tests for new config shape and dismiss mechanism
Made-with: Cursor
- Added pyobjc-framework-ApplicationServices to dependencies (was
implicitly available via pyenv's system packages but missing in
clean venvs)
- Added `cursor-flasher check` command that verifies Cursor is running
and accessibility permissions are working
- Detector now logs a warning when a11y tree reads fail (previously
failed silently, making permission issues invisible)
- Switched to uv for dependency management: `uv sync` + `uv run`
- Updated README with uv-based workflow and accessibility
troubleshooting guide
Made-with: Cursor