Sip & Ship 💧
📖 Table of Contents
💡 Overview & Philosophy
Developers frequently experience deep coding flow states, often going hours without drinking water. Most reminder tools either open jarring popups that steal keyboard focus or require complex setups.
Sip & Ship was engineered around three strict principles:
- Zero Flow Interruption: No editor tabs open or switch. Your cursor stays on your active code line, allowing you to keep typing uninterrupted.
- Delightful Visuals: Dynamic animations with a cute companion that responds to your hydration milestones.
- Auditory & Status Awareness: A subtle, crisp bubble chime paired with an active status bar indicator so you always know your hydration progress at a glance.
📸 Visual Showcase & Screenshots
| 1. Idle Countdown Mode |
2. Time to Sip! (Reminder Popup) |
3. Drinking (Celebration Mode) |
 |
 |
 |
Status Bar countdown & idle hover card (drinkbro.gif) |
Active reminder & notification popup (splash.gif) |
Celebration & glass count update (drinking.gif) |
β¨ Key Features
- β±οΈ Configurable Hydration Intervals: Set reminders every 15, 20, 30, 45, or 60 minutes (or enter any custom minute duration).
- 🫧 Instant Zero-Latency Bubble Sound: Plays a gentle, satisfying bubble chime (
mixkit-liquid-bubble-3000.wav) the millisecond a reminder triggers.
- 📝 In-Editor Line Companion: A cute animated character peeks right beside the code line you are typing on for 3 seconds, then gracefully disappears.
- 💬 Actionable Notification Popups: Features direct
[ Drinking ] and [ Snooze 10m ] action buttons.
- 📊 Status Bar & Rich Hover Card: Real-time tracker (
β±οΈ 30m | 3 🥛) with an interactive Markdown hover card showcasing animations and stats.
- 🔥 Daily Streak Tracker: Automatically calculates consecutive days of logging water intake with midnight auto-resets.
- 🌟 Open-Ended Sips Tracking: No artificial glass limitsβtrack your actual daily and lifetime water intake.
🎬 Dynamic 3-GIF Visual Workflow
The companion dynamically shifts between three dedicated visual states:
- Idle State (
drinkbro.gif):
- Companion rests peacefully while counting down:
β±οΈ 28m | 3 🥛.
- Active Reminder State (
splash.gif):
- The bubble sound plays 🫧.
- Status bar updates to:
🌊 TIME TO SIP! | 3 🥛.
- In-editor line margin shows
splash.gif with 🌊 Sip your water & keep shipping! 💧.
- Notification toast pops up:
[ Drinking ] and [ Snooze 10m ].
- Celebration State (
drinking.gif):
- Clicking
Drinking records +1 glass, logs your streak, and displays celebratory status: β¨ Drinking! (+1) | 4 🥛.
- Resets the countdown timer fresh from that moment.
📐 Technical Architecture & Flowcharts
1. Workflow & State Flowchart
flowchart TD
A["β±οΈ Timer Countdown (e.g., 30m)"] --> B{"Reminder Due?"}
B -- "Yes" --> C["🔔 Trigger Reminder"]
C --> C1["🫧 Play Bubble Sound"]
C --> C2["📝 Show In-Editor Line Animation (3s)"]
C --> C3["💬 Pop Up Notification: [Drinking] / [Snooze 10m]"]
C --> C4["🌊 Update Status Bar: TIME TO SIP!"]
C3 --> D{"User Action"}
D -- "Clicks 'Drinking'" --> E["🎉 Celebrate & Log Sip"]
E --> E1["β¨ Show drinking.gif Animation (6s)"]
E --> E2["📈 Today's Count & Lifetime Total +1"]
E --> E3["🔥 Update Daily Streak Count"]
E --> E4["🔄 Restart 30m Countdown Timer"]
E4 --> A
D -- "Clicks 'Snooze 10m'" --> F["β° Snooze for 10 Minutes"]
F --> A
D -- "No Click / Ignored" --> G["👀 Keep Status Bar as 'TIME TO SIP!'"]
G --> H["Background timer keeps counting for next interval"]
H --> A
2. Component Architecture
graph TD
ExtEntry["extension.ts Entrypoint"] --> RemManager["ReminderManager"]
ExtEntry --> StorageMgr["StorageManager"]
ExtEntry --> StatBar["Status Bar Item"]
RemManager --> SndPlayer["SoundPlayer (Native Audio)"]
RemManager --> DecManager["EditorDecorationManager (Line Animation)"]
RemManager --> StorageMgr
RemManager --> StatBar
DecManager --> ActiveEditor["Active Code Editor Line"]
SndPlayer --> OS_Audio["OS Audio Hardware"]
StorageMgr --> VSCode_GlobalState["VS Code Memento Storage"]
3. State Overview Table
| State |
Status Bar Indicator |
Hover Tooltip GIF |
In-Editor Line Display |
Trigger / Action |
| Idle |
β±οΈ 30m \| 3 🥛 |
drinkbro.gif |
Hidden |
Regular countdown ticking every 30s |
| Reminder |
🌊 TIME TO SIP! \| 3 🥛 |
splash.gif |
splash.gif (3s) |
Timer hits 0 or Take a Sip Now |
| Celebration |
β¨ Drinking! (+1) \| 4 🥛 |
drinking.gif |
drinking.gif (1s) |
User clicks [ Drinking ] button |
| Paused |
$(debug-pause) Sip: Paused (3 🥛) |
drinkbro.gif |
Hidden |
User selects Pause Reminders |
🚀 User Guide & How to Use
1. Daily Workflow
- Working & Coding:
- As you code, glance at the bottom-right status bar to see your next reminder:
β±οΈ 25m | 2 🥛.
- When it's Time to Drink:
- A bubble sound chime will play 🫧.
- The status bar will pulse to
🌊 TIME TO SIP! | 2 🥛.
- A 3-second animated buddy appears beside the line of code you are typing on.
- A notification appears in the bottom right with
[ Drinking ].
- Logging Your Water:
- Click
Drinking directly in the notification, or click the status bar item to log your glass.
- Watch the character celebrate with
drinking.gif as your count increments (3 🥛)!
2. Status Bar Features
- Hovering: Hover your mouse over
β±οΈ 30m | 3 🥛 to open the rich companion card showing:
- Animated GIF of current state
- Time remaining until next reminder
- Today's glasses logged
- Current daily streak
- Total lifetime glasses
- Clicking: Clicking the status bar opens the Quick Action Menu:
Drinking (Log 1 Glass & Reset Timer)
Take a Sip Now (Immediate reminder trigger)
Pause / Resume Reminders
Change Reminder Interval
View Hydration Stats
Reset Today's Count
β¨οΈ Command Palette Reference
Open the Command Palette (Ctrl+Shift+P on Windows/Linux or Cmd+Shift+P on macOS) to access all commands:
| Command |
Title |
Description |
sipAndShip.drinkNow |
Sip & Ship: Take a Sip Now |
Triggers the reminder sound, notification, and animation immediately. |
sipAndShip.toggleTimer |
Sip & Ship: Pause / Resume Reminders |
Pauses or resumes the active countdown timer. |
sipAndShip.changeInterval |
Sip & Ship: Change Reminder Interval |
Opens an interval picker (15m, 20m, 30m, 45m, 60m, or Custom). |
sipAndShip.showStats |
Sip & Ship: View Hydration Stats & Streaks |
Shows a summary popup of today's intake, streaks, and lifetime sips. |
sipAndShip.resetDailyCount |
Sip & Ship: Reset Today's Water Count |
Resets today's glass counter back to 0 (with confirmation). |
βοΈ Configuration & Settings
Configure Sip & Ship via VS Code Settings (Ctrl+, / Cmd+,) by searching for Sip & Ship, or add these keys to your settings.json:
{
// Interval between hydration reminder notifications (in minutes)
"sipAndShip.intervalMinutes": 30,
// Play a subtle bubble chime when reminder appears
"sipAndShip.soundEnabled": true
}
| Setting Key |
Type |
Default |
Description |
sipAndShip.intervalMinutes |
integer |
30 |
Number of minutes between reminders (min: 1, max: 240). |
sipAndShip.soundEnabled |
boolean |
true |
Enables or disables the bubble audio chime. |
All media assets used in this extension are credited to their respective creators:
📁 Project Structure
WaterBuddy/
βββ .vscode/
β βββ launch.json # F5 Extension debugging config
β βββ tasks.json # TypeScript build tasks
βββ media/
β βββ logo.png # Official extension branding avatar
β βββ drinkBro.png # Screenshot: Idle countdown mode
β βββ timeToSip.png # Screenshot: Active reminder popup
β βββ drinking.png # Screenshot: Celebration state
β βββ drinkbro.gif # Idle countdown animation
β βββ splash.gif # Active reminder animation
β βββ drinking.gif # Celebration sip animation
β βββ mixkit-liquid-bubble-3000.wav # Gentle bubble sound effect
βββ src/
β βββ editorDecorationManager.ts # In-editor line margin animation engine
β βββ extension.ts # Extension activation, status bar, and command bindings
β βββ reminderManager.ts # Timer scheduler, state manager, and notifications
β βββ soundPlayer.ts # Cross-platform non-blocking native audio player
β βββ storageManager.ts # Persistent Memento storage, streaks, and date tracking
βββ package.json # Extension manifest and contributions
βββ tsconfig.json # TypeScript compiler configuration
βββ README.md # Project documentation
🛠οΈ Development & Building
Prerequisites
- Node.js (v18.0.0 or higher)
- npm (v9.0.0 or higher)
- VS Code or Antigravity IDE
Setup & Compilation
# 1. Clone or navigate to the project directory
cd WaterBuddy
# 2. Install dependencies
npm install
# 3. Compile TypeScript
npm run compile
# 4. (Optional) Run compilation in watch mode during development
npm run watch
Running & Debugging
- Open the project in VS Code or Antigravity.
- Press F5 to launch the Extension Development Host.
- In the new window, open any workspace and enjoy hydrating while you code!
Made with 💧 for developers everywhere. Stay hydrated and keep shipping!