A beautiful, modern meditation timer with ambient sounds, interval bells, and a stunning gradient UI.
π Live Demo: https://wisdomtimer.app/
β Custom timer - Specify any duration with minute/second inputs (default: 45 minutes) β Preset buttons - Quick access to 30, 45, 60, 90 minute sessions β Singing bowl start bell - Beautiful Tibetan singing bowl when meditation begins β Woodblock interval bell - Gentle knock-on-wood for periodic reminders β Gling end bell - Pure resonant tone (35.5s sustain) when meditation completes β Enlightenment burst - Stunning 9-second sunburst animation on completion with three pulsing waves β Ambient sounds - Rain, ocean, forest (seamless looping) β Volume controls - Separate controls for bells and ambient sounds β Keyboard shortcuts - Space to play/pause, R to reset β Settings persistence - Automatically saves your preferences β Responsive design - Beautiful on mobile, tablet, and desktop β Modern UI - Warm gradient background with glass-morphism effects β Smart audio loading - Bells preload before ambient sounds for instant playback
- Node.js (v18 or higher)
- npm or yarn
# Install dependencies
npm install
# Start development server
npm run devOpen http://localhost:5173 in your browser.
npm run build
npm run previewThe app includes the following audio files in the public/audio directory:
public/
βββ audio/
βββ bells/
β βββ bell-start.mp3 # Plays when meditation starts
β βββ bell-interval.mp3 # Plays at intervals (if enabled)
β βββ bell-end.mp3 # Plays when meditation completes
βββ ambient/
βββ rain.mp3 # Rain ambience
βββ ocean.mp3 # Ocean waves
βββ forest.mp3 # Forest sounds
- Space - Play/Pause timer
- R - Reset timer
- React 19 - UI library with latest features
- Vite 7 - Lightning-fast build tool
- Tailwind CSS v4 - Utility-first CSS with custom theme
- Lucide React - Beautiful, consistent icons
- Context API + Reducer - State management
- LocalStorage - Settings persistence
src/
βββ components/
β βββ Timer/ # Timer display and controls
β β βββ TimerDisplay.jsx
β β βββ TimerControls.jsx
β β βββ CircularProgress.jsx
β βββ Settings/ # Configuration components
β β βββ PresetButtons.jsx
β β βββ DurationSelector.jsx
β β βββ IntervalSettings.jsx
β β βββ AmbientSoundSelector.jsx
β βββ UI/ # Reusable UI components
β βββ GlassCard.jsx
β βββ Button.jsx
βββ hooks/ # Custom React hooks
β βββ useTimer.js # Timer logic with accuracy
β βββ useAudio.js # Audio playback wrapper
β βββ useLocalStorage.js # Persistent settings
βββ context/ # State management
β βββ TimerContext.jsx # Central state with reducer
βββ utils/ # Utility functions
β βββ audioManager.js # Audio system with fade effects
β βββ timeFormatter.js # Time formatting utilities
βββ constants/ # App constants
β βββ audioSources.js # Audio file paths
βββ App.jsx # Main application
βββ main.jsx # App entry point
βββ index.css # Global styles + Tailwind
Edit src/index.css:
@theme {
--color-gradient-start: #FDE68A; /* Light Yellow */
--color-gradient-end: #F97316; /* Vivid Orange */
}Edit src/context/TimerContext.jsx:
const initialState = {
duration: 2700, // 45 minutes default
presetDurations: [1800, 2700, 3600, 5400], // 30, 45, 60, 90 min
// Change to your preferred durations (in seconds)
};- Add audio file to
public/audio/ambient/ - Update
src/constants/audioSources.js:
export const AMBIENT_SOUNDS = [
// ... existing sounds
{ id: 'newSound', name: 'New Sound', path: '/audio/ambient/new-sound.mp3', icon: 'Music' },
];- Browser autoplay policy: Click the play button to initialize audio
- Missing files: Check that audio files exist in
public/audio/directories - Check console: Open browser DevTools (F12) to see audio loading errors
- Tailwind not loading: Ensure
@tailwindcss/postcssis installed - Clear cache: Try
npm run dev -- --force
- The timer uses
Date.now()calculations to prevent drift from CPU throttling - Should remain accurate even on slower devices or backgrounded tabs
MIT License - feel free to use this project for personal or commercial purposes.
All audio files used in this project are licensed under CC0 1.0 Universal (Public Domain). While attribution is not legally required, we credit the following creators:
-
Start Bell - "Singing Bell Hit 2" by ryancacophony Source: Freesound.org License: CC0 1.0 Universal (Public Domain)
-
Interval Bell (Woodblock) - "Wood Block Hit" by thomasjaunism Source: Freesound.org License: CC0 1.0 Universal (Public Domain)
-
End Bell - "Gling" by manuelsound Source: Freesound.org License: CC0 1.0 Universal (Public Domain)
-
Rain - "Light Gentle Rain" by Naturthusiast Source: Internet Archive License: CC0 1.0 Universal (Public Domain)
-
Ocean Waves - "Birds With Ocean Waves on the Beach" by Naturthusiast Source: Internet Archive License: CC0 1.0 Universal (Public Domain)
-
Forest - "Relaxing Nature Sounds - Birdsong Sound" by Naturthusiast Source: Internet Archive License: CC0 1.0 Universal (Public Domain)
Contributions welcome! Feel free to:
- Report bugs
- Suggest new features
- Submit pull requests
- Share your audio recommendations
- Session history and statistics
- Multiple timer profiles
- Dark/light theme toggle
- Additional ambient sounds
- Guided meditation audio
- Progressive Web App (PWA) support
- Social sharing of meditation sessions
- Integration with meditation apps
Built with β€οΈ for mindful moments
Enjoy your meditation! π§ββοΈβ¨