{"id":51135579,"url":"https://github.com/bmlt-enabled/share-timer","last_synced_at":"2026-06-25T17:30:55.722Z","repository":{"id":345185765,"uuid":"1184841131","full_name":"bmlt-enabled/share-timer","owner":"bmlt-enabled","description":"Share timer for 12-step meetings","archived":false,"fork":false,"pushed_at":"2026-03-18T02:59:57.000Z","size":132,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-18T17:58:25.172Z","etag":null,"topics":["bmlt-svelte"],"latest_commit_sha":null,"homepage":"http://timer.bmlt.app/","language":"Svelte","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/bmlt-enabled.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-03-18T01:33:27.000Z","updated_at":"2026-03-18T03:00:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bmlt-enabled/share-timer","commit_stats":null,"previous_names":["bmlt-enabled/share-timer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/bmlt-enabled/share-timer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmlt-enabled%2Fshare-timer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmlt-enabled%2Fshare-timer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmlt-enabled%2Fshare-timer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmlt-enabled%2Fshare-timer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmlt-enabled","download_url":"https://codeload.github.com/bmlt-enabled/share-timer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmlt-enabled%2Fshare-timer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34786225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["bmlt-svelte"],"created_at":"2026-06-25T17:30:55.663Z","updated_at":"2026-06-25T17:30:55.715Z","avatar_url":"https://github.com/bmlt-enabled.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Share Timer\n\nA mobile-friendly share timer for 12-step meetings. Keeps shares fair and on time with audio alerts, a speaker queue, and a share time calculator.\n\n## Features\n\n- **Countdown timer** with an animated SVG ring that changes color as time runs low\n- **Configurable thresholds** — set share duration, warning time, and alarm time via the settings modal\n- **Speaker queue** — add names, work through the list, and auto-start the timer for each person\n- **Share time calculator** — input total meeting minutes and number of people to get the per-person time rounded to the nearest 15-second interval, with an Apply button to load it directly into the timer\n\n## Audio\n\nAlerts are generated entirely in the browser using the **[Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)** — no audio files required. A single persistent `AudioContext` is created and reused for all beeps, avoiding the overhead of spinning up a new context on every alert.\n\nOn **iOS**, the Web Audio API is blocked until a user gesture occurs. The timer handles this by calling `audioContext.resume()` the moment the user taps Start. On **iOS 17+**, the app also sets `navigator.audioSession.type = \"playback\"` so that alert sounds fire even when the device is on silent.\n\n## Preset URLs\n\nSettings can be encoded as URL parameters, making it easy to bookmark or share a pre-configured timer for a specific meeting format.\n\n```\nhttps://timer.bmlt.app/?mins=3\u0026warn=60\u0026danger=10\u0026tone=bell\n```\n\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `mins` | Share duration in minutes | `3` |\n| `warn` | Warning alert threshold in seconds | `60` |\n| `danger` | Alarm threshold in seconds (`0` to disable) | `10` |\n| `tone` | Alert tone | `soft`, `bell`, `buzz`, `wacky`, `arcade`, `scifi`, `alarm`, `laser` |\n\nURL params take priority over saved localStorage values. After saving settings the URL is automatically updated via `history.replaceState` so the address bar always reflects the current configuration. The **Copy Link** button in the settings modal builds a shareable URL from the current settings without requiring a save first.\n\n## Screen Wake Lock\n\nThe app uses the **[Screen Wake Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API)** to prevent the device screen from dimming or locking while the timer is running. Without this, a phone left on a table would lock mid-session and miss the audio alerts.\n\nThe wake lock is acquired when the timer starts and released when it is paused, reset, or expires. Because the browser automatically drops the wake lock whenever the page is hidden (e.g. the user switches apps), the app re-requests it as soon as the page becomes visible again while the timer is still running. On browsers that do not support the API the feature is silently skipped.\n\n## Stack\n\n- [Svelte 5](https://svelte.dev) + TypeScript\n- [Vite](https://vitejs.dev)\n- [Tailwind CSS v4](https://tailwindcss.com)\n- [Flowbite Svelte](https://flowbite-svelte.com)\n\n## Development\n\n```bash\nnpm install\nnpm run dev\n```\n\n```bash\nnpm run build   # production build\nnpm run lint    # prettier + eslint + svelte-check\n```\n\n## Attribution\n\nThis project is developed and maintained by [BMLT Enabled](https://bmlt.app), a volunteer group building open-source tools for the recovery community.\n\n- GitHub: [bmlt-enabled/share-timer](https://github.com/bmlt-enabled/share-timer/)\n- Bootstrapped with [svelte5-vite-ts-tailwind-eslint](https://github.com/pjaudiomv/svelte5-vite-ts-tailwind-eslint/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmlt-enabled%2Fshare-timer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmlt-enabled%2Fshare-timer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmlt-enabled%2Fshare-timer/lists"}