{"id":44682897,"url":"https://github.com/chrisreddington/timestamp","last_synced_at":"2026-02-15T05:05:38.490Z","repository":{"id":331558964,"uuid":"1129621755","full_name":"chrisreddington/timestamp","owner":"chrisreddington","description":"A time tracking app with countdowns, timers, and world clocks that you can customize and share instantly. Pick a date, choose a theme, add a message. Your countdown gets a unique URL that works for anyone who opens it.","archived":false,"fork":false,"pushed_at":"2026-01-23T09:39:33.000Z","size":4856,"stargazers_count":17,"open_issues_count":5,"forks_count":5,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-23T17:41:36.485Z","etag":null,"topics":["clock","contributions","countdown","countdown-timer","design","extensible","looking-for-contributors","theme-development","theme-ui","timer","ui-design","user-interface"],"latest_commit_sha":null,"homepage":"http://chrisreddington.com/timestamp/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrisreddington.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-07T10:49:59.000Z","updated_at":"2026-01-23T09:39:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chrisreddington/timestamp","commit_stats":null,"previous_names":["chrisreddington/timestamp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/chrisreddington/timestamp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisreddington%2Ftimestamp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisreddington%2Ftimestamp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisreddington%2Ftimestamp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisreddington%2Ftimestamp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrisreddington","download_url":"https://codeload.github.com/chrisreddington/timestamp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisreddington%2Ftimestamp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29469933,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T04:35:06.950Z","status":"ssl_error","status_checked_at":"2026-02-15T04:33:41.357Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clock","contributions","countdown","countdown-timer","design","extensible","looking-for-contributors","theme-development","theme-ui","timer","ui-design","user-interface"],"created_at":"2026-02-15T05:05:38.433Z","updated_at":"2026-02-15T05:05:38.485Z","avatar_url":"https://github.com/chrisreddington.png","language":"TypeScript","readme":"# ⏱️ Timestamp\n\n**Your stamp on time.**\n\n[![CI/CD Status](https://github.com/chrisreddington/timestamp/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/chrisreddington/timestamp/actions/workflows/ci-cd.yml)\n\n[**Try it now →**](https://chrisreddington.com/timestamp/) No signup. No install. Just go.\n\n## What is Timestamp?\n\nTimestamp is a countdown app where **every countdown is a URL**. Pick a date, choose a theme, add a message. Your countdown gets a unique link that works for anyone who opens it. Pure client-side magic.\n\n**Use it for:**\n\n- 🎆 New Year's Eve countdowns with friends worldwide\n- ⏱️ Pomodoro timers and meeting breaks  \n- 🚀 Product launches and livestream hype\n- 🎂 Birthday countdowns to share on social media\n\n## Three Countdown Modes\n\nTimestamp supports three distinct countdown modes, each designed for different use cases:\n\n| Mode | Try it | What it does |\n|------|--------|--------------|\n| **🏠 Local Time** — *Wall clock* | [🎆 New Year 2027](https://chrisreddington.com/timestamp/?mode=wall-clock\u0026target=2027-01-01T00:00:00\u0026theme=fireworks) | Countdown to midnight in *your* timezone. Each city celebrates at their own midnight. |\n| **🌐 Same Moment** — *Absolute time* | [🚀 Product launch](https://chrisreddington.com/timestamp/?mode=absolute\u0026target=2026-07-01T17:00:00Z\u0026theme=contribution-graph\u0026message=Launch%20Day!) | Everyone counts to the same instant worldwide. Perfect for product launches or global livestreams. |\n| **⏱️ Timer** — *Your countdown* | [⏱️ 5-minute break](https://chrisreddington.com/timestamp/?mode=timer\u0026duration=300\u0026theme=contribution-graph\u0026message=Break%20time!) | Fixed duration countdown. Starts when you open the link. Great for Pomodoro sessions. |\n\n\u003e 💡 **Tip:** The timer example is great for seeing the celebration animation when it hits zero!\n\n## Available Themes\n\nFind all the themes in the [Theme Gallery](src/themes/README.md), and experience them for yourself on [Timestamp](https://chrisreddington.com/timestamp/).\n\n## Features\n\n### 🔗 Instant URL Sharing\nEvery configuration generates a shareable URL. Change any setting and the URL updates automatically — just copy and share.\n\n### 📱 Install as an App\nTimestamp is a Progressive Web App (PWA), which means you can install it from your browser:\n\n- **Desktop** (Chrome/Edge): Click ⊕ in the address bar\n- **iOS**: Share → \"Add to Home Screen\"\n- **Android**: Menu → \"Install app\"\n\n#### PWA Features\n\n- **Offline support**: The app works without an internet connection after the first visit\n- **Full-screen mode**: Runs like a native app when installed\n- **Automatic updates**: The app checks for updates and prompts you to refresh\n\n\u003e **Note on notifications**: Notifications were investigated but are not currently implemented. Local browser notifications only work on macOS/iOS while the app is open. Arguably this could be useful if you're switching browser tabs, but may not be worth the additional complexity. Background notifications would require server infrastructure (Web Push via APNs/FCM). See [PWA instructions](.github/instructions/pwa.instructions.md#notifications---not-currently-implemented) for details.\n\n### 🗺️ World Map\nWall-clock mode shows a day/night map with real-time solar position. You can see which cities are celebrating and which are waiting.\n\n### ♿ Accessibility\n- Full keyboard navigation with shortcuts (see below)\n- Screen reader announcements for countdown updates (via orchestrator's `AccessibilityManager`)\n- Orchestrator provides accessibility hooks (`onAnimationStateChange`) and foundations (`reducedMotionManager`, `data-reduced-motion` attribute, container ARIA attributes) that themes implement to ensure consistent behavior across all themes\n\n### ⌨️ Keyboard Shortcuts\n\nTimer mode supports global keyboard shortcuts for hands-free control:\n\n\u003e **See [Keyboard Shortcuts Guide](docs/KEYBOARD-SHORTCUTS.md) for complete documentation.**\n\n| Key | Action | Notes |\n|-----|--------|-------|\n| `Space` | Play/Pause toggle | Works in fullscreen and normal view |\n| `Enter` | Reset timer | Resets to original duration |\n| `R` | Reset timer | Case-insensitive alternative |\n| `Escape` | Exit fullscreen | Browser default, also supported |\n\n**Smart behavior**: Shortcuts are disabled when:\n- Typing in any text input or textarea\n- Modal dialogs are open (e.g., theme picker on the timer page)\n- Timer-only shortcuts are disabled when you're in wall-clock or absolute modes\n\n\u003e 💡 **Fullscreen tip**: In timer mode, move your mouse in fullscreen to reveal timer controls alongside the exit button. They auto-hide after 3 seconds (or stay visible while hovering).\n\n\n## Run Locally\n\n```bash\ngit clone https://github.com/chrisreddington/timestamp.git\ncd timestamp\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:5173`. That's it.\n\n\u003e **Prefer ephemeral environments?** Development works great in [GitHub Codespaces](https://docs.github.com/en/codespaces/overview) or [Dev Containers](https://code.visualstudio.com/docs/devcontainers/containers).\n\n\n## For Developers\n\nTimestamp uses a **modular, pluggable architecture**. The core app handles timing and state management, and provides accessibility foundations (reduced motion detection, screen reader announcements, ARIA structure). Themes handle rendering and implement accessibility hooks (responding to animation state changes, ensuring color contrast). This separation means you can build wildly creative themes without touching countdown logic.\n\n### Quick Links\n\n| I want to... | Go here |\n|--------------|---------|\n| **Build a new theme** | [Theme Development Guide](docs/THEME_DEVELOPMENT.md) |\n| **Understand the architecture** | [Architecture Overview](docs/ARCHITECTURE.md) |\n| **See URL parameters** | [Deep Linking Reference](docs/DEEP-LINKING.md) |\n| **Fix a bug or add a feature** | [Contributing Guide](CONTRIBUTING.md) |\n\n### Architecture at a Glance\n\n```\nsrc/\n├── app/\n│   ├── orchestrator/     # Core coordinator — timing, state, theme lifecycle\n│   └── pwa/              # Service worker and PWA setup\n├── themes/               # Pluggable visual renderers\n│   ├── registry/         # Single source of truth for theme metadata\n│   ├── contribution-graph/\n│   ├── fireworks/\n│   └── shared/           # Cleanup utilities shared by all themes\n├── components/           # UI components (landing page, buttons, world map)\n└── core/                 # Shared types, state management, utilities\n```\n\n**Key concept:** The **orchestrator** decides *when* to update. **Themes** decide *how* to render. The orchestrator handles timing accuracy, tab visibility, reduced motion, and celebration state — themes just respond to lifecycle callbacks.\n\n📖 **Full details:** [Architecture Overview](docs/ARCHITECTURE.md)\n\n### Build a Theme in 5 Minutes\n\n```bash\nnpm run theme create my-theme\nnpm run generate:previews -- --theme=my-theme\nnpm run dev\n```\n\nVisit `http://localhost:5173/?mode=timer\u0026duration=30\u0026theme=my-theme` to see your theme in action.\n\n📖 **Full guide:** [Theme Development Guide](docs/THEME_DEVELOPMENT.md)\n\n## Contributing\n\n| I want to... | Start here |\n|--------------|-----------|\n| Report a bug | [Open an issue](https://github.com/chrisreddington/timestamp/issues/new) |\n| Build a theme | [Theme Development Guide](docs/THEME_DEVELOPMENT.md) |\n| Fix something | [Open issues](https://github.com/chrisreddington/timestamp/issues) · [Contributing Guide](CONTRIBUTING.md) |\n\n### Validation Before PR\n\n```bash\nnpm run validate:iteration\n```\n\nThis runs: typecheck → lint → unit tests → build → E2E tests\n\n## Learn More\n\n| Topic | Link |\n|-------|------|\n| Architecture deep dive | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) |\n| Building themes | [docs/THEME_DEVELOPMENT.md](docs/THEME_DEVELOPMENT.md) |\n| URL parameters | [docs/DEEP-LINKING.md](docs/DEEP-LINKING.md) |\n| Code of Conduct | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) |\n| Security Policy | [SECURITY.md](SECURITY.md) |\n\n## License\n\n[MIT](LICENSE)\n\n\n**[Try the app →](https://chrisreddington.com/timestamp/)**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisreddington%2Ftimestamp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrisreddington%2Ftimestamp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisreddington%2Ftimestamp/lists"}