Find a meeting time that works across timezones — no accounts, no backend.
SyncHours is a static timezone meeting planner. Add 2–6 people in different cities, set each person’s local work window, and see overlapping hours over the next five days. Share the plan with a single URL hash — everything lives in the browser.
Live (after Pages enabled): https://xxx1694.github.io/SyncHours/
Repo: https://github.com/XXX1694/SyncHours
Deploy gate: open Settings → Pages, set source to GitHub Actions (or branch
gh-pages//), then re-run the deploy workflow. Details in DEPLOY.md.
- 2–6 people — name, city, and local work hours for each participant
- Work windows — per-person start/end hours in their local timezone
- 5-day overlap timeline — hour-by-hour availability and best overlapping ranges
- Share via URL hash — encode the full plan in the link; no server round-trip
- No backend — fully static; works offline once loaded
- IANA timezones via the browser
IntlAPIs — DST-aware local conversions
| Layer | Choice |
|---|---|
| Bundler / dev server | Vite |
| Language | Vanilla TypeScript |
| Timezones | Intl + IANA zone IDs |
| Hosting | GitHub Pages (static dist/) |
No framework, no database, no auth.
Requires Node.js 22+ (matches CI) and npm.
npm install
npm run dev # Vite dev server
npm run build # typecheck + production build → dist/
npm run preview # serve dist/ locally
npm run smoke # post-build smoke checks
npm run typecheck # tsc --noEmit onlyOpen the URL printed by npm run dev (typically http://localhost:5173/SyncHours/). The Vite base is /SyncHours/ so local paths match production.
Production is published with GitHub Actions → GitHub Pages.
- Workflow:
.github/workflows/deploy.yml - Triggers: push to
main, or manualworkflow_dispatch - Steps:
npm ci→npm run build→npm run smoke→ uploaddist/→ deploy Pages
Production URL:
https://xxx1694.github.io/SyncHours/
After the first successful run, enable Settings → Pages → Source = GitHub Actions if it is not already set. See DEPLOY.md for custom domains, Cloudflare Pages, and canonical URL updates.
Ad placement is reserved below the overlap results — never in the hero or above-the-fold tool.
- Guide: ADS.md
- DOM target:
aside#ad-slot→.ad-placeholder - Supported networks: Google AdSense, Yandex RSYA
A client stub is defined on window:
window.synchoursAnalytics?.track(event, props?)In development it logs to the console. Wire it to your provider of choice (Plausible, Umami, GA4, etc.).
A Plausible snippet is commented in index.html:
<!-- Analytics: uncomment and set your domain after deploy
<script defer data-domain="YOUR_DOMAIN" src="https://plausible.io/js/script.js"></script>
-->Uncomment after deploy and replace YOUR_DOMAIN with your production hostname (e.g. xxx1694.github.io or a custom domain).
SyncHours — статический планировщик встреч по часовым поясам (Vite + TypeScript). Добавьте 2–6 человек, укажите рабочие окна, посмотрите пересечения на 5 дней и поделитесь ссылкой (состояние в hash URL). Бэкенда нет.
| Команда | Назначение |
|---|---|
npm install |
зависимости |
npm run dev |
локальная разработка |
npm run build |
сборка в dist/ |
npm run preview |
превью сборки |
npm run smoke |
smoke-тесты |
npm run typecheck |
проверка типов |
Прод: https://xxx1694.github.io/SyncHours/ через GitHub Actions. Реклама — ADS.md (#ad-slot / .ad-placeholder). Аналитика — window.synchoursAnalytics и закомментированный Plausible в index.html. Лицензия MIT.