A stylish, animated countdown timer with inspirational quotes, dynamic visuals, and full offline support. Built with responsiveness, customization, and motivation in mind.
- 🎞️ Animated Digits: Only the digits that change animate, for smooth, subtle transitions.
- 💬 Animated Quotes: Inspirational quotes appear with a letter-shuffling animation.
- 🔍 Keyword Highlighting: Automatically bolds key words in quotes to draw attention.
- ❤️ Heartbeat Effect: Time blocks pulse when their value changes — a subtle nod to urgency.
- 🌓 Dark/Light Mode: Auto-detects system preference with manual override.
- 🔔 Audible Alerts: Unique sounds for each unit change (day, hour, minute, second) with adjustable volume.
- 📱 Responsive Design: Works beautifully on all screen sizes and orientations.
- 🎨 Theme Presets: Easily extend or customize color themes.
- ♿ Accessibility-Friendly: Includes ARIA tags and full keyboard navigation support.
- 🌐 Offline Ready: Full PWA support — works offline and installable on desktop/mobile.
- Clone or download this repository.
- Serve the project locally:
Or use Live Server in VS Code.
npx serve .
- Open
index.html
in your browser.
Note: For full offline support and PWA functionality, serving via a local server is required.
Open js/config.js
and update the target date:
export const TARGET_DATE = new Date("2028-09-29T00:00:00+05:30");
Inspirational quotes are stored in quotes.json
. You can add, clean, and organize them using the built-in Python script.
Edit quotes.json
manually using this format:
{
"q": "Your inspiring quote goes here.",
"a": "Author's Name"
}
If the author is unknown, use
"a": "Unknown"
— the script will normalize it to"Anonymous"
.
The included quote.py
script performs the following:
- ✅ Deduplication by Similarity: Removes quotes that are almost identical (90% similarity threshold).
- ✍️ Author Correction: Replaces
"Anonymous"
with a specific author if found in a duplicate. - ♻️ "Unknown" Normalization: Converts
"Unknown"
to"Anonymous"
. - 📁 Archiving Removed Quotes: Stores removed quotes in
removed_quotes.json
along with their matched counterparts. - 🔀 Optional Shuffling: Enable shuffling by setting
flag=True
in the script.
- Ensure Python 3 is installed.
- Place
quote.py
in the same directory asquotes.json
. - Run the script:
python quote.py
The script will output:
- Original quote count
- Cleaned quote count
- Removed quote count
If quotes cannot be loaded, a fallback quote is shown:
{
"q": "Oops! The quotes went on vacation without telling us.",
"a": "The Missing Quote Squad"
}
See CHANGELOG.md for the full list of changes and release history.
MIT License