TomoBreak
A coding companion that cares about you and never breaks your flow.
A small animated buddy walks across your code editor and checks in when you take a natural pause. It might remind you to:
- drink water
- rest your eyes
- fix your posture
- stretch
It can also run Pomodoro sessions and teach you a new word. It reacts to your answers and to your coding, and it remembers how well you take care of yourself. It never appears while you are typing or debugging.
Getting started
- Install TomoBreak. The setup page opens automatically.
- Pick a character, the modes you want, and their intervals, then click Save.
- Keep coding. Your buddy waits for a natural pause before it shows up.
Run TomoBreak: Show Test Visit from the Command Palette (Ctrl+Shift+P) to see a visit right away.
Features
Your buddy
- Five original characters: a chubby hamster, a black kitten, a happy puppy, a little girl and a little boy. Each has 8 animated states.
- Two display styles (
tomobreak.display):
editor: walks over your code, with answer buttons right beside it.
panel: shows in the TomoBreak view in the Explorer or the bottom panel.
Never breaks your flow
Reminders wait for a natural pause:
- 20 seconds without typing
- a save
- a commit
- a finished task
- switching editor tabs
- coming back to the VS Code window, with a short delay first
Nothing appears while you type, while a debug session runs, during quiet hours or in Presentation mode. If no pause comes within 10 minutes, the buddy only peeks in from the edge and the status bar flashes until you click it. Visits are at least 5 minutes apart (or your shortest reminder interval, if that is shorter), and reminders that are due together are merged into one visit, such as "Water and a quick stretch?". With several VS Code windows open, only one of them shows the visit.
Wellness modes
| Mode |
Default |
What happens |
| 💧 Hydration |
every 45 min |
"Did you drink water?" Yes gets a happy dance |
| 👀 Eye break |
every 20 min |
Look 20 feet away, with a 20-second timer |
| 🪑 Posture |
every 45 min |
"Sit up straight with me!" with a quick posture checklist |
| 🤸 Stretch |
every 60 min |
A follow-me side stretch: your buddy leans left and right with you for 20 seconds |
| 🍅 Pomodoro |
25 / 5 min |
Reminders wait for your break and arrive together |
| 📖 Language learner |
every 30 min |
English (B2–C2) or Japanese (JLPT N5–N3) words |
Language learner
- Each word card shows the word, its part of speech, pronunciation, meaning, an example and a synonym. For Japanese it shows kanji, kana, romaji, an example and its translation.
- 🔊 reads the word aloud with your system's voices (hidden if none is installed).
- Answers:
- Got it saves the word.
- Already knew it means you never see it again.
- Saved words come back as quizzes after 1, 3, 7 and 21 days, with three possible meanings. A wrong answer starts the word over at the 1-day quiz. Passing the day-21 quiz marks it Mastered.
- The word bank has 300 English words and 200 Japanese words, all bundled. No word repeats until you have seen the whole level.
- TomoBreak: Open My Words lets you search everything you have seen, filter it by Learning or Mastered, and see totals.
Bond system
Affection (0–100, per character):
- Yes +5
- Snooze 0
- No −3
- No answer within 60 seconds −1
- Correct quiz +3
Affection never drops below 10. It sets your buddy's mood (thrilled, happy, okay or worried) and its resting expression. The buddy can get sad, but it never guilt-trips you.
Daily streaks per mode, for example 4 glasses of water a day (tomobreak.<mode>.dailyGoal).
Streak unlocks:
- 3 days: a new dance
- 7 days: an accessory
- 14 days: new dialogue
- 30 days: a special celebration
Weekly summary: on the first visit of each week, e.g. "You drank water 31 times this week. I'm proud of you!".
TomoBreak: Open Stats shows your mood, streaks and bar charts for the last 7 and 30 days (also available as a table).
Coding reactions
At most one reaction appears every 15 minutes, and reactions follow the same pause rules as reminders. You can turn each one off.
- Error storm: more than 10 errors gets "want to take a breath first?". Going from 10+ errors to zero gets a celebration.
- Builds and tests: a celebration when one passes, encouragement when one fails ("Bugs are just plot twists.").
- Commits: "First commit of the day!" and a happy nod every 5th commit.
- Late night: after 1 AM (configurable), "the bugs will still be here tomorrow. Sleep?"
- Long session: after 2 hours of coding without a 5-minute break, a stretch suggestion.
- Giant file: opening a file over 2,000 lines gets a playful joke, once per file per day.
Commands
| Command |
|
| TomoBreak: Toggle On/Off |
Turn everything on or off immediately |
| TomoBreak: Hide Buddy Now |
Ctrl+Alt+T (Cmd+Alt+T on Mac) |
| TomoBreak: Start Pomodoro / Stop Pomodoro |
|
| TomoBreak: Open Setup |
Character, modes, intervals, live preview |
| TomoBreak: Open Stats |
Mood, streaks, charts |
| TomoBreak: Open My Words |
Your vocabulary |
| TomoBreak: Show Test Visit |
See a visit now |
| TomoBreak: Presentation Mode (Pause 1 Hour / Resume) |
For screen sharing and demos |
| TomoBreak: Snooze All 30 Minutes |
|
Clicking the status bar item opens a quick menu. During a question in the editor, clicking it lets you answer with the keyboard instead.
Settings
Everything is under tomobreak.* in the Settings UI, and the setup page stays in sync with it.
| Setting |
Default |
tomobreak.enabled |
true |
tomobreak.display |
editor (panel) |
tomobreak.answerStyle |
beside (quickPick is best for keyboard and screen reader use) |
tomobreak.character |
girl |
tomobreak.<mode>.enabled / intervalMinutes / dailyGoal |
per mode, see the table above |
tomobreak.pomodoro.focusMinutes / breakMinutes |
25 / 5 |
tomobreak.language.language |
english (japanese, both) |
tomobreak.language.englishLevel |
C1 (B2 Medium, C2 Expert) |
tomobreak.language.japaneseLevel |
N5 (N4, N3) |
tomobreak.quietHours.enabled / start / end |
off / 22:00 / 07:00 |
tomobreak.reactions.<name> |
on (errorStorm, buildsAndTests, commits, lateNight, longSession, giantFile) |
tomobreak.reactions.lateNightHour |
1 |
Accessibility
- Every question can be answered with the keyboard. Set
tomobreak.answerStyle to quickPick, or click the status bar item during a question.
- Webviews have focusable buttons and a live-region speech bubble.
- Webviews respect reduce motion and use VS Code theme colors, so light, dark and high contrast themes all work.
- The stats charts can be shown as a table.
Privacy
TomoBreak makes no network requests and has no telemetry or analytics.
- It only notes that you typed, never what you typed. It never reads or stores file contents or file names. The one exception is a line count when you open a file, used for the giant-file joke, and the file is remembered only as an anonymous fingerprint in memory.
See PRIVACY.md for details.
Japanese word bank: entries to double-check
The Japanese entries were reviewed carefully, but JLPT lists have not been official since 2010, and some entries have accepted variants. These are the ones flagged for a native-speaker review:
- Kana vs. kanji spelling (both forms are standard):
- おいしい / 美味しい
- きれい / 綺麗
- 分かる / わかる
- 諦める / あきらめる
- 箸 is often written お箸.
- Reading variant: 寂しい (さびしい / さみしい).
- Spelling nuance: 貯める is the savings-specific spelling (溜める is the general one).
- JLPT level varies between lists:
- 自由
- 答え
- 比べる
- 過ぎる
- 祈る
- 別れる
- 守る
- 失敗
- 結果
- 将来
- 我慢
- 確か
- 突然
- Example sentences:
- 影響 ("影響を与えます" would be more natural).
- 公園 (uses を散歩します).
- 写真 (its example uses 撮る, a higher-level verb).
- 確か (its example uses the adverb sense).
- 喜ぶ (its example writes 子ども in mixed kana and kanji; 子供 is the other common spelling).
- 箸 and 橋 share the romaji hashi. Pitch accent is not shown.
Development
npm install
npm start # build and open a VS Code window with TomoBreak loaded
npm run compile # esbuild -> dist/extension.js and media/webview/*
npm run watch
npm run typecheck # tsc --noEmit for the extension and the webviews
npm run lint
npm test # Vitest unit tests for src/core
npm run package # vsce package -> tomobreak-<version>.vsix
Fast test mode: add "tomobreak.debug.fastIntervals": true to your settings.json. It makes:
- every interval 1 minute
- snoozes 1 minute
- the gap between visits 20 seconds
- word reviews 1, 3, 7 and 21 minutes
The setting is hidden on purpose, so VS Code marks it as unknown. The TomoBreak output channel logs every timing decision.
Run npm run generate:characters to regenerate the character SVGs.
License
All rights reserved. See LICENSE.
| |