Skip to content

Eyes-closed mode with stronger audio cues #35

Description

@marekkowalczyk

Problem

Sessions often work best with eyes closed (pre-sleep, low vision, face-down phone/laptop). Today the product is TUI-first: phase labels and progress bars carry the pacing. Audio exists (afplay system sounds, mute toggle) but is thin for eyes-closed use — easy to lose the inhale/exhale boundary without looking, and easy to react late when the only cue is the phase-change itself.

Scope

In:

  • An opt-in eyes-closed / audio-first mode for the CLI (flag and/or preset hook — exact surface TBD in implementation).
  • Stronger phase cues so inhale ↔ exhale is unmistakable by ear: distinct inhale vs exhale sounds, and/or opt-in spoken IN/OUT via macOS say (same non-blocking Popen pattern as afplay / caffeinate).
  • An anticipatory pre-beep shortly before the actual IN/OUT cue (lead time TBD; short enough not to feel like a third phase). Pre-beep = “get ready”; phase cue = “now.” That split is the load-bearing UX for eyes-closed pacing.
  • Keep the same safety envelope (no retention, cycle ≥ 8s, continuous in–out). Pre-beeps must not introduce a hold, pause phase, or any retention prompt.
  • Document how to enable it; q / Ctrl+C / finally terminal restore unchanged.

Out:

  • Session-end “reward” chime — #36.
  • Rewriting the TUI into a second visual chrome.
  • Night quieter defaults (#18) and night dimmer TUI (#17) — coordinate volume defaults but don’t merge scope.
  • iPhone app (#34) — separate product; this issue is CLI-only.
  • Non-macOS TTS stacks as a hard requirement (Linux/Windows remain soft-fail / community).

Proposal (starting point)

  • Opt-in flag (name TBD, e.g. --eyes-closed / --audio-first) that assumes the user is not watching the screen.
  • Optionally suppress or simplify visual urgency (dimmer labels, less progress chrome) while keeping enough state for sighted debugging.
  • Cue stack per phase boundary: pre-beep → (brief gap) → distinct IN or OUT cue (sound and/or say); non-blocking; must not stretch wall-clock phase timing into an unintended hold.
  • Interact cleanly with s mute and --no-sound (pre-beep and phase cues both silenced).

Acceptance

  • Opt-in path exists; default bare/--preset behaviour unchanged when not enabled.
  • With eyes closed, the user can hear both a short “ready” cue and a clear “now” IN/OUT cue at each phase boundary (manual macOS smoke).
  • Pre-beep does not add retention, a named hold phase, or a cycle shorter than the safety floor.
  • Mute / --no-sound silence pre-beep and phase cues; spoken path (if shipped) respects mute.
  • Safety rejections and terminal restore unchanged.
  • README notes the mode and that it is audio-oriented.

Constraints

Single-file, stdlib, macOS primary; no threading; audio must not block the render loop.

Related

  • Session completion chime: #36
  • iPhone idea: #34
  • Night quieter audio: #18
  • Night dimmer TUI: #17
  • Spec safety: no retention, cycle ≥ 8s, graceful exit (breathe-cli-spec.md §2).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions