Thank you for your interest! CrustAI is intentionally modular — adding a new chat platform or voice engine is just one file.
git clone https://github.com/your-username/crustai.git
cd crustai
npm install
cp config/config.example.yml config/config.yml
npm run dev # hot-reload development modeEach adapter lives in src/adapters/<platform>/index.js and exports a class with a start() method. It receives a handleMessage function as its second constructor argument.
export class MyPlatformAdapter {
constructor(config, handleMessage) {
this.config = config;
this.handleMessage = handleMessage;
}
async start() {
// Connect to platform SDK
// On each incoming message:
const reply = await this.handleMessage({
userId: 'unique-user-id',
text: 'the message text',
channel: 'myplatform',
});
// Send reply back via platform SDK
}
}Then register it in src/core/index.js.
src/
├── core/ # LLM client + main orchestrator
├── adapters/ # One folder per platform
├── voice/ # STT, TTS, WebSocket server
├── memory/ # SQLite + ChromaDB
└── personality/ # System prompt builder
- Keep adapters self-contained
- No adapter should import from another adapter
- All user data stays local — never add cloud calls without an opt-in flag
- Write in ES modules (
import/export) - Add a brief JSDoc comment at the top of each file
- Fork the repo and create a feature branch
- Keep changes focused — one feature per PR
- Update
docs/if your change affects configuration or setup - Open the PR with a clear description
All contributions are welcome, from tiny bug fixes to new platform adapters! 🦀