Repository navigation
📌 Summary
🚀 Chrona UI 2.0 – Nimbus
This is a major version release focused on transforming the Chrona user interface into a progressive, installable, offline-capable experience with push notifications, enhanced install flows, and Cloudflare-native CI/CD.
✨ What’s New / Changed
- Feature
- Refactoring
- CI/CD
- PWA / Push Infrastructure
- Other: Major Upgrade
Summary of Changes:
🌩️ New Capabilities
-
Multi-Timer Support
- Introduced
TimerCarouselfor managing multiple countdowns - Add, delete, and rename timers inline
- Lazy-loaded timer screens for performance
- Improved transition and hover animations
- Fully backwards-compatible with single-timer users
- Introduced
-
Full PWA support via
vite-plugin-pwa:- Offline support, caching, custom
sw.js, manifest, iOS/macOS install banners - Chromium install prompt and install hook via
useInstallPrompt()
- Offline support, caching, custom
-
Push Notification System:
- VAPID key support via
VAPID_PUBLIC_KEY - Browser permission management with
useNotificationPermission - Auto subscription on login and backend sync (
setupPush) - Service worker handles timer completion alerts
- VAPID key support via
🔐 CI/CD + DevOps
- Introduced
deploy-cloudflare.ymlfor Wrangler-based deployments to Cloudflare Pages - Updated
preview-pr-deploy.ymland Dockerfile to pass and consumeVPUBLIC_KEY - Removed legacy
env.tsin favor of Vite-injected globals viadefine
🧠 Frontend Enhancements
-
NotificationPermissionPromptcomponent: non-intrusive in-app request prompt -
Mobile install experience:
- iOS Safari prompt via
useIosInstall() - macOS Safari 17+ prompt via
useSafariInstallBanner()
- iOS Safari prompt via
-
Multiple SVG/PNG clock assets for responsive install support
🧼 Refactoring
- Unified state handling for notification permissions
- Simplified
useExtensionStatuslogic withisGrantedhook - Consistent naming:
notificationPermissionGrantedacross all logic - Deprecated unused
env.ts, replaced with global defines
🛑 Breaking Changes
- YES
If yes, describe:
- Notification API now uses
notificationPermissionGranted(boolean) instead ofnotificationPermission(hook-based) - Build and deploy now expects
VAPID_PUBLIC_KEYandBASE-URLfrom env or secret manager - Deprecated
.envimports in favor of global constants - Replaced
performance.now()withDate.now()to align with backend time coordination - Service worker moved from
public/sw.jstosrc/sw.tswith PWA injection strategy
📈 Testing
- Locally tested (Docker / Vite)
- Verified offline readiness (PWA)
- Push notifications tested on Chrome and Safari
- Cloudflare Pages preview verified
- Lighthouse PWA audit passed
- CI/CD passed (build, preview, production)
Notes:
- Ensure
VPUBLIC_KEYis synced via Azure Key Vault and GitHub secrets registerSW()is now required inmain.tsxandApp.tsx
🧰 Patch Fixes (Post-tag for v2.0.0)
-
Fixed env var propagation issues in Cloudflare deploys:
- Ensured
VITE_BACKEND_API_URLandVITE_VPUBLIC_KEYare available at build time - Added
test-env.jscheck in CI andnpm run build - Improved fallback strategy in
vite.config.ts
- Ensured
-
Locked Vite to
v6.3.4for PWA stability and better plugin compatibility -
Added
VITE_*typing underImportMetaEnvfor IDE support
📚 Documentation
- CHANGELOG.md updated
- RELEASE_NOTES.md (next step)
- Docs/Comments added throughout (
hooks,lib,sw.ts)
📌 Notes to Reviewers (optional)
-
Feel free to test install flows on:
- Chrome (Install button)
- Safari (macOS + iOS prompts)
-
Test push by:
- Granting notification access
- Running a timer until completion with app minimized or closed
-
Next: plan a
2.0.1patch for mobile UI scaling tweaks and service worker improvements
Version:
v2.0.0
Codename: Nimbus ☁️
Description: Fast. Installable. Notified.