English | ζ₯ζ¬θͺ
A simple and user-friendly time management application with Meeting Timer and Pomodoro Timer features.
Live Demo: https://comm-time.vercel.app
- β±οΈ Elapsed Time Mode: Track elapsed time from meeting start
- β° Countdown Mode: Set end time and display remaining time
- π Multiple Alarm Points: Set alarms at 30min, 50min, 60min, etc.
- π Real-time Notes: Record meeting minutes
- β TODO List: Manage tasks decided in meetings
- π― Auto-switching: 25min work β 5min break automatically
- π Cycle Counter: Display completed cycles
- βΎοΈ Infinite Mode: Run continuously until manual stop
- π Different Alarms: Separate sounds for work start and break start
- π Work Log: Notes and TODO features for tracking work
- π Tick Sound: Clock ticking sound during timer operation (ON/OFF)
- π³ Vibration: Device vibration on alarm (supported devices only)
- β‘ Flash Alert: Screen-wide white flashing for visual notification
- π Browser Notifications: Alarm notifications even in background
- πΎ Auto-save: Automatically save all settings and data (persists after closing browser)
- βοΈ Cloud Save (NEW!): Save TODO/Memo to cloud with user authentication
- Cross-device sync
- Supabase integration
- Secure data storage with Row Level Security
- REST API for third-party app integration
Comprehensive guides for both users and developers:
- User Guide - Complete guide on how to use Comm Time
- Basic operations
- Meeting Timer usage
- Pomodoro Timer usage
- TODO and Memo features
- Cloud Save feature (NEW!)
- FAQ and troubleshooting
- Developer Guide - Technical documentation for developers
- Tech stack and project structure
- Development environment setup
- Supabase integration guide
- Implementation details
- Testing and deployment
- Troubleshooting
- Supabase Setup Guide - Step-by-step Supabase configuration
- Database schema
- Authentication setup
- Row Level Security (RLS)
- REST API usage
- Vercel Environment Setup - Configure Supabase on Vercel
- Environment variables configuration
- Deployment setup
- Troubleshooting
- Open https://comm-time.vercel.app in your web browser
- Verify "Comm Time" is displayed at the top with the current time
- Two tabs are displayed:
- "Meeting Timer" (for meetings)
- "Pomodoro Timer" (for focused work)
- Click the π button in the top right
- When browser prompts for notification permission, click "Allow"
- Button turns blue when enabled
- Now you'll receive alarms even in background
Note: Browser notifications are not available on iOS Safari. Use flash or vibration instead.
Perfect for managing meeting and discussion time.
Steps:
-
Click "Meeting Timer" tab
- Verify the left tab is selected
-
Check alarm points
- Default: 30min, 50min, 60min
- Skip this step if using defaults
-
Start timer
- Click large green "Start" button
- Timer starts counting from "00:00:00"
- "Start time" and "Estimated end time" appear below current time
-
During meeting
- At 30min: Alarm sounds, screen flashes ("30 minutes elapsed")
- At 50min: Alarm sounds again ("50 minutes elapsed")
- At 60min: Final alarm ("60 minutes elapsed")
-
Stop alarm methods
- Tap the screen (if flash is ON)
- Or click "Stop Alarm" button
- Automatically stops after 30 seconds
-
Pause timer
- Click red "Pause" button
- Timer stops
- Click "Start" again to resume
-
Reset timer
- Click gray "Reset" button
- Timer returns to 00:00:00
- Alarm points reset to default
Steps:
-
Select "Meeting Timer" tab
-
Enable countdown mode
- Click "Countdown Mode" toggle
- Turns blue when ON
-
Set end time
- Click time input field
- Example: Enter
15:30 - If current time is 1:00 PM, displays "02:30:00" remaining
-
Start timer
- Click "Start" button
- Remaining time counts down
-
When reaching zero
- Alarm sounds
- Message: "Time's up!"
- Timer stops automatically
Example: Set alarms at 15min, 45min, 75min
Steps:
- Find "Alarm Points" section
- Edit existing points:
- Click first point's number "30"
- Enter
15
- Edit second point:
- Change "50" to
45
- Change "50" to
- Edit third point:
- Change "60" to
75
- Change "60" to
- Settings automatically saved
Steps:
- Click "Add Alarm Point" button
- New point added (current elapsed time + 1min)
- Edit number to set desired time
- Example: Enter
90for 90min (1h 30min) alarm
Steps:
- Click "Γ" button on the right of the point to delete
- Point is deleted
- Recommend keeping at least one point
Steps:
- Scroll to "Meeting Alarm Settings" section
- Drag "Volume" slider left/right
- Left: Quieter
- Right: Louder
- Check value (0-100)
- Recommended: 40-60
Steps:
- Click "Frequency" number input field
- Enter value:
- Low sound:
200-400Hz - Medium sound:
400-600Hz - High sound:
600-800Hz
- Low sound:
- Default:
340Hz
Steps:
- Click yellow "Test" button
- Alarm plays (every 5 seconds for up to 30 seconds)
- To stop:
- Tap screen
- Or click "Stop Alarm" button
- If sound not satisfactory, adjust volume/frequency and test again
Steps:
- Click "Reset" button
- Returns to defaults: Volume 44, Frequency 340 Hz
Ideal for focused work. Automatically switches between work and break time.
Steps:
-
Click "Pomodoro Timer" tab
-
Check settings
- Default settings:
- Work duration: 25min
- Break duration: 5min
- Cycles: 4 times
- Proceed to next step if using defaults
- Default settings:
-
Start timer
- Click green "Start" button
- Work time begins (blue background)
- Display shows "π― Work Time"
-
After 25 minutes
- Alarm sounds (work time end notification)
- Automatically switches to break time (orange background)
- Display shows "β Break Time"
- Message: "Great work! Break time"
-
After 5 minutes (break end)
- Alarm sounds (break end notification)
- Automatically returns to work time (blue background)
- Message: "Break over! Start working"
- Cycle counter increases to "1 / 4"
-
After 4 cycles complete
- Timer stops automatically
- Great job!
-
To stop midway
- Click red "Pause" button
- Click "Start" to resume
-
To restart from beginning
- Click "Reset" button
- Cycle counter returns to 0
Example: Want 50-minute focus
Steps:
- Find "Pomodoro Settings" section
- Click "Work Duration" number field
- Enter
50 - Settings saved
- Next timer start will use 50-minute work time
Example: Want 10-minute break
Steps:
- Click "Break Duration" number field
- Enter
10 - Settings saved
Example: Want 8 cycles (full workday)
Steps:
- Click "Cycles" number field
- Enter
8 - Timer automatically stops after 8 cycles complete
Steps:
- Click "Infinite Mode (unlimited cycles)" checkbox
- When checked, cycle number input grays out
- Timer repeats work and break forever
- Continues until manual "Pause" or "Reset"
Pomodoro timer allows different sounds for work start and break start.
Steps:
- Find "π― Work Time Alarm Settings" section
- Adjust volume slider (recommended: 60-70)
- Set frequency (default: 240 Hz)
- Lower sound for calm work start notification
- Confirm with "Test" button
Steps:
- Find "β Break Time Alarm Settings" section
- Adjust volume slider (recommended: 30-40)
- Gentle volume recommended for breaks
- Set frequency (default: 740 Hz)
- Higher sound for light break start notification
- Confirm with "Test" button
Features available for both Meeting Timer and Pomodoro Timer.
Record meeting minutes or work content.
Steps:
- Find "π Notes" section on the right side of screen
- Click text area
- Enter notes freely
- Example (Meeting):
Agenda: - Q1 sales report - New product planning Decisions: - Prepare materials by next week - Example (Pomodoro):
Today's tasks: - Fix bug #123 - Review specifications - Code refactoring
- Example (Meeting):
- Content automatically saved
- Content persists after closing browser
- Meeting and Pomodoro have separate storage
Manage tasks.
Steps:
- Find "β TODO List" section on right side of screen
- Click "Enter new TODO..." field
- Enter task
- Example:
Create presentation materials
- Example:
- Press Enter key or click "Add" button
- Added to list
Steps:
- Click checkmark button on left of completed task
- Text gets strikethrough, background turns green
- Click again to mark as incomplete
Steps:
- Click pencil icon on right of TODO to edit
- Text becomes editable
- Modify content
- Example:
Create presentation materialsβCreate and email presentation materials
- Example:
- Click save button (checkmark)
- Or click Γ button to cancel
Steps:
- Click Γ button on right of TODO to delete
- Deleted immediately without confirmation
- Deleted TODOs cannot be restored, please be careful
Method 1: Move with buttons
Steps:
- To move up: Click β button
- To move down: Click β button
- Buttons gray out at top or bottom
Method 2: Drag and drop
Steps:
- Drag (long press) TODO to move with mouse
- Move to desired position
- Release mouse to place at that position
Four settings buttons in top right of screen.
Plays "tick-tock" clock sound during timer operation.
Steps:
- Click π button
- Green: ON (sound plays)
- Gray: OFF (no sound)
- Hear ticking sound when timer starts
Tip: Turn OFF for concentration, turn ON to be aware of time passing
Smartphone vibrates on alarm.
Steps:
- Click π³ button
- Purple: ON (vibrates)
- Gray: OFF (no vibration)
- Effective on smartphones
Note: Does not vibrate on computers
Screen flashes white during alarm.
Steps:
- Click β‘ button
- Yellow: ON (screen flashes)
- Gray: OFF (no flash)
- On alarm, entire screen turns white with "β° TIME UP! β°" displayed in center
- Tap screen to dismiss
Tip: Useful when sound alone is not noticeable
Notify alarms via browser notifications.
Steps:
- Click π button for first time
- Browser requests notification permission
- Select "Allow"
- Blue: ON (notifications delivered)
- Gray: OFF (no notifications)
- Test notification displays: "Notifications enabled!"
Benefits:
- Notifications delivered even when viewing other tabs
- Notice even when not looking at screen
- Notification popup appears on desktop
Note: Not available on iOS Safari
When alarm is ringing, stop it with these methods:
Method 1: Tap flash screen
- Only when flash is ON
- Tap anywhere on white screen
- Stops immediately
Method 2: Stop alarm button
- Red "Stop Alarm" button appears in header
- Click this button
- Reliable way to stop
Method 3: Click screen
- When flash is OFF
- Click anywhere on screen
- Stops
Method 4: Auto-stop
- Leave for 30 seconds
- Stops automatically
- Safety measure if unnoticed
A: All data is saved in browser's local storage.
- Nothing sent to server
- Privacy completely protected
- Retained until browser data cleared
- Not shared across different browsers or devices
A: Clear browser data.
For Chrome/Edge:
- Press F12 to open developer tools
- Click "Application" tab
- Expand "Local Storage" on left
- Click site URL
- Right-click β Select "Clear"
- Reload page (F5 key)
For Safari/Firefox:
- Open developer tools
- Find "Storage" tab
- Delete Local Storage data
A: Yes, fully supported.
- Responsive design adapts to screen size automatically
- Optimized for touch operations
- Vibration feature available
- Can add to home screen
To add to iPhone home screen:
- Open in Safari
- Tap share button at bottom of screen
- Select "Add to Home Screen"
- Launch from icon like an app
A: Works offline after initial access.
- Functions as PWA (Progressive Web App)
- Basic features available without internet connection
- All data saved locally
A: Check the following:
-
Verify notification button is blue
- Click π button if gray
-
Check browser notification permission
- Chrome: Settings β Privacy and security β Site settings β Notifications
- Verify site is "Allowed"
-
Check OS notification settings
- Windows: Settings β System β Notifications
- macOS: System Preferences β Notifications
- Verify browser notifications allowed
-
For iOS Safari
- Browser notifications not available
- Use flash and vibration instead
A: Try the following:
-
Check device volume
- Verify not muted
- Verify volume not at 0
-
Check if browser tab is muted
- Check tab speaker icon
-
Test with test button
- Click "Test" button in alarm settings
- Verify sound plays
-
Increase volume setting
- Set alarm settings volume slider to 80 or higher
A: Mobile browser specification.
- Many mobile browsers restrict automatic audio playback
- Plays after tapping timer start button
- This is browser security feature
A: This is by design.
- Alarm plays every 5 seconds, stops automatically after 30 seconds
- Designed to prevent endless ringing
- See developer manual to change
A: Possible but requires caution.
- Each tab operates independently
- Last updated tab's content is saved
- Recommend using in single tab normally
A: Currently no export feature.
- Data saved in browser's local storage
- Copy and paste important notes elsewhere
- Export feature planned for future
- Node.js: 18.x or higher (recommended: 20.x)
- Package Manager: npm, yarn, pnpm, or bun
- Git: For version control
- Editor: VS Code recommended (TypeScript support)
# Clone via HTTPS
git clone https://github.com/BoxPistols/comm-time.git
# Or clone via SSH
git clone git@github.com:BoxPistols/comm-time.git
# Navigate to directory
cd comm-time# With npm
npm install
# With yarn
yarn install
# With pnpm
pnpm install
# With bun
bun installInstalled packages:
- Next.js 14.x
- React 18.x
- TypeScript
- Tailwind CSS
- Lucide Icons
- react-beautiful-dnd
# With npm
npm run dev
# With yarn
yarn dev
# With pnpm
pnpm dev
# With bun
bun devWhen successful:
β² Next.js 14.x
- Local: http://localhost:3000
- Ready in 2.3s
- Open http://localhost:3000 in browser
- Verify app displays
- Files auto-reload when edited via hot reload
# Execute build
npm run build
# .next folder generated when successful# Start production server
npm run start
# Open http://localhost:3000 in browserThis project auto-deploys on Vercel.
Production deploy on main branch push:
# Commit changes
git add .
git commit -m "Update: Add feature"
# Push to main branch
git push origin mainResult:
- Build starts automatically
- Production environment updates in a few minutes
- Accessible at https://comm-time.vercel.app
Preview environment for pull requests:
# Create new branch
git checkout -b feature/new-function
# Commit changes
git add .
git commit -m "Add: New feature"
# Push branch
git push origin feature/new-functionResult:
- Preview environment automatically generated when creating pull request
- Preview URL displayed in PR comments
- Test without affecting production environment
# Install Vercel CLI
npm i -g vercel
# Login to Vercel
vercel login
# Deploy to preview environment
vercel
# Deploy to production environment
vercel --prodcomm-time/
βββ app/ # Next.js App Router
β βββ layout.tsx # Root layout (metadata, fonts)
β βββ page.tsx # Top page (displays CommTimeComponent)
β βββ globals.css # Global styles
β βββ fonts/ # Geist font files
β βββ GeistVF.woff
β βββ GeistMonoVF.woff
βββ components/ # React components
β βββ comm-time.tsx # Main component (2000+ lines)
βββ lib/ # Utility functions
β βββ utils.ts # Tailwind CSS helper
βββ public/ # Static files
β βββ favicon.svg # Favicon (timer icon)
βββ .vscode/ # VS Code settings
β βββ settings.json # Editor settings
βββ node_modules/ # Dependency packages (in .gitignore)
βββ .next/ # Build output (in .gitignore)
βββ package.json # Project settings
βββ tsconfig.json # TypeScript settings
βββ tailwind.config.ts # Tailwind CSS settings
βββ next.config.mjs # Next.js settings
βββ postcss.config.mjs # PostCSS settings
βββ README.md # This file
File: public/favicon.svg
Steps:
- Open
public/favicon.svgin SVG editor - Edit design
- Save and reload browser
SVG code example:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="45" fill="#6366f1"/>
<circle cx="50" cy="50" r="40" fill="white"/>
<!-- Add design here -->
</svg>Verification:
- Check icon in browser tab
- Verify icon settings in
app/layout.tsx
File: components/comm-time.tsx
Change gradient example:
// Header gradient (around lines 69-71)
<h1 className="... bg-gradient-to-r from-indigo-600 to-purple-600 ...">
Comm Time
</h1>
// Change to different colors
<h1 className="... bg-gradient-to-r from-blue-600 to-cyan-600 ...">
Comm Time
</h1>Change timer background example:
// Meeting timer (around line 1129)
<div className="bg-gradient-to-br from-indigo-500 to-purple-600 ...">
// Change to different colors
<div className="bg-gradient-to-br from-green-500 to-emerald-600 ...">Change button color example:
// Start button (around line 1156)
bg-gradient-to-r from-green-500 to-emerald-500
// Change to orange
bg-gradient-to-r from-orange-500 to-red-500Tailwind color palette:
red: Red tonesorange: Orange tonesyellow: Yellow tonesgreen: Green tonesblue: Blue tonesindigo: Indigo tonespurple: Purple tonespink: Pink tones
Numbers: 50 (light) ~ 900 (dark)
File: components/comm-time.tsx
Change alarm points (lines 53-57):
const initialMeetingAlarmPoints: AlarmPoint[] = [
{ id: "1", minutes: 30, isDone: false, remainingTime: 30 * 60 },
{ id: "2", minutes: 50, isDone: false, remainingTime: 50 * 60 },
{ id: "3", minutes: 60, isDone: false, remainingTime: 60 * 60 },
];
// Example: Change to 15, 30, 45 minutes
const initialMeetingAlarmPoints: AlarmPoint[] = [
{ id: "1", minutes: 15, isDone: false, remainingTime: 15 * 60 },
{ id: "2", minutes: 30, isDone: false, remainingTime: 30 * 60 },
{ id: "3", minutes: 45, isDone: false, remainingTime: 45 * 60 },
];Meeting alarm settings (lines 59-62):
const initialMeetingAlarmSettings: AlarmSettings = {
volume: 44, // Volume (0-100)
frequency: 340, // Frequency (Hz)
};
// Example: Louder, lower frequency
const initialMeetingAlarmSettings: AlarmSettings = {
volume: 70, // Louder
frequency: 240, // Lower sound
};Pomodoro settings (lines 64-77):
const initialPomodoroSettings = {
workDuration: 25, // Work duration (min)
breakDuration: 5, // Break duration (min)
cycles: 4, // Cycle count
infiniteMode: false, // Infinite mode
workAlarm: {
volume: 65,
frequency: 240,
},
breakAlarm: {
volume: 36,
frequency: 740,
},
};
// Example: Change to 50min work, 10min break
const initialPomodoroSettings = {
workDuration: 50, // 50min work
breakDuration: 10, // 10min break
cycles: 4,
infiniteMode: false,
workAlarm: {
volume: 65,
frequency: 240,
},
breakAlarm: {
volume: 36,
frequency: 740,
},
};File: components/comm-time.tsx (lines 350-365)
Alarm repeat count and interval:
// Repeat alarm (every 5s for 30s)
playSound(); // First play
let alarmCount = 0;
alarmIntervalRef.current = setInterval(() => {
alarmCount++;
if (alarmCount >= 6) { // 6 times Γ 5s = 30s
stopAlarm();
} else {
playSound();
// Vibration...
}
}, 5000); // Every 5 secondsExample: Play every 10s for 1 minute:
let alarmCount = 0;
alarmIntervalRef.current = setInterval(() => {
alarmCount++;
if (alarmCount >= 6) { // 6 times Γ 10s = 60s
stopAlarm();
} else {
playSound();
}
}, 10000); // Every 10 secondsExample: Play every 3s for 15 seconds:
let alarmCount = 0;
alarmIntervalRef.current = setInterval(() => {
alarmCount++;
if (alarmCount >= 5) { // 5 times Γ 3s = 15s
stopAlarm();
} else {
playSound();
}
}, 3000); // Every 3 secondsFile: components/comm-time.tsx (lines 373-376)
// Flash effect (longer)
if (flashEnabled) {
setIsFlashing(true);
setTimeout(() => setIsFlashing(false), 30000); // Flash for 30s
}
// Example: Change to 60s flash
if (flashEnabled) {
setIsFlashing(true);
setTimeout(() => setIsFlashing(false), 60000); // Flash for 60s
}Steps:
-
Open
components/comm-time.tsx -
Add state variables (around line 140):
const [quickCountdown, setQuickCountdown] = useState(false);
const [quickCountdownSeconds, setQuickCountdownSeconds] = useState(10);- Add countdown function:
const startQuickCountdown = useCallback(() => {
setQuickCountdown(true);
setQuickCountdownSeconds(10);
const interval = setInterval(() => {
setQuickCountdownSeconds((prev) => {
if (prev <= 1) {
clearInterval(interval);
setQuickCountdown(false);
playAlarm(meetingAlarmSettings, "10 seconds elapsed!");
return 0;
}
return prev - 1;
});
}, 1000);
}, [meetingAlarmSettings, playAlarm]);- Add button to UI (around line 1178, after reset button):
<button
type="button"
onClick={startQuickCountdown}
className="px-6 py-3 rounded-xl bg-gradient-to-r from-blue-500 to-cyan-500 hover:from-blue-600 hover:to-cyan-600 text-white font-semibold"
>
10 Second Countdown
</button>- Add countdown display:
{quickCountdown && (
<div className="text-center text-2xl font-bold text-red-600">
{quickCountdownSeconds} seconds left
</div>
)}- Save and check in browser
Cause: Node.js version too old
Solution:
# Check Node.js version
node --version
# Update if not 18.x or higher
# Download from https://nodejs.org/
# Or use nvm
nvm install 20
nvm use 20Cause: Another application using port 3000
Solution:
# Start on different port
PORT=3001 npm run dev
# Or terminate existing process
# Windows
netstat -ano | findstr :3000
taskkill /PID <process ID> /F
# Mac/Linux
lsof -ti:3000 | xargs kill -9Cause: Type definition mismatch
Solution:
# Delete node_modules and reinstall
rm -rf node_modules
npm install
# Or
rm -rf node_modules package-lock.json
npm installCause: TypeScript errors or ESLint warnings
Check:
# Check TypeScript
npx tsc --noEmit
# Check ESLint
npm run lintSolution:
# Rebuild after fixing errors
npm run buildCause: Node.js memory limit
Solution:
# Increase memory limit for build
NODE_OPTIONS="--max-old-space-size=4096" npm run buildCheck:
- Verify build succeeds locally
npm run build- Check Node.js version in package.json
{
"engines": {
"node": ">=18.0.0"
}
}- Check Vercel logs
- Login to Vercel dashboard
- Select project
- Check error logs in Deployments tab
Check:
-
Check browser console
- Open developer tools with F12
- Check for errors in Console tab
-
Verify environment variables set correctly
- Check Environment Variables in Vercel settings
-
Verify static files placed correctly
- Check public/favicon.svg exists
Cause 1: Browser in incognito mode
Solution: Use in normal mode
Cause 2: Cookies or storage disabled in browser settings
Solution:
- Chrome: Settings β Privacy and security β Cookies and other site data
- Set to "Allow all cookies"
Debug steps:
- Check browser console
// Open developer tools with F12
// Check Console tab
// Look for messages like "Audio playback error"-
Test with test playback
- Click "Test" button in alarm settings
- Adjust volume or frequency if no sound
-
Check browser autoplay policy
// Run in Console
navigator.mediaDevices.enumerateDevices().then(devices => {
console.log(devices);
});Cause: Browser extensions or memory shortage
Solution:
-
Disable browser extensions
- Try in incognito mode
-
Close other tabs
- Free up memory
-
Restart browser
# Install React Developer Tools
# Chrome: https://chrome.google.com/webstore/detail/react-developer-tools/Usage:
- Open developer tools with F12
- Select "Components" tab
- Check component tree
- View state and props values
// Add to components/comm-time.tsx
useEffect(() => {
console.log('Timer start:', isMeetingRunning);
console.log('Elapsed time:', meetingElapsedTime);
}, [isMeetingRunning, meetingElapsedTime]);// Run in browser Console
console.log(localStorage.getItem('alarmPoints'));
console.log(localStorage.getItem('meetingMemo'));
// Check all keys
Object.keys(localStorage).forEach(key => {
console.log(key, localStorage.getItem(key));
});Pull requests are welcome!
Steps:
- Fork this repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add: Amazing feature') - Push branch (
git push origin feature/amazing-feature) - Create pull request
This project is published under the MIT License.
- Next.js - React framework
- Tailwind CSS - CSS framework
- Lucide Icons - Icon library
- react-beautiful-dnd - Drag and drop
- Vercel - Hosting
If you encounter issues, please report them in GitHub Issues.
Repository: https://github.com/BoxPistols/comm-time