Thanks for your interest. Out Loud is built in the open — bug reports, code, translations, and new voices are all welcome.
- Ground rules
- Reporting bugs
- Proposing features
- Development setup
- Code style
- Pre-commit hook
- Before you open a pull request
- Pull request checklist
- Project layout
- Adding a voice
- Questions
- Be kind and respectful.
- Keep changes focused — one logical change per pull request.
- Don't commit binaries, models, or credentials. Models are downloaded at runtime; the repo stays small.
- By contributing, you agree your contributions are licensed under the MIT License.
Open an issue using the Bug report template. Please include:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Your OS + app version
- Relevant logs (the terminal where you ran the app, or the Out Loud log panel)
Open an issue using the Feature request template first. A quick conversation before code saves everyone time.
git clone https://github.com/light-cloud-com/out-loud.git
cd out-loud
npm install
npm run electron-ui:install
npm run electron:devSee the root README for the full build matrix.
- TypeScript + React in
electron/andelectron-ui/. - Prettier handles formatting — run
npm run formator let the pre-commit hook do it. - ESLint catches real bugs — run
npm run lint(ornpm run lint:fix). - EditorConfig (
.editorconfig) keeps indentation consistent across editors. - Prefer small, well-named functions over comments that explain what the code does.
- Keep the main process (
electron/main.ts) thin — push logic into workers and modules.
A husky hook runs lint-staged on every git commit:
- ESLint with
--fixon staged.ts/.tsx/.js/.mjs/.cjsfiles - Prettier on staged
.json/.md/.yml/.yaml/.css/.htmlfiles
You generally won't need to think about formatting — it happens at commit time. If a file can't be auto-fixed, the commit will fail with a clear error message.
Run these locally and make sure they pass:
npm run check # lint + format:check + knip + electron:compile
npm test # unit testsCI runs the same checks.
- Branch is up to date with
main - Tests added or updated where it makes sense
-
npm run knipis clean - UI changes include a screenshot or short screen recording
- Commit messages describe why, not just what
See Repository layout in the root README. Deeper docs:
docs/app/architecture.md— Electron app internalsdocs/app/api.md— HTTP API referencedocs/extensions/testing.md— extension E2E testsdocs/build/mac-app-store.md— MAS distribution
Kokoro voices are embedded ONNX files under electron/models/. To add one:
- Register the voice metadata in
electron-ui/src/components/VoiceSelect.tsx(id, name, language) - Register the language prefix mapping in
electron/main.ts(getVoiceLang) - Add the voice entry to
getVoicesList()inelectron/main.tsso the HTTP API exposes it
For new languages, espeak-ng must support them too — check the available languages in the package.
If anything in this guide is unclear or out of date, open an issue or a PR to fix it. That's a contribution too.