Thanks for wanting to contribute. Synergy is built by a small team, and outside contributions genuinely help — whether that's a bug report, a documentation fix, or a new feature.
This guide covers what you need to get started.
Open a GitHub Issue with:
- What you expected to happen
- What actually happened
- Steps to reproduce (the more specific, the faster the fix)
- Your environment: OS, Bun version, Synergy version
If you're not sure whether something is a bug or intended behavior, open the issue anyway. We'd rather triage a question than miss a real problem.
For feature ideas or design discussions, open a GitHub Issue or start a Discussion. A good suggestion explains the problem you're trying to solve, not just the solution you have in mind — that context helps us find the right approach.
Use the Bun version pinned by the root packageManager field. Then:
git clone https://github.com/SII-Holos/synergy.git
cd synergy
bun installFirst-time setup:
bun dev prepare # install deps, generate SDK, build frontendStart the dev server:
bun dev web # start the server + Vite web UI
bun dev desktop # optional: start the Electron desktop shell tooAfter editing code:
bun dev build app # rebuild the web app
bun dev build desktop # rebuild Electron main/preloadSee the development reference for source modes, isolated-runtime testing, builds, tests, SDK generation, and quality checks.
-
Keep changes focused. One logical change per PR. If you find an unrelated issue while working, open a separate PR for it.
-
Run the quality preflight. Before opening your PR, run at minimum:
bun run quality:quick
This checks formatting, linting, type-checking, monorepo dependency consistency, localization, package-guide and test-layout contracts, and package publishing validation. For a full check including all tests:
bun run quality
Core-runtime CI isolation can be reproduced from
packages/synergywithbun run test:ci, which runs the complete suite as sequential fresh-process shards.CI runs the full matrix — see docs/operations/open-source-quality.md for the complete model.
Frontend copy, accessibility text, and locale-sensitive formatting must also keep the localization catalogs and source contract current:
bun run --cwd packages/app i18n:extract bun run localization:check
Browser capability or App bootstrap changes must also verify the source boundary and a genuine non-loopback HTTP origin:
bun test --cwd packages/app test/testing/browser-crypto-contract.test.ts bun run --cwd packages/app build bun packages/app/script/private-http-smoke.ts -
Regenerate the SDK if you touched routes. If your change modifies server routes or route schemas, run
./script/generate.tsand include the output in your PR. -
Open your PR against
dev. Describe what you changed and why. If it addresses an open issue, reference it.
The pre-push hook (.husky/pre-push) runs a fast subset: bun version check, formatting, lint, typecheck, and monorepo dependency validation. It does not run tests, secret scans, or workflow validation — those run in CI as separate parallel jobs. All CI jobs must pass for a PR to merge.
Keep commits focused on a single logical change. Write commit messages that explain what changed and why — not just "fix bug" or "update code." If a commit relates to an issue, reference it in the message.
There is no enforced commit message format. Clear and descriptive is all we ask.
Do not commit secrets, local state files, placeholder credentials, or redundant wrapper scripts. If your change adds a feature or behavior that can be verified, include a test.
Match the patterns you find in the surrounding code. A few specifics worth knowing:
- Namespace-based organization is the established pattern for modules. Extend that pattern for related code.
- Zod handles runtime validation. Add
.meta({ ref: "TypeName" })for API-exposed schemas. constoverlet, early returns over deep nesting.- No inline comments unless explicitly needed. The code should be clear without them.
- No copyright or license headers in files.
- Bun APIs for file operations (
Bun.file(),Bun.write()), not Node.js equivalents.
When in doubt, look at a nearby file doing something similar and follow its lead.
Knowing where things live saves time:
| Package | Purpose |
|---|---|
packages/synergy |
Core runtime, server, CLI, agents, tools, sessions |
packages/app |
Web application |
packages/plugin |
Plugin SDK (@ericsanchezok/synergy-plugin) |
packages/sdk/js |
TypeScript SDK (@ericsanchezok/synergy-sdk) |
packages/ui |
Shared UI components |
packages/util |
Shared utilities |
If your change touches one package, scan adjacent packages before assuming an abstraction boundary.
If something isn't covered here, open a Discussion or ask in an issue. There are no bad questions — only missing documentation that your question will help us write.