Thanks for your interest in contributing! Whether it's a bug fix, new feature, translation, or documentation improvement — every contribution matters.
- Fork this repo and clone your fork
- Set up the dev environment:
bash setup.sh # Backend + frontend + database bash restart.sh # Start services → http://localhost:3008
- Create a branch:
git checkout -b my-feature - Make your changes
- Push and open a Pull Request
| Area | Examples |
|---|---|
| 🐛 Bug fixes | UI glitches, API errors, edge cases |
| ✨ Features | New agent skills, tools, UI improvements |
| 🔧 MCP Integrations | New MCP server connectors |
| 🌍 Translations | New languages or improving existing ones |
| 📖 Documentation | README, guides, code comments |
| 🧪 Tests | Unit tests, integration tests |
New to the project? Look for issues labeled good first issue.
When reporting a bug, please include:
- Steps to reproduce
- Expected vs actual behavior
- Clawith version and deployment method (Docker / Source)
- Logs or screenshots if available
Priority guide:
| Type | Priority |
|---|---|
| Core functions broken (login, agents, security) | 🔴 Critical |
| Non-critical bugs, performance issues | 🟡 Medium |
| Typos, minor UI issues | 🟢 Low |
Please describe:
- The problem you're trying to solve
- Your proposed solution (if any)
- Why this would be useful
- Link an issue — Create one first if it doesn't exist
- Keep it focused — One PR per feature/fix
- Test your changes — Make sure nothing is broken
- Follow code style:
- Backend: Python — formatted with
ruff - Frontend: TypeScript — standard React conventions
- Backend: Python — formatted with
- Use
Fixes #<issue_number>in the PR description
It is common to develop several improvements in one sitting before submitting. Rather than sending one giant PR, please split your work into smaller, focused PRs — this makes review faster and merges cleaner.
# Start each new feature from a fresh branch off main
git checkout main && git pull
git checkout -b feat/i18n-emoji-cleanup
# ... develop, commit ...
git checkout main
git checkout -b feat/admin-email-templates
# ... develop, commit ...Each branch becomes one PR. Small, clean, easy to review.
git add -p (patch mode) lets you selectively stage individual change hunks from a file — perfect for creating several commits from one messy branch.
Step-by-step example:
# Assume your branch is called my-big-branch and has 3 logical changes mixed in.
# Goal: create 3 separate PRs from it.
# --- PR 1: emoji cleanup ---
git checkout -b feat/i18n-emoji-cleanup main
# Interactively stage only the emoji-related hunks from en.json and zh.json:
git add -p frontend/src/i18n/en.json # answer y/n for each hunk
git add -p frontend/src/i18n/zh.json
git commit -m "fix: remove emoji from i18n strings"
git push -u origin feat/i18n-emoji-cleanup
# → open PR
# --- PR 2: hardcoded strings → t() ---
git checkout -b feat/i18n-component-strings main
git add -p frontend/src/pages/AgentDetail.tsx # stage only t() hunk
git add -p frontend/src/components/ChannelConfig.tsx
git commit -m "feat: replace hardcoded UI strings with i18n t() calls"
git push -u origin feat/i18n-component-strings
# → open PR
# --- PR 3: admin improvements ---
git checkout -b feat/admin-improvements main
git checkout my-big-branch -- frontend/src/pages/AdminCompanies.tsx # cherry-pick whole file if clean
git commit -m "feat: improve admin company settings"
git push -u origin feat/admin-improvements
# → open PRKey commands:
| Command | What it does |
|---|---|
git add -p <file> |
Stage hunks interactively (y = yes, n = no, s = split hunk smaller) |
git checkout <branch> -- <file> |
Copy a whole file from another branch |
git cherry-pick <commit> |
Apply a single commit to the current branch |
git diff main...HEAD -- <file> |
Preview what changed in a specific file vs main |
- Commit early, commit often on your dev branch — individual commits are much easier to cherry-pick later than one large commit.
- Use descriptive commit messages (e.g.
fix: remove emoji from zh.json, notupdate stuff). - If two features touch the same file heavily, submit PR 1 first, wait for it to merge, then rebase PR 2 on
mainbefore opening it.
backend/
├── app/
│ ├── api/ # FastAPI route handlers
│ ├── models/ # SQLAlchemy models
│ ├── services/ # Business logic
│ └── core/ # Auth, events, middleware
frontend/
├── src/
│ ├── pages/ # Page components
│ ├── components/ # Reusable UI components
│ ├── stores/ # Zustand state management
│ └── i18n/ # Translations
To ensure all contributors can participate effectively, please use English for issues, PRs, and code comments.
为了确保所有贡献者都能有效参与,请使用英语提交 Issue、PR 和代码注释。
すべてのコントリビューターが効果的に参加できるよう、Issue、PR、コードコメントは英語でお願いします。
모든 기여자가 효과적으로 참여할 수 있도록, Issue, PR, 코드 코멘트는 영어로 작성해 주세요.
Para garantizar que todos los contribuidores puedan participar de manera efectiva, utilice inglés para issues, PRs y comentarios de código.
لضمان مشاركة جميع المساهمين بفعالية، يرجى استخدام اللغة الإنجليزية في الـ Issues وطلبات السحب وتعليقات الكود.
Clawith is primarily developed on Linux/macOS, but can run on Windows with a few adjustments.
- Python 3.11+ — Install from python.org (check "Add to PATH")
- Node.js 18+ — Install from nodejs.org
- Docker Desktop — For PostgreSQL and Redis (recommended over native installs)
docker run -d --name clawith-postgres -p 5432:5432 -e POSTGRES_PASSWORD=yourpass -e POSTGRES_DB=clawith postgres:15
docker run -d --name clawith-redis -p 6379:6379 redis:7cd backend
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
# Create .env (copy from .env.example and adjust DATABASE_URL / REDIS_URL)
# Run database migrations
alembic upgrade head
# Start the server
uvicorn app.main:app --host 0.0.0.0 --port 8000cd frontend
npm install
npm run dev| Issue | Solution |
|---|---|
UnicodeEncodeError / GBK encoding |
Set PYTHONUTF8=1 in environment variables, or run chcp 65001 before starting |
| System proxy intercepting LLM API calls | Set NO_PROXY=* or unset HTTP_PROXY / HTTPS_PROXY in your terminal |
uvicorn --reload crashes with watchfiles |
Remove --reload flag, or install watchfiles: pip install watchfiles |
| File path errors with backslashes | Use pathlib.Path — the codebase already does this in most places |
Note: The recommended deployment method is Docker (
docker compose up -d), which works identically on Windows, macOS, and Linux. The instructions above are for local development without Docker.
Stuck? Open a Discussion or ask in the related issue. We're happy to help! 🙌