Calm Eye Care
Low-strain color themes plus a customizable, activity-aware break reminder — two
tools for more comfortable, longer coding sessions in VS Code and Kiro.
Features
Themes
Two themes designed to reduce eye strain: no pure black or white, warm
desaturated colors, and syntax distinguished by hue rather than harsh contrast.
- Calm Dark — a warm, muted dark theme.
- Calm Paper (Light) — an easy, paper-like light theme.
Pick one with Ctrl/Cmd+K Ctrl/Cmd+T, then choose "Calm Dark" or
"Calm Paper (Light)".
Break reminder
Tracks how long you've been actively typing and navigating (not just how long
the editor has been open) and nudges you to look away and stretch.
- Live countdown in the status bar (bottom right).
- Idle detection: short pauses stop the timer, and a longer absence counts as a
real break and resets the timer, so reminders reflect actual screen time.
- Choose how you're nudged: a standard or prominent notification, a quiet status
bar flash, or a translucent editor flash — no sound.
- Snooze, quiet hours, and a master on/off switch.
- Synced across windows: one shared timer across every window of the app, so
splitting work between windows still counts as continuous time and the
reminder fires once. Can be turned off for independent per-window timers.
Settings
Search "Calm Eye Care" in the Settings UI, or edit settings.json.
| Setting |
Default |
What it does |
calmEyeCare.enabled |
true |
Master on/off switch for break reminders. |
calmEyeCare.intervalMinutes |
60 |
Continuous active minutes before a reminder fires (minimum 30). |
calmEyeCare.idleThresholdMinutes |
3 |
No-activity minutes after which the timer pauses. |
calmEyeCare.resetAfterBreakMinutes |
5 |
Idle minutes that count as a real break and reset the timer to zero. |
calmEyeCare.snoozeMinutes |
10 |
Snooze length when you click "Snooze". |
calmEyeCare.quietHoursStart |
"" |
e.g. 22:00 — suppress reminders from this time. |
calmEyeCare.quietHoursEnd |
"" |
e.g. 07:00 — end of quiet hours (wraps past midnight). |
calmEyeCare.notificationStyle |
"information" |
How the reminder appears: information, warning, statusBarFlash, or editorFlash. |
calmEyeCare.statusBarFlashCount |
4 |
Flashes for the statusBarFlash style. |
calmEyeCare.editorFlashColor |
"rgba(212, 167, 106, 0.22)" |
Overlay color for the editorFlash style (use a translucent color). |
calmEyeCare.editorFlashCount |
3 |
Flashes for the editorFlash style. |
calmEyeCare.editorFlashUntilDismissed |
false |
Keep the editorFlash pulsing until you return to typing, click the status bar, or dismiss it. |
calmEyeCare.syncAcrossWindows |
true |
Share one break timer across all windows of the app. |
calmEyeCare.showReminderInAllWindows |
true |
When synced, show the reminder in every window (else only the timer-owning window). |
Commands
Open the Command Palette (Ctrl/Cmd+Shift+P) and search for:
- Calm Eye Care: Pause Break Reminders
- Calm Eye Care: Resume Break Reminders
- Calm Eye Care: Take a Break Now
- Calm Eye Care: Dismiss Break Flash — stop a persistent
editorFlash reminder
With syncAcrossWindows on, pause, resume, snooze, and "take a break" apply to
every window at once. A $(link) icon in the status bar countdown indicates the
timer is shared.
How window sync works
The timer state is kept in a small JSON file in the extension's global storage.
One window "leads" (advances the timer and decides when to fire); the others
report activity and mirror the shared countdown. If the leading window closes,
another takes over automatically. Sync is per-app, so VS Code and Kiro keep
separate timers.
Install
- From a marketplace: search for "Calm Eye Care" in the Extensions view
(VS Code Marketplace) or Kiro's Open VSX gallery.
- From a
.vsix: Extensions view → ... menu → "Install from VSIX..." →
pick the file.
Development
Requires Node.js. The extension is written in TypeScript under src/ and
compiled to out/.
npm install # install dependencies
npm run compile # build once (tsc)
npm run watch # rebuild on change
npm test # run the unit tests (node --test)
npm run package # produce calm-eye-care-<version>.vsix
To try it live, open this folder in VS Code or Kiro and press F5 to launch an
Extension Development Host with the extension loaded.
The timer logic is split into small, testable pieces:
src/configTypes.ts — settings types and the quiet-hours helper (no vscode).
src/timerCore.ts — pure timer advance/fire logic.
src/timerStore.ts — local and shared (cross-window) state stores.
src/breakReminder.ts — the UI layer (status bar, notifications, flashes).
Unit tests for the timer core and the shared store live in src/test/.
Publishing
Releases are automated by GitHub Actions: pushing a v* tag builds the .vsix,
publishes to Open VSX (for Kiro and other VS Code forks) and the VS Code
Marketplace, and attaches the .vsix to a GitHub Release. Publishing steps run
only when the OVSX_PAT and VSCE_PAT repository secrets are configured.
To publish manually:
npm run package
npm run publish:ovsx # Open VSX (requires OVSX_PAT)
npm run publish:vscode # VS Code Marketplace (requires VSCE_PAT)
Customizing
- Colors: edit the files in
themes/. Each key follows VS Code's
theme color reference.
Use "Developer: Inspect Editor Tokens and Scopes" to find the scope for any
token you want to recolor.
- Reminder behavior: the logic lives in
src/breakReminder.ts and
src/config.ts.
License
MIT