Modern, modular, PWA-ready Tabata timer with circular progress, audio cues, vibration, a11y, strict CSP, and offline support. GitHub Pages–ready out of the box.
- Circular progress ring and clear phase labels (Prep/Work/Rest/Done)
- Drift-corrected timing (time-based heartbeat; resilient to tab throttling)
- Bilingual UI (English/Türkçe) with instant switching; preference is saved
- Audio cues (short/long beeps) + optional finish sound
- Vibration feedback (on supported devices)
- Remembers set count via
localStorage - Keyboard shortcut: Space to Start/Pause
- Accessibility:
role="timer", aria-live regions - Security: no inline code/styles, strict CSP
- PWA: Service Worker for offline and fast reloads
- SEO-friendly: meta description, canonical URL, Open Graph/Twitter cards, JSON‑LD structured data, robots.txt, sitemap.xml, hreflang links
- Development (modular sources): open
tabata-timer.htmldirectly. - Production (minified build):
- Run
node scripts/build.js - Open
dist/tabata-timer.html
- Run
- Language via URL:
?lang=enor?lang=tr
Note: PWA (Service Worker) works only over http(s). For local testing:
python3 -m http.server 8000
open http://localhost:8000/dist/tabata-timer.htmlBuild creates docs/ automatically for Pages.
- Settings → Pages → Deploy from a branch → Branch:
main, Folder:/docs - Then open
https://<user>.github.io/<repo>/
Manifest start_url is ./, so Pages uses docs/index.html as the app entry.
Icons are included (SVG, any/maskable) for installable PWA experience.
- Canonical URL, robots.txt and sitemap.xml are generated during build (dist/ and docs/)
- Open Graph/Twitter card use
social/og-image.svg(you can replace with PNG/JPG later); width=1200, height=630 are declared - JSON‑LD (SoftwareApplication) is now inlined inside HTML for maximum compatibility
- Hreflang links include
en,trandx-default - Favicon and Apple touch icon are linked
.
├─ tabata-timer.html # App shell using modular sources
├─ styles/
│ └─ app.css # Base styles + phase classes
├─ src/
│ ├─ main.js # Entry/wiring
│ ├─ timer.js # State machine
│ ├─ ui.js # DOM updates & phases
│ └─ audio.js # Web Audio + beeps/finish
├─ scripts/
│ └─ build.js # Bundle+minify to dist/, mirror to docs/
├─ dist/ # Production build (auto)
├─ docs/ # GitHub Pages build (auto)
├─ sw.js # Service Worker (source)
└─ manifest.webmanifest # PWA manifest
Requires Node.js for building only. App has no runtime deps.
node scripts/build.js→ updatesdist/anddocs/
- Default: Web Audio short/long beeps
- Optional finish sound: add
assets/audio/finish.mp3- Dev:
assets/audio/finish.mp3 - Pages/Prod:
docs/assets/audio/finish.mp3
- Dev:
- Browsers require user interaction to start audio; first Start click enables it.
sw.js: cache-first for same-origin; serves last cached offlinemanifest.webmanifest: name, theme color, standalone- Works only over http(s), not
file://
role="timer", aria-live updates- Space toggles start/pause
- Vibration via
navigator.vibrate html[lang]updates when switching language
- Strict CSP:
script-src 'self',style-src 'self' - No external fonts/audio by default (can be added with CSP updates)
- Colors: edit CSS vars in
styles/app.css - Phase durations: change
PREP_TIME,WORK_TIME,REST_TIMEinsrc/main.js - Branding: tweak
.brandintabata-timer.html; shimmer instyles/app.css
Minimal, modern ve PWA özellikleriyle zenginleştirilmiş bir Tabata zamanlayıcısı. Modüler mimari, sıkı CSP, erişilebilirlik ve offline desteği ile tek tıkla kullanıma hazır.
- Dairesel ilerleme çubuğu ve net durum etiketleri (Hazırlan/Çalış/Mola/Bitti)
- Sapma düzeltmeli zamanlama (gerçek-zaman kalp atımı; sekme kısıtlamalarına dayanıklı)
- Çift dilli arayüz (Türkçe/İngilizce); anında geçiş ve tercih kaydı
- Ses uyarıları (kısa/uzun bip) + bitişte özel ses için opsiyon
- Titreşim (destekleyen cihazlarda)
- Set sayısını
localStorageile hatırlar - Klavye kısayolu: Boşluk ile Başlat/Duraklat
- Erişilebilirlik:
role="timer", canlı bölge (aria-live) - Güvenlik: Inline kod/stil yok, sıkı Content Security Policy
- PWA: Service Worker ile offline çalışma ve hızlı tekrar açılış
- SEO uyumlu: meta description, canonical URL, Open Graph/Twitter kartları, JSON‑LD, robots.txt, sitemap.xml, hreflang linkleri
- Geliştirme (modüler kaynaklarla):
tabata-timer.htmldosyasını tarayıcıda aç.
- Üretim (minify edilmiş derleme):
node scripts/build.jsçalıştır.dist/tabata-timer.htmldosyasını aç.
- URL ile dil seçimi:
?lang=enveya?lang=tr
Not: PWA (Service Worker) yalnızca http(s) üzerinden aktif olur. Test için basit bir yerel sunucu kullan:
# Python 3 ile, kök dizinden
python3 -m http.server 8000
open http://localhost:8000/dist/tabata-timer.htmlBuild sonrası docs/ klasörü otomatik üretilir ve yayın için hazırdır.
- GitHub Pages: Settings → Pages → Deploy from a branch → Branch:
main, Folder:/docs - Yayınlandıktan sonra uygulama
https://<kullanıcı-adı>.github.io/<repo-adı>/adresinden açılır.
Manifest start_url değeri ./ olduğundan Pages altında kök dizindeki index.html (docs/index.html) baz alınır.
PWA ikonları (SVG; any/maskable) eklidir, kurulabilir uygulama deneyimi sunar.
- Build sırasında canonical URL, robots.txt ve sitemap.xml oluşturulur (dist/ ve docs/)
- Open Graph/Twitter kartı için
social/og-image.svgkullanılır (ileride PNG/JPG ile değiştirilebilir); width=1200, height=630 belirtilir - JSON‑LD (SoftwareApplication) en yüksek uyumluluk için HTML içine inline eklendi
- Hreflang linkleri
en,trvex-defaultiçerir - Favicon ve Apple touch icon bağlandı
.
├─ tabata-timer.html # Modüler kaynakları kullanan ana sayfa
├─ styles/
│ └─ app.css # Temel stiller + faz sınıfları
├─ src/
│ ├─ main.js # Uygulama giriş noktası (event wiring)
│ ├─ timer.js # Zamanlayıcı durum makinesi
│ ├─ ui.js # DOM güncellemeleri ve faz sınıfları
│ └─ audio.js # Web Audio + bip/bitiş sesi
├─ scripts/
│ └─ build.js # Basit bundle + minify + dist/docs oluşturma
├─ dist/ # Üretim çıktıları (auto)
├─ docs/ # GitHub Pages çıktısı (auto)
├─ sw.js # Service Worker (kaynak)
└─ manifest.webmanifest # PWA manifest
- Gereksinimler: Node.js (yalnızca build için). Uygulama kendisi bağımlılık gerektirmez.
- Komut:
node scripts/build.js→dist/vedocs/güncellenir.
- Varsayılan: Web Audio ile kısa/uzun tonlar (bip) üretilir.
- Opsiyonel bitiş sesi:
assets/audio/finish.mp3dosyasını ekleyerek zengin ses kullan.- Dosyayı şu yollarla erişilir kılabilirsiniz:
- Geliştirme:
assets/audio/finish.mp3(kökten) - Üretim/Pages:
docs/assets/audio/finish.mp3(SW runtime’da cache’ler)
- Geliştirme:
- Dosyayı şu yollarla erişilir kılabilirsiniz:
- Ses çalma için tarayıcıların “kullanıcı etkileşimi” kısıtı olduğundan, ilk Başlat tıklaması ses motorunu etkinleştirir.
sw.js: Aynı origin isteklerinde cache-first stratejisi uygular; offline’da son cachelenen sürümü sunar.manifest.webmanifest: Uygulama adı, tema rengi ve standalone görünüm ayarları.- Not: Service Worker,
file://altında çalışmaz.http(s)altında servis edilir.
role="timer",aria-livebölgeleri- Boşluk tuşu ile başlat/duraklat
- Titreşim desteği (mobil cihazlarda
navigator.vibrate) - Dil değiştirdiğinde
html[lang]güncellenir
- Sıkı CSP:
script-src 'self',style-src 'self'(inline script/stil yok) - Harici font/ses kullanılmıyor (isteğe bağlı eklenebilir; CSP güncellemesi gerekir)
- Renkler:
styles/app.cssiçindeki CSS değişkenlerini (:root) güncelle. - Faz süreleri:
src/main.jsbaşındaki sabitleri (PREP_TIME,WORK_TIME,REST_TIME) değiştir. - Brand başlığı:
tabata-timer.htmliçindeki.brandbloğunu düzenle; shimmer animasyonustyles/app.css→@keyframes brand-sweep.
- Kaynaklarla çalış:
tabata-timer.html(modüler), hızlı denemeler için ideal. - Prod test:
node scripts/build.js→dist/veyadocs/üzerinden test et. - “Drift” telafisi istersen zamanlayıcıyı gerçek zaman damgalı planlayıcıya geçirmek kolayca eklenebilir.
Her türlü geliştirme talebin (tema/dark mode, süre ayar paneli, drift düzeltme, ikonlar) için PR/issue açabilirsin.