An unofficial recreation of 24hoursofhappy.com that syncs Pharrell Williams - Happy (24 Hours of Happy) to your local clock.
- Local-time synced playback across 24 hourly videos
- Circular 24-hour scrubber with keyboard support
- Persistent
24h/AM/PMreadout preference - Fullscreen
Clock Widgetmode (analog + digital 12-hour clock) - PWA install support with conditional in-app
Installbutton - Fan video customizer (
24 x 15slot painter with local persistence + original fallback) - Background fan-video health checks (Cloudflare Worker + YouTube Data API v3, cached 24h)
Dragthe ring thumb: scrub timeArrow keys: minute steps (Shift+ arrows = 15-minute steps)PageUp/PageDown: +/- 1 hourHome/End: start/end of daySpace: play/pauseN: resync to current local time- Click center clock readout: resync to current local time
H: toggle overlay hide/showM: mute/unmuteMute/Unmutebutton: toggle audio- Controls order/groups:
MuteShuffleCustomizePlay/Pause-Show/HideClock Widget24h/AMPM-Info 24h/AM/PMbutton: switch readout format (saved in localStorage)Customizebutton: open 24-hour slot editor, pick fan videos by country/city, and paint slotsInstallbutton: shown only when PWA install is available and app is not already installedClock Widgetbutton: enter fullscreen clock mode
- Fullscreen overlay clock (analog face with
12 / 3 / 6 / 9+ digitalh:mm AM/PM) - Slider/seek interactions are disabled
- Single tap/click anywhere: mute/unmute
- Double-tap/double-click anywhere: exit clock mode
PWA support is enabled through:
manifest.webmanifestsw.jsapp-shell caching service worker- App icons (
icons/icon-192.png,icons/icon-512.png)
Install can be triggered from browser UI, and from the in-app Install button when supported.
The app triggers a background request on page open to:
/api/youtube-health
That Worker endpoint:
- reads
wearehappyfrom.com.json - checks each video via YouTube Data API v3 (
videos.list,part=status) - flags videos where:
status.privacyStatus === "private"orstatus.embeddable === false
- caches the check result for
24hin the Worker cache
Set the API key as a Worker secret:
wrangler secret put YOUTUBE_API_KEYThen deploy:
wrangler deploy?t=HH:MM(optional seconds:?t=HH:MM:SS) Example:?t=13:45?hour=H(legacy/fallback) Example:?hour=9
When you scrub and release, the URL is updated with ?t=... for sharing.
index.html
manifest.webmanifest
sw.js
css/style.css
js/main.js
js/player.js
js/slider.js
js/time.js
js/hours.js
worker.js
icons/icon-192.png
icons/icon-512.png
per-hour-yt-urls.json
- Music/video property belongs to Pharrell Williams, Back Lot Music, and rights holders.
- Videos are embedded via YouTube.
- This project is an unofficial recreation of the original 24hoursofhappy.com experience and is not affiliated with the rights holders.
- coded by matijarma: https://github.com/matijarma/24hhclone