We'd love to have you join the community! Below summarizes the processes that we follow.
- Reporting Issues
- Providing Extensions
- Working On Issues
- Contributing
- Continuous Integration
- Submitting Pull Requests
- Communication
- Code Architecture
- Maintainer Tasks
Before opening an issue, check the backlog of open issues to see if someone else has already reported it.
If so, feel free to add your scenario, or additional information, to the discussion. Or simply "subscribe" to it to be notified when it is updated.
If you find a new issue with the project we'd love to hear about it! The most important aspect of a bug report is that it includes enough information for us to reproduce it. So, please include as much detail as possible and try to remove the extra stuff that doesn't really relate to the issue itself. The easier it is for us to reproduce it, the faster it'll be fixed!
Please don't include any private/sensitive information in your issue!
Some of the best features of Kaiden aren't even in this repository! Kaiden provides a set of APIs that expand its capabilities through extensions.
Extensions add support for:
- AI providers (Gemini, OpenAI-compatible, OpenShift AI)
- Flow providers (like Goose for AI-powered automation)
- MCP (Model Context Protocol) server registries
- Container engines and Kubernetes providers
- UI elements like actions, badges, or views
You can create your own extension and contribute it to the project.
See the packages/extension-api documentation and existing extensions in the extensions/ directory for more information.
Often issues will be assigned to someone, to be worked on at a later time.
If you are a member of the Kaiden organization,
self-assign the issue with the status/in-progress label.
If you cannot set the label, add a quick comment in the issue asking that
the status/in-progress label be set and a maintainer will label it.
This section describes how to start a contribution to Kaiden.
You can develop on either: Windows, macOS or Linux.
Requirements:
- Node.js 24+
- pnpm v10.x (
corepack enable pnpm)
Optional Linux requirements:
- GNU C and C++ compiler
Fedora/RHEL
Ubuntu/Debian
dnf install gcc-c++
apt-get install build-essential
On Windows:
Clone and fork the project.
Fork the repo using GitHub site and then clone the directory:
git clone https://github.com/<you>/kaiden && cd kaidenFetch all dependencies using the command pnpm:
pnpm installRun the application in watch mode:
pnpm watchThe dev environment will track all files changes and reload the application respectively.
Write tests! Please try to write some unit tests when submitting your PR.
Run the unit tests using pnpm:
pnpm test:unitRun unit tests with coverage:
pnpm test:unit:coverageDepending on which part of the project you contribute to, you can specify to run tests for a specific module:
pnpm test:main # Main process tests
pnpm test:renderer # Renderer tests
pnpm test:preload # Preload tests
pnpm test:extensions # Extension testsFor development, you can run tests in watch mode:
pnpm test:watchCheck the npm script tasks in our package.json for more options.
When adding new features, it's important to ensure we don't introduce regressions. For this purpose we use E2E tests built with Playwright:
Build and run all E2E tests:
pnpm test:e2eRun E2E tests only (after building):
pnpm test:e2e:runView the test report:
pnpm test:e2e:reportAfter executing the E2E tests, you can check the results with:
pnpm exec playwright show-report tests/playwright/output/html-resultsIn case of an error, you can find more information in the tests/playwright/output folder:
- Video recordings in
videos/ - Screenshots of failures in
screenshots/ - Execution traces in
traces/(can be opened withnpx playwright show-trace <path/to/trace.zip>)
Code coverage reports are generated when running tests with coverage enabled:
pnpm test:unit:coverageCoverage reports can be found in the coverage output directory. When contributing new code, you should strive to maintain or improve overall code coverage.
Check that your code is properly formatted:
pnpm format:check # Check formatting
pnpm format:fix # Fix formatting issuesRun linting:
pnpm lint:check # Check for linting issues
pnpm lint:fix # Fix linting issuesRun type checking:
pnpm typecheck # Check all packages
pnpm typecheck:main # Main process only
pnpm typecheck:renderer # Renderer only
pnpm svelte:check # Svelte component type checkingYou may want to test the binary against your local system before pushing a PR. You can do so by running:
Development build (directory output, no packaging):
pnpm compileProduction builds:
pnpm compile:current # Current version
pnpm compile:next # With auto-publishing
pnpm compile:pull-request # Without publishingThe compiled binaries will be output to the dist/ folder.
macOS CODE SIGNING: When testing the compiled binary on macOS, you must ad-hoc sign the application before launching it. Without signing, macOS will terminate the app with a
Code Signature Invaliderror. Run the following command after compiling:# Compile pnpm compile:current # Sign the binary codesign --force --deep --sign - "dist/mac-arm64/Kaiden.app"
Whether it is a large patch or a one-line bug fix, make sure you explain in detail what's changing!
Make sure you include the issue in your PR! For example, say: Closes #XXX.
PRs will be approved by a maintainer listed in CODEOWNERS.
We typically require one approval for code as well as documentation-related PR's. If it is a large code-related PR, proof of review / testing (a video / screenshot) is required.
Avoid enabling auto-merge until the PR has undergone sufficient reviews and contributors have been given ample time for assessment. A maintainer will review the PR prior to the final merge. It's common for code PRs to require up to a week before merging due to reasons such as ongoing releases or dependencies on other PRs. Additionally, documentation PRs might take a few days for integration.
Some tips for the PR process:
- No PR too small! Feel free to open a PR against tests, bugs, new features, docs, etc.
- Make sure you include as much information as possible in your PR so maintainers can understand.
- Try to break up larger PRs into smaller ones for easier reviewing
- Any additional code changes should be in a new commit so we can see what has changed between reviews.
- Squash your commits into logical pieces of work.
We follow the Conventional Commits specification.
Some examples for correct titles would be:
fix: prevent racing of requestschore: drop support for Node 6docs: add quickstart guide
For Kaiden we use the following types:
fix:A bug fixchore:Very small change / insignificant impactdocs:Documentation only changes (ex. website)build:Changes that affect the build systemci:Changes to the CI (ex. GitHub actions)feat:A new featureperf:A code change that improves performancerefactor:A code change that neither fixes a bug nor adds a featurestyle:Changes that affect the formatting, but not the ability of the codetest:Adding missing tests / new tests
Title formatting:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
The sign-off is a line at the end of the explanation for the patch. Your signature certifies that you wrote the patch or otherwise have the right to pass it on as an open-source patch.
Then you just add a line to every git commit message:
Signed-off-by: Joe Smith <joe.smith@email.com>
Legal name must be used (no pseudonyms or anonymous contributions)
If you set your user.name and user.email git configs, you can sign your
commit automatically with git commit -s.
When creating a pull request in draft mode on GitHub, all CI/CD jobs are skipped by default. This behavior is intentional to avoid triggering unnecessary workflows while the pull request is still in progress.
If you want to run jobs for a pull request in draft mode, you need to manually apply the area/ci label to the pull request. Applying this label signals the CI system to execute the associated workflows, even though the pull request remains in draft.
- Open your pull request in draft mode.
- Navigate to the Labels section in the right-hand sidebar.
- Apply the
area/cilabel.
This action will trigger the configured CI/CD workflows for your draft pull request.
- Without the
area/cilabel: No jobs will run for your draft pull request. - With the
area/cilabel: Jobs will be triggered, allowing you to validate your work in progress.
This ensures that CI resources are used efficiently while still providing flexibility for testing during the draft stage.
- Submit your PR
- Reviewers are assigned by GitHub
- PRs require at least 1 approval (2 if it's a large code change)
NOTE: Confirm that your PR works on macOS, Windows and Linux if it's a significant change (not just a UI improvement)
NOTE: If your PR hasn't been merged in a reasonable amount of time, ping the assigned reviewers with
@
All pull requests and branch-merges automatically run:
- Format and lint checking
- Cross-platform builds (Windows, macOS, Linux)
- Unit tests
- E2E tests (triggered by PR checks)
You can follow these jobs in GitHub Actions: https://github.com/openkaiden/kaiden/actions
For bugs/feature requests please file issues
Discussions are possible using GitHub Discussions: https://github.com/openkaiden/kaiden/discussions/
Within Kaiden, we use the following frameworks and tools to build the desktop application:
- Electron: Cross-platform desktop application framework
- Svelte: Reactive UI/UX framework for building the interface
- Tailwind CSS: Utility-first CSS framework for styling
- Vite: Dev tooling for rapid development, debugging and deployment
- Inversify: Dependency injection container for plugin system
NOTE: We use TypeScript throughout the codebase for type safety.
Within Kaiden, we use the following for testing:
- Vitest: Unit tests - Written as
*.spec.tsfiles co-located with source code - Testing Library: Component tests - Utilities and best practices for writing component tests
- Playwright: E2E tests located in
tests/playwright/
Below are brief descriptions of Kaiden's folder structure and organization:
This is a pnpm monorepo with workspaces defined in pnpm-workspace.yaml:
extensions/: Extension packages that add functionality to Kaidengemini/: Google Gemini AI provider integrationgoose/: Goose flow execution providermcp-registries/: MCP server registriesopenai-compatible/: OpenAI-compatible API supportopenshift-ai/: OpenShift AI platform integration
packages/: Core application packagespackages/main: Main Electron process - handles system integration, extension loading, container/Kubernetes operations, and business logicpackages/renderer: Renderer Electron process - Svelte-based UI running in browser contextpackages/preload: Preload scripts - bridge layer for secure IPC communication between main and rendererpackages/preload-webview: Preload scripts for webview contextspackages/extension-api(also@openkaiden/api): Extension API providing TypeScript definitions for provider registration, configuration, commands, UI components, etc.packages/api: Internal API types and interfacespackages/webview-api: API for webview components
scripts/: Build and utility scriptstests/: E2E test suitetests/playwright/: Playwright E2E tests
node_modules/: Node.js packages and dependencies
NOTE: Each extension has its own
package.jsonwithmainpointing to./dist/extension.jsand must declareengines.kaidenversion compatibility.
Colors in Kaiden are managed by a color-registry.ts file to easily switch between light and dark mode.
When contributing a UI component to Kaiden that is colorized, you must figure out what color to use and how to reference it:
Steps:
- Open the
packages/main/src/plugin/color-registry.tsfile - Find the appropriate color category from the
initColors()function - Use the referenced color with the format
[var(--pd-<color>)]
Example:
- Choose what UI component you want to add (e.g., a new primary button)
- Look under
initColors()and findthis.initButton(), then scroll toprotected initButton() - Pick a color. For a "primary" button:
${button}primary-bg - Note the
constbelowprotected initButton()which isconst button = 'button-'; - The color can be referenced with
[var(--pd-button-primary-bg)] - Example:
<Button class="bg-[var(--pd-button-primary-bg)]"/>List of maintainer tasks to help the project run smoothly.
Each sprint a new "Triage manager" may be assigned.
Your responsibilities include:
- Reviewing the status/need-triage label on new issues. As a maintainer, you will need to categorize these issues under the correct area labels. Once categorized, remove the
status/need-triagelabel and apply the appropriate area label. - Evaluating the severity of new issues. If an issue is classified as "critical" or "high priority" and requires immediate attention, tag a maintainer in the issue and notify them appropriately.
- Identifying issues that are simple to resolve and marking them as "good first issue," thereby encouraging newcomers to contribute to the project.
- Evaluating any stale or lingering pull requests and pinging the respective contributors. If the pull request has been opened for an extensive amount of time, contact the contributor or push any changes required to get it merged. If there is no communication or the pull request is stale, consider closing them.