> chatwoot
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.
curl "https://skillshub.wtf/TerminalSkills/skills/chatwoot?format=md"Chatwoot
Overview
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.
Instructions
Step 1: Docker Deployment
# 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:
Step 2: Add Chat Widget
<!-- 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>
Step 3: API Integration
// 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 },
}),
})
Guidelines
- Self-hosted: completely free, unlimited agents and conversations.
- Cloud: starts at $19/agent/month.
- Supports WhatsApp Business, Telegram, Twitter, email, and website channels in one inbox.
- Use webhooks to sync conversations with your CRM or ticketing system.
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> xero-accounting
Integrate with the Xero accounting API to sync invoices, expenses, bank transactions, and contacts — and generate financial reports like P&L and balance sheet. Use when: connecting apps to Xero, automating bookkeeping workflows, syncing accounting data, or pulling financial reports programmatically.
> windsurf-rules
Configure Windsurf AI coding assistant with .windsurfrules and workspace rules. Use when: customizing Windsurf for a project, setting AI coding standards, creating team-shared Windsurf configurations, or tuning Cascade AI behavior.