Thanks for considering contributing to KinBot! Whether it's a bug fix, new provider, feature, or docs improvement, every contribution helps.
git clone https://github.com/MarlBurroW/kinbot.git
cd kinbot
bun install
bun run db:migrate
bun run devThis starts both the Vite dev server (frontend) and the Bun server (backend) with hot reload. Open http://localhost:5173 in your browser.
src/
├── client/ # React frontend (Vite + Tailwind)
├── server/ # Bun + Hono backend
│ ├── providers/ # AI provider adapters
│ ├── channels/ # Chat platform adapters (Telegram, Discord, etc.)
│ └── ...
├── shared/ # Shared types & utilities
site/ # Landing page (React + Vite + Tailwind v4)
| Command | Description |
|---|---|
bun run dev |
Start dev server (client + server) |
bun run build |
Production build |
bun run db:generate |
Generate DB migrations (Drizzle) |
bun run db:migrate |
Run pending migrations |
bun test |
Run tests |
Use the bug report template. Include:
- Steps to reproduce
- Expected vs actual behavior
- Browser, OS, and KinBot version
Use the feature request template. Describe the problem you're solving, not just the solution you want.
- Fork the repository
- Create a branch from
main:git checkout -b feat/my-feature - Make your changes with clear, focused commits
- Test your changes:
bun testand manual testing - Push and open a Pull Request
Providers are self-contained adapters in src/server/providers/. To add one:
- Create
src/server/providers/<name>.ts(use an existing one as template) - Implement the
ProviderDefinitioninterface:testConnection()+listModels() - Register it in
src/server/providers/index.ts - Add the type to the
ProviderTypeunion insrc/shared/types.ts - Commit:
feat: add <name> provider
For OpenAI-compatible providers, reuse the pattern from openai.ts with a custom baseUrl.
Channel adapters live in src/server/channels/ and implement the ChannelAdapter interface:
- Create the adapter file in
src/server/channels/ - Implement:
start(),stop(),sendMessage(),validateConfig(),getBotInfo() - Register it in
src/server/channels/index.ts - Add the platform to
ChannelPlatforminsrc/shared/types.ts - Commit:
feat: add <platform> channel
The store/ directory contains curated community plugins that users can install directly from the KinBot UI. Here's how to submit yours.
bun store:create my-plugin -d "What it does" -a "Your Name" -i "🚀"This creates store/my-plugin/ with the three required files:
plugin.json- manifest (metadata, config schema, permissions)index.ts- entry pointREADME.md- documentation shown in the Store UI
- Name must match
[a-z0-9][a-z0-9-]*and be unique in the store - Manifest must include
name,version,description, andmain - README is required and displayed in the plugin detail modal
- Permissions must be minimal. Only request what you need (e.g.,
http:api.example.cominstead ofhttp:*) - No external dependencies. Plugins run in-process with Bun, use
ctx.httpfor HTTP requests - Config fields must have
type,label, anddescription
bun store:validate my-pluginThis runs the same checks as CI: manifest schema, required files, TypeScript syntax, config field validation.
Copy your plugin to the plugins/ directory and restart KinBot:
cp -r store/my-plugin plugins/
bun run devVerify it loads, the config UI renders correctly, and tools work as expected.
- Fork the repo and create a branch:
git checkout -b store/my-plugin - Add only your plugin directory under
store/ - Push and open a PR. The
store-pluginsCI workflow validates your manifest automatically. - A maintainer will review the code, test the plugin, and merge if it looks good.
- Look at
store/rss-reader/as a reference implementation - Keep plugins focused: one clear purpose per plugin
- Write helpful README examples so users know what prompts to try
- Use
ctx.logfor debugging,ctx.storagefor persistence,ctx.configfor user settings - See the Plugin Development Guide for the full API reference
- TypeScript strict mode
- Imports use the
@/alias (configured in tsconfig) - Logging via
createLogger('scope:name') - Prefer
fetchover heavy SDK dependencies - Keep files focused: one provider/channel per file
Follow conventional commits:
feat: add <thing>for new featuresfix: resolve <issue>for bug fixesdocs: update <what>for documentationsite: <description>for landing page changesrefactor:,test:,ci:,chore:as needed
The landing page lives in site/ and deploys automatically to GitHub Pages on push to main.
cd site
bun install
bun run dev # Local dev server
bun run build # Test production buildBy contributing, you agree that your contributions will be licensed under the AGPL-3.0 License.
Open a discussion or an issue. We're happy to help!