Thanks for your interest in contributing! Please read this before opening a PR.
git clone https://github.com/OpenConduit/Client.git
cd Client
npm install
npm start # dev mode
npm run lint # lint check
npx tsc --noEmit # type checkOpenConduit uses Electron with contextIsolation: true. The #1 rule:
Never import Node.js or Electron APIs in renderer files.
All Node/Electron code lives in src/main/. Communication with the renderer goes through the IPC bridge in src/preload.ts (exposed as window.api). IPC channels follow the pattern ai:*, mcp:*, settings:*, updater:*.
If you need a new capability in the renderer, add an IPC handler in src/main/ipc.ts and expose it in src/preload.ts.
This project uses Conventional Commits. Your commit messages directly control the changelog and version bump:
| Prefix | Example | Effect |
|---|---|---|
feat: |
feat: add Gemini provider |
minor bump, shown in changelog |
fix: |
fix: crash on empty system prompt |
patch bump, shown in changelog |
feat!: |
feat!: redesign settings schema |
major bump |
perf: |
perf: reduce re-renders in MessageList |
patch bump |
docs: |
docs: update MCP setup guide |
no bump |
chore: |
chore: update dependencies |
no bump |
ci: |
ci: fix release artifact path |
no bump |
refactor: |
refactor: extract useScroll hook |
no bump |
For breaking changes, add BREAKING CHANGE: <description> in the commit body, or use the ! suffix on any type.
A pre-commit hook (husky) runs npm run lint and npx tsc --noEmit automatically. Fix any errors before committing.
- Branch off
main - Keep PRs focused — one feature or fix per PR
- Ensure
npm run lintandnpx tsc --noEmitpass - Sign the Contributor License Agreement — the CLA bot will prompt you on your first PR
Releases are automated. You do not need to bump the version or edit CHANGELOG.md manually.
Stable release:
After merging enough feat: / fix: commits, release-please opens a Release PR. Merge it → tag is created → CI builds macOS DMG, Windows EXE, Linux deb/rpm → draft GitHub Release is created for review.
Beta release: Tag manually and push:
git tag v1.1.0-beta.1 && git push origin v1.1.0-beta.1CI builds all platforms and publishes immediately as a pre-release on GitHub (no draft, no website deploy).
- Tailwind CSS v4 — use
@import "tailwindcss", not@tailwinddirectives - Brand colors:
brand-blue,brand-violet,brand-cyan,brand-navy,brand-surface,brand-muted,brand-white - CSS variables:
var(--color-primary),var(--color-surface), etc. (defined insrc/styles/brand_tokens.css) - Dark mode uses the
classstrategy
API keys and secrets must never be stored in Zustand or committed to the repo. They go through IPC to electron-store (main process only). See src/main/store/settings.ts.