etro is a static, touch-first metronome built for live performance.
It keeps the main controls large, the setlist close at hand, and the timing stable with a Web Audio scheduler instead of setInterval.
- Web Audio
currentTimescheduler for steadier timing - Setlist workflow with add, reorder, select, delete, and reset
- BPM range
20-240 - Time signatures:
4/4,6/8,3/4, and custom - Custom signatures support top values
1-32and bottom values2,4,8, or16such as13/16 - Accent toggle with editable accent-map beats
- Double Time subdivision toggle per song that preserves the base tempo
- Export/share links and import flow with destructive-action confirmation
- Persistent local data via
localStorage - Installable PWA with offline support and Wake Lock when available
etrois a non-commercial project.etrois open source.- Contributions are welcome.
etro is configured as a Progressive Web App (PWA):
- Installable on supported mobile and desktop browsers
- Offline-capable after first load with a cache-first local app shell and background refresh checks
- Standalone app mode with theme color and app icons
manifest.json- web app manifestsw.js- service worker cache/offline logicassets/icons/- app icons (192,512,maskable, Apple touch icon, favicon)
- Android (Chrome/Edge): open the site, then use Install app / Add to Home screen
- iOS (Safari): open the site, tap Share -> Add to Home Screen
- Desktop Chromium browsers: use the install icon in the address bar
Note: service workers require HTTPS (or localhost). Vercel provides HTTPS by default.
- Tap
Exportin the setlist panel to generate a link. - Use
Copy Linkor nativeSend. - On another device, open
Import, paste the link or code, review the replacement, then tapReplace Setlist.
Notes:
- Import replaces the current setlist only after a confirmation step.
- Opening a URL with
#sl=...pre-fills the import modal automatically.
On first load and after reset:
- 1 song
- Empty title (shown as
Untitledin the main view) - BPM
72 - Time signature
4/4 - Accent off
- Double Time off
The setlist never stays empty.
index.html- app markup and share metadataassets/css/styles.css- source stylesheet for the local app-shell buildassets/css/app-shell.css- generated CSS shipped by the appassets/fonts/- self-hosted font files and licensesassets/js/app.js- app logic and audio schedulermanifest.json- PWA manifestsw.js- PWA service worker
Install dependencies once, then build the local CSS bundle:
npm install
npm run build:cssServe the app:
python3 -m http.server 8080Open http://localhost:8080.
When you change index.html, assets/js/app.js, or assets/css/styles.css, run npm run build:css again before testing or committing.
etro now self-hosts Alliance No.1 locally as the primary UI font. The app no longer depends on any remote font CDN at runtime.
If you want to try another licensed font later, start in assets/fonts/README.md.
- Fork the repo:
https://github.com/widodoalfianto/etro - Create a branch.
- Open a pull request with a clear summary.
Bug reports and feature requests are also welcome in Issues.
- Audio starts after user interaction because of browser autoplay policy
- On iPhone/iPad, Silent Mode playback for Web Audio depends on
navigator.audioSessionsupport; modern Safari/WebKit releases supportplaybackaudio-session mode, older iOS versions may still mute web audio - Wake Lock support depends on browser and device
