We welcome contributions! This guide covers everything you need to get started.
- Node.js 24+ for development, build, and test tooling; Electron's bundled runtime Node version is unchanged.
- pnpm 11.3.0 (
corepack enable && corepack prepare pnpm@11.3.0 --activate) - just command runner (
brew install just) - macOS (Electron desktop builds target macOS only)
# Fork on GitHub, then clone your fork
git clone git@github.com:YOUR_USERNAME/closedloop-electron.git
cd closedloop-electron
git remote add upstream git@github.com:closedloop-ai/closedloop-electron.git
# Install dependencies
just installjust desktop-test
just desktop-lint
just desktop-typecheckAll contributions come through forks. External contributors do not have push access to the main repository.
- Fork the repository on GitHub
- Clone your fork and add the upstream remote:
git clone git@github.com:YOUR_USERNAME/closedloop-electron.git cd closedloop-electron git remote add upstream git@github.com:closedloop-ai/closedloop-electron.git - Create a feature branch from
main:git fetch upstream git checkout -b feat/my-change upstream/main
feat/*— New featuresfix/*— Bug fixesdocs/*— Documentation changesrefactor/*— Code restructuring
git fetch upstream
git rebase upstream/main- Push your branch to your fork (not the upstream repo)
- Open a PR from your fork's branch to
closedloop-ai/closedloop-electron:main - Include a description of what changed and why
- Address review feedback with additional commits (don't force-push during review)
- A maintainer will squash merge to
mainafter approval
- TypeScript throughout — strict mode enabled
- ESLint for linting (
just desktop-lint) - Node.js built-in test runner for tests (
just desktop-test)
- Add tests for new functionality in
apps/desktop/test/ - Tests use Node.js built-in test runner (
node:test) - Run the full suite before submitting:
just desktop-test
Follow the format in .gitmessage:
<TICKET>: <description>
- bullet point details
Testing: what was tested
Risks: what could break
For external contributors without a ticket, use CONTRIB: as the prefix.