Skip to content

Repository files navigation

Pomomodoro

A beautiful, interactive Pomodoro timer built with Next.js 16 and React 19.

Live at https://pomomodoro.vpardos.dev

Pomodoro Timer React TypeScript Tailwind CSS

Screenshot

Features

  • Pomodoro Timer — Work/short break/long break phases with stunning visual feedback
  • Customizable Durations — Configure work, short break, long break durations and long break interval
  • Circular & Linear Progress — Two timer visual styles with phase-specific glow effects and breathing animations while running
  • Ambient Background — Subtle, slowly drifting gradient blobs that shift with the current timer phase
  • Sound Notifications — Sound on phase transitions
  • Browser Notifications — Notifications on phase changes
  • Alarm System — Schedule alarms for specific times with sound/notification alerts
  • Task System — Track up to 5 tasks with check-to-complete, bouncy animations, and fluid interactions
  • Theme System — Light/dark/OLED modes with 13 color palettes
  • Glassmorphism UI — Cards with hover lift, backdrop blur, and smooth transitions throughout
  • Smooth Scrolling & Custom Scrollbar — Themed, thin scrollbars across all browsers
  • Settings Persistence — All settings saved to localStorage
  • Dynamic Page Title — Shows remaining time and current phase in browser tab
  • Multilingual — Full English and Spanish UI translations with a language switcher (see Internationalization)

Getting Started

Prerequisites

  • Node.js 18+
  • npm, yarn, or pnpm

Installation

# Clone the repository
git clone https://github.com/vpardoss/Pomomodoro.git
cd Pomomodoro

# Install dependencies
npm install

Development

# Start the development server
npm run dev

Open http://localhost:3000 in your browser.

Build

# Create production build
npm run build

# Start production server
npm start

Lint

# Run ESLint
npm run lint

Tech Stack

  • Framework: Next.js 16.2.10 with App Router
  • UI Library: React 19
  • Styling: Tailwind CSS v4
  • UI Components: shadcn/ui v4 with @base-ui/react
  • Icons: lucide-react
  • Internationalization: next-intl
  • Language: TypeScript

Design System

Animations

The app includes a rich set of custom CSS keyframe animations defined in src/app/globals.css:

  • animate-fade-in-up — Staggered card entrance animations
  • animate-breathe — Subtle scale pulsing on the timer while running
  • animate-pulse-ring — Expanding ring effect on the current session dot
  • animate-blob-drift — Slow ambient background blob movement
  • animate-slide-in-right — List item entry animations
  • animate-spring-scale — Bouncy pop-in effect
  • animate-float — Gentle floating motion for empty states
  • animate-shimmer — Linear gradient sweep effect

Color Palettes

13 carefully crafted palettes are available:

Catppuccin: Latte, Frappé, Macchiato, Mocha Nord: Polar Night, Snow Storm, Frost, Aurora Extras: Dracula, Solarized Light, Solarized Dark, Tokyo Night, Rosé Pine

Each palette is dynamically applied via CSS custom properties using OKLCH (Catppuccin) or hex values (custom palettes).

Internationalization

Pomomodoro is fully translated into English and Spanish using next-intl. The UI language is selectable from the topbar language switcher, and the choice is remembered across visits.

  • Supported locales: en (English, default) and es (Spanish)
  • Routing: Locale is always prefixed in the URL — /en and /es (configured with localePrefix: 'always')
  • Persistence: The selected locale is stored in a cookie (1-year expiry) so it survives reloads
  • Translation files: messages/en.json and messages/es.json
  • Configuration: src/i18n/routing.ts (locale list, default, prefix, cookie) and src/i18n/request.ts (server-side message loading)

Adding a new language

  1. Create messages/<locale>.json by copying messages/en.json and translating the values (keep the keys intact).
  2. Add the locale code to the locales array in src/i18n/routing.ts.
  3. Add a display name for the locale under the LocaleSwitcher key in both messages/en.json and messages/es.json (and the new file).

The language switcher in the topbar automatically picks up any locale listed in routing.locales.

License

MIT

Acknowledgments

About

Pomomodoro is a simple Pomodoro timer with customizable work and break sessions, tasks, alarms, notifications, and multiple color themes.

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages