Inject a yyyy-mm-dd_hh:mm timestamp at build time via Vite's `define`
(app/vite.config.ts: __BUILD_DATE__, computed fresh on every
`vite build`/`vite dev` invocation) and render it next to the
Settings panel's title, so it's easy to tell which build is deployed.
- app/vite.config.ts: buildDateString() + define.__BUILD_DATE__
- app/src/vite-env.d.ts: ambient declaration for the injected constant
- app/src/components/SettingsPanel.tsx: render it next to "Settings"
- app/src/styles.css: .build-date styling
Rebuilt and redeployed to the repo root.
Previously the on-device Web Speech API (Chrome/Edge/Safari) was always
preferred, and the configured external transcription endpoint was only
used as a fallback when the browser had no speech API at all (Firefox).
Flip the priority in Composer.tsx: if a transcription endpoint is
configured in Settings, use it for dictation regardless of browser
support, since it's generally far more accurate. Fall back to the
browser's on-device SpeechRecognition only when no endpoint is set.
Update the Settings hint text and README to describe the new behavior.
Rebuilt and redeployed to the repo root.
The webserver serves the repo checkout directly as static files, so
index.html at the repo root must be the production build (pointing at
hashed /assets/*.js) rather than the dev template (/src/main.tsx),
which was being served with an unrecognized application/octet-stream
MIME type and blocked by the browser.
- Move src/, public/, scripts/, server/, package.json, vite.config.ts,
tsconfig.json, .env(.example), and the dev index.html into app/.
- Add app/scripts/deploy.mjs: copies app/dist/* into the repo root
after every `vite build`, cleaning up stale hashed filenames.
- Wire it into `npm run build` (app/package.json).
- Update run.sh to operate from app/, and .gitignore for the new layout.
- Commit the current build output (index.html, assets/, manifest,
sw.js, workbox-*.js, favicon.svg, icons/, LICENSE) to the repo root.
- Update README with the new project layout and deployment model.