Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Self-host customer support with Chatwoot. Use when a user asks to set up open-source customer support, add live chat without SaaS costs, build a multi-channel inbox, or deploy a free Intercom alternative.
.claude/skills/terminalskills-chatwoot/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 0% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 0% | 0% |
Chatwoot is an open-source customer support platform. Self-hosted Intercom alternative with live chat, shared inbox, multi-channel support (website, email, WhatsApp, Telegram, Twitter), and chatbots. Free when self-hosted.
yaml# docker-compose.yml — Self-hosted Chatwoot services: chatwoot: image: chatwoot/chatwoot:latest depends_on: [postgres, redis] ports: ["3000:3000"] environment: RAILS_ENV: production SECRET_KEY_BASE: your-secret-key-base FRONTEND_URL: https://chat.example.com POSTGRES_HOST: postgres POSTGRES_USERNAME: chatwoot POSTGRES_PASSWORD: chatwoot REDIS_URL: redis://redis:6379 MAILER_SENDER_EMAIL: support@example.com SMTP_ADDRESS: smtp.gmail.com SMTP_PORT: 587 SMTP_USERNAME: support@example.com SMTP_PASSWORD: app-password command: bundle exec rails s -p 3000 -b 0.0.0.0 sidekiq: image: chatwoot/chatwoot:latest depends_on: [postgres, redis] environment: *chatwoot-env command: bundle exec sidekiq postgres: image: postgres:15 environment: POSTGRES_DB: chatwoot POSTGRES_USER: chatwoot POSTGRES_PASSWORD: chatwoot volumes: [pgdata:/var/lib/postgresql/data] redis: image: redis:7-alpine volumes: [redisdata:/data] volumes: pgdata: redisdata:
html<!-- Add to your website --> <script> (function(d,t) { var BASE_URL="https://chat.example.com"; var g=d.createElement(t),s=d.getElementsByTagName(t)[0]; g.src=BASE_URL+"/packs/js/sdk.js"; g.defer = true; g.async = true; s.parentNode.insertBefore(g,s); g.onload=function(){ window.chatwootSDK.run({ websiteToken: 'YOUR_WEBSITE_TOKEN', baseUrl: BASE_URL }) } })(document,"script"); </script>
typescript// lib/chatwoot.ts — Create contacts and conversations via API const CHATWOOT_URL = 'https://chat.example.com' const CHATWOOT_TOKEN = process.env.CHATWOOT_API_TOKEN! // Create contact when user signs up await fetch(`${CHATWOOT_URL}/api/v1/accounts/1/contacts`, { method: 'POST', headers: { 'Content-Type': 'application/json', api_access_token: CHATWOOT_TOKEN, }, body: JSON.stringify({ name: 'John Doe', email: 'john@example.com', custom_attributes: { plan: 'pro', mrr: 49 }, }), })
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 6,846 | 3,196 | -53% | 1 | 1 | 0% | 1,382 | 1,327 | -4% | 0 | 0 | — |
case-09 | pass→pass | 6,880 | 2,685 | -61% | 1 | 1 | 0% | 1,375 | 1,369 | -0% | 0 | 0 | — |
case-01 | fail→fail | 15,752 | 11,795 | -25% | 1 | 1 | 0% | 3,531 | 3,729 | +6% | 0 | 0 | — |
case-02 | fail→fail | 12,598 | 9,747 | -23% | 1 | 1 | 0% | 2,886 | 3,106 | +8% | 0 | 0 | — |
case-03 | fail→fail | 10,311 | 6,015 | -42% | 1 | 1 | 0% | 1,856 | 1,973 | +6% | 0 | 0 | — |
case-04 | pass→fail | 9,574 | 5,240 | -45% | 1 | 1 | 0% | 1,848 | 1,844 | -0% | 0 | 0 | — |
case-05 | fail→fail | 3,196 | 1,593 | -50% | 1 | 1 | 0% | 495 | 1,194 | +141% | 0 | 0 | — |
case-06 | fail→pass | 5,221 | 1,895 | -64% | 1 | 1 | 0% | 969 | 1,232 | +27% | 0 | 0 | — |
case-07 | pass→pass | 4,674 | 2,568 | -45% | 1 | 1 | 0% | 860 | 1,252 | +46% | 0 | 0 | — |
case-10 | fail→fail | 7,945 | 4,499 | -43% | 1 | 1 | 0% | 1,602 | 1,851 | +16% | 0 | 0 | — |
case-11 | pass→pass | 3,944 | 2,400 | -39% | 1 | 1 | 0% | 813 | 1,348 | +66% | 0 | 0 | — |
case-12 | pass→pass | 3,136 | 1,848 | -41% | 1 | 1 | 0% | 588 | 1,174 | +100% | 0 | 0 | — |
case-13 | pass→pass | 3,840 | 2,485 | -35% | 1 | 1 | 0% | 720 | 1,416 | +97% | 0 | 0 | — |
case-14 | pass→pass | 6,952 | 4,829 | -31% | 1 | 1 | 0% | 1,384 | 1,793 | +30% | 0 | 0 | — |
case-15 | pass→pass | 8,315 | 6,077 | -27% | 1 | 1 | 0% | 1,839 | 2,173 | +18% | 0 | 0 | — |
case-16 | pass→pass | 8,013 | 4,038 | -50% | 1 | 1 | 0% | 1,340 | 1,537 | +15% | 0 | 0 | — |
case-17 | fail→pass | 3,966 | 1,256 | -68% | 1 | 1 | 0% | 698 | 1,027 | +47% | 0 | 0 | — |
case-18 | pass→pass | 7,862 | 1,967 | -75% | 1 | 1 | 0% | 1,253 | 1,187 | -5% | 0 | 0 | — |
case-19 | pass→pass | 10,578 | 5,371 | -49% | 1 | 1 | 0% | 1,732 | 1,855 | +7% | 0 | 0 | — |
case-20 | pass→pass | 13,273 | 9,035 | -32% | 1 | 1 | 0% | 2,547 | 2,756 | +8% | 0 | 0 | — |
case-21 | pass→pass | 13,293 | 10,495 | -21% | 1 | 1 | 0% | 2,782 | 3,055 | +10% | 0 | 0 | — |
case-22 | pass→pass | 13,624 | 9,751 | -28% | 1 | 1 | 0% | 2,605 | 2,744 | +5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.