Thank you for your interest in contributing to pi-listen! This document provides guidelines and information for contributors.
- Code of Conduct
- Getting Started
- Development Setup
- Project Structure
- Making Changes
- Testing
- Pull Request Process
- Coding Standards
- Reporting Issues
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code.
- Fork the repository on GitHub
- Clone your fork locally
- Create a feature branch from
main - Make your changes
- Submit a pull request
- Bun ≥ 1.0 (package manager and test runner)
- SoX (for microphone recording:
brew install sox)
git clone https://github.com/codexstar69/pi-listen.git
cd pi-listen
bun installbun run check # typecheck + testpi-listen/
├── extensions/
│ ├── voice.ts # Main extension — state machine, recording, UI
│ └── voice/
│ ├── config.ts # Config loading, saving, migration
│ ├── deepgram.ts # Deepgram URL builder, API key resolver
│ ├── onboarding.ts # First-run setup wizard
│ └── text-processing.ts # Voice command detection, punctuation shortcuts
├── tests/ # Test suites (Bun test runner)
├── docs/
│ └── troubleshooting.md # Troubleshooting guide
├── package.json # Package manifest
└── tsconfig.json # TypeScript config
feat/description— New featuresfix/description— Bug fixesdocs/description— Documentation onlyrefactor/description— Code restructuringtest/description— Test additions/changes
Follow Conventional Commits:
feat: add VAD pre-filtering for voice input
fix: prevent orphan daemon process on startup timeout
docs: update backend comparison table
test: add config migration edge cases
refactor: extract socket path generation to config module
bun run testbun run test -- -t "config" # Tests matching "config"
bun test tests/config.test.ts # Specific filebun run check # typecheck + test- Tests live in
tests/with.test.tsextension - Use Bun's built-in test runner (
bun:test) - Mock external dependencies (filesystem, subprocesses)
- Test both success and error paths
- Aim for behavior-level testing, not implementation details
- Ensure all tests pass:
bun run check - Update documentation if you changed behavior
- Update CHANGELOG.md under
[Unreleased] - Write a clear PR description explaining what and why
- Keep PRs focused — one feature/fix per PR
- Respond to review feedback promptly
- Tests pass (
bun run check) - No TypeScript errors (
bun run typecheck) - CHANGELOG.md updated
- Documentation updated (if applicable)
- No secrets or tokens in code
- Use TypeScript strict mode
- Prefer
constoverlet - Use explicit return types for public functions
- Handle errors explicitly — no empty
catch {}blocks (except cleanup) - Use
node:prefix for Node.js built-in imports
- No hardcoded secrets or API keys
- No telemetry or analytics
- Keep error messages user-friendly
Please include:
- Pi version (
pi --version) - pi-listen version (check in Pi or
bun pm ls @codexstar/pi-listen) - OS and architecture (e.g., macOS 15.2, Apple Silicon)
- Steps to reproduce
- Expected vs actual behavior
- Output of
/voice test
- Describe the use case, not just the solution
- Explain how it fits with existing features
- Consider backward compatibility
Contributors are recognized in release notes and the project README. Thank you for helping make pi-listen better!