Customer support platforms have become an essential part of running online products. Whether it's answering customer questions, managing emails, or handling conversations from multiple channels, businesses often depend on expensive third-party services.
For many independent developers and small teams, recurring subscription costs can quickly become difficult to justify. Fortunately, open source alternatives have matured significantly.
One of the strongest options available today is Chatwoot. It allows you to create a complete customer communication system on an infrastructure that you control. Combined with Pinggy, you can even make a locally hosted Chatwoot instance accessible on the internet without purchasing additional networking infrastructure.
This guide explains how Chatwoot works, how to deploy it yourself, and how Pinggy simplifies public access.
Why Many Developers Are Moving Toward Self-Hosted Customer Support
Popular customer support solutions are convenient, but costs often increase as teams grow or advanced features become necessary.
A simple support setup can become expensive once you add automation, AI capabilities, or multiple support agents.
Self-hosting changes that equation. Instead of paying for the software every month, you manage the application yourself and only pay for the infrastructure you use.
Chatwoot is one of the leading projects in this space.
What Is Chatwoot?
Chatwoot is an open-source customer engagement platform that centralizes communication from multiple channels into a single interface.
It can be installed on your own server or personal machine and supports various communication sources.
Some of its major capabilities include:
- Website live chat
- Shared team inboxes
- Email integration
- WhatsApp connectivity
- Telegram integration
- Customer knowledge bases
- Internal notes for support teams
- Automated routing rules
- AI-powered assistance
The project is actively maintained and has built a large developer community.
How Chatwoot Organizes Customer Conversations
At its heart, Chatwoot acts as a unified inbox.
Instead of opening separate applications for emails, website chats, and messaging apps, every incoming conversation appears in one dashboard.
Support teams can:
- Assign conversations to specific team members
- Add internal comments
- View customer history
- Tag conversations
- Create canned responses
- Track visitor activity before they start a conversation
This significantly reduces context switching.
The Built-In AI Assistant: Captain
Recent Chatwoot releases introduced Captain, an integrated AI system designed to help support teams work more efficiently.
Captain includes several useful components.
Captain Assistant
This feature can answer customer questions automatically by referencing your documentation and previous interactions.
It is particularly useful during non-working hours.
Captain Co-Pilot
Instead of writing every response manually, support agents receive AI-generated suggestions directly inside the editor.
Human agents can modify and approve responses before sending them.
Captain FAQs
This component identifies unanswered questions appearing repeatedly in customer conversations.
It helps teams discover gaps in their documentation.
Captain Memories
The AI stores useful customer context such as:
- Business size
- Previous issues
- Product preferences
- Historical interactions
That information becomes available during future conversations.
The captain requires an external AI provider such as OpenAI or any compatible endpoint.
The Biggest Challenge of Running Chatwoot Locally
Deploying Chatwoot is relatively straightforward.
The networking aspect is where many beginners get stuck.
By default, Docker keeps services accessible only from the local machine.
For example:
http://localhost:3000
works perfectly on your own computer.
However, website visitors cannot reach localhost.
If you embed a chat widget on your website, external users need a publicly accessible URL.
There are several traditional ways to solve this.
Option 1: Rent a VPS
You can deploy Chatwoot directly to a cloud server.
Although effective, this adds server management responsibilities.
Option 2: Configure Router Port Forwarding
This exposes your home network to the internet.
It may also require a static IP address and additional firewall configuration.
Option 3: Use a Secure Tunnel
This is often the easiest approach for small projects.
This is where Pinggy becomes useful.
How Pinggy Makes Local Chatwoot Accessible Online
Pinggy establishes a reverse SSH tunnel.
Instead of opening your network to incoming traffic, your computer creates an outbound connection.
When users access your public URL, Pinggy securely forwards requests back to your local Chatwoot installation.
Advantages include:
- No router modifications
- No firewall changes
- No static IP requirements
- No server administration
A single command can expose your application.
System Requirements Before Installation
You will need:
- Docker
- Docker Compose
- Linux, macOS, or Windows with WSL2
Step 1: Download the Required Configuration Files
Create a working directory and fetch the necessary files.
mkdir chatwoot
cd chatwoot
wget -O .env https://raw.githubusercontent.com/chatwoot/chatwoot/develop/.env.example
wget -O docker-compose.yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/docker-compose.production.yaml
Step 2: Configure Environment Variables
Open the .env file.
Configure these values.
# Generate with openssl rand -hex 64
SECRET_KEY_BASE=your_secret_key_here
POSTGRES_PASSWORD=your_database_password
REDIS_PASSWORD=your_redis_password
FRONTEND_URL=http://localhost:3000
FRONTEND_URL is extremely important because Chatwoot uses it when generating links and connecting widgets.
Step 3: Prepare the Database
Before launching the application, initialize the database.
docker compose run --no-deps rails bundle exec rails db:chatwoot_prepare
During this process, create your administrator account.
Choose credentials that you can easily remember.
Step 4: Launch Chatwoot
Start all required services.
docker compose up -d
Several containers will start:
- Rails application server
- Sidekiq background processor
- PostgreSQL database
- Redis cache
After a short wait, open:
http://localhost:3000
You should see the login screen.
Making Chatwoot Public with Pinggy
Open a new terminal window.
Run:
ssh -p 443 -R0:localhost:3000 free.pinggy.io
Pinggy will generate temporary public URLs.
Example:
http://xyz123.a.pinggy.link
https://xyz123.a.pinggy.link
Copy the HTTPS URL.
Update your .env file.
FRONTEND_URL=https://xyz123.a.pinggy.link
Now restart the affected services.
docker compose restart rails sidekiq
Your Chatwoot instance is now accessible worldwide.
Creating a Permanent URL
Temporary addresses change whenever the tunnel reconnects.
For long term deployments, obtaining a fixed domain is more practical.
A persistent URL removes the need to repeatedly update your configuration.
Automated reconnection can also be configured using authentication tokens.
Creating Your First Website Inbox
After logging in, navigate to:
Settings → Inboxes → New Inbox
Choose:
Website
Chatwoot will generate a JavaScript snippet.
Place it before the closing body tag of your website.
<script>
(function(d,t) {
var BASE_URL="https://your-domain";
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_token',
baseUrl:BASE_URL
})
}
})(document,"script");
</script>
Once deployed, visitors will immediately see a chat widget.
How AI Support Works in Daily Operations
After enabling Captain, AI assistance becomes available directly inside your workflow.
The system can:
- Suggest responses
- Answer questions automatically
- Analyze customer patterns
- Improve documentation over time
One particularly useful feature is FAQ discovery.
After a week of customer interactions, teams can identify recurring questions that are not properly documented.
This creates a roadmap for improving support resources.
Important Considerations Before Self-Hosting
Email Configuration Is Not Automatic
SMTP settings are disabled by default.
Without configuring an email provider, email notifications will not work.
Services like Resend or Brevo are often used.
AI Usage Still Has Costs
Chatwoot itself is free.
However, external AI providers charge based on token consumption.
The total cost depends entirely on usage volume.
Infrastructure Is Your Responsibility
Self-hosting means ownership.
You are responsible for:
- Software updates
- Data backups
- System monitoring
Routine updates are simple, though.
docker compose pull
docker compose up -d
Hardware Requirements Are Reasonable
A lightweight deployment generally consumes around 600 MB to 700 MB of memory at idle.
For smooth operation, 2 GB RAM is recommended.
Modern laptops and devices such as the Raspberry Pi 5 can handle it comfortably.
Is Self-Hosting Worth It?
The answer depends on your priorities.
Hosted services offer convenience, but self-hosted solutions provide flexibility and cost control.
If you are comfortable managing Docker applications, Chatwoot offers an impressive set of capabilities without forcing you into recurring software subscriptions.
The only missing ingredient for local deployments is internet accessibility.
Pinggy fills that gap with a simple SSH tunnel, allowing anyone to connect to your support platform without complicated networking configurations.
For developers, indie founders, and small teams, this combination creates a practical way to run a professional customer support system entirely under their own control.

Top comments (0)