Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
1d66c3e
feat: add WhatsApp Cloud API channel
abhinavxd Jun 13, 2026
b3382d8
fix: improve WhatsApp channel error handling and dial-code lookup
abhinavxd Jun 13, 2026
764225d
fix: preserve large WhatsApp template ID precision in webhook decode
abhinavxd Jun 13, 2026
3a00b85
fix: address WhatsApp review findings (graceful decrypt, template pic…
abhinavxd Jun 13, 2026
6a4aec2
fix: WhatsApp review batch (nil logger guard, attachment thumb reset,…
abhinavxd Jun 13, 2026
6a54252
fix: WhatsApp review fixes (CSAT uuid leak, named templates, reserved…
abhinavxd Jun 14, 2026
74599df
feat: durable WhatsApp inbound queue
abhinavxd Jun 14, 2026
3d08f15
feat: conversation reopen window for WhatsApp
abhinavxd Jun 14, 2026
f4596bd
fixes WhatsApp 24h window by stamping last_inbound_at from the inboun…
abhinavxd Jun 14, 2026
b0ad1dd
refines WhatsApp admin UI and keeps the reopen window backend-only
abhinavxd Jun 14, 2026
f2ef6c5
adds outbound WhatsApp conversations and a per-contact 24h window
abhinavxd Jun 14, 2026
f81c787
adds the WhatsApp new-conversation UI
abhinavxd Jun 14, 2026
dd45881
refines the new-conversation forms and always creates a new WhatsApp …
abhinavxd Jun 20, 2026
24245cf
fixes the WhatsApp 24h window live update and centralizes the window …
abhinavxd Jun 20, 2026
d127f1d
requires a public HTTPS root URL for WhatsApp webhook auto-registrati…
abhinavxd Jun 20, 2026
59e5edf
makes WhatsApp outbound sends retry-safe and validates template param…
abhinavxd Jun 20, 2026
e25571d
ignores unhandled WhatsApp template status events
abhinavxd Jun 20, 2026
fa2b437
merges main into feat-whatsapp
abhinavxd Jun 20, 2026
7fadf9e
makes the WhatsApp CSAT template editable and moves the reopen window…
abhinavxd Jun 21, 2026
3f42530
encrypts the WhatsApp webhook verify token at rest
abhinavxd Jun 21, 2026
4e9b915
widens the WhatsApp template form to fill the content column
abhinavxd Jun 21, 2026
ceb1b09
reuses the open WhatsApp conversation instead of starting a parallel one
abhinavxd Jun 21, 2026
a06854e
make the inbox auth-error tracker generic and drop the dead WhatsApp …
abhinavxd Jun 25, 2026
9926524
remove dead WhatsApp media-header and From plumbing
abhinavxd Jun 25, 2026
8781bd4
fix WhatsApp multi-attachment sending and polish the template form
abhinavxd Jun 26, 2026
372bbf3
fix WhatsApp reopen window not saving
abhinavxd Jun 26, 2026
ef80ba2
fix WhatsApp webhook ingestion gaps
abhinavxd Jun 27, 2026
08e637d
Remove country list retry button and translation
abhinavxd Jun 27, 2026
5296836
fix WhatsApp CSAT template button URL
abhinavxd Jun 27, 2026
7a53cf9
fix bugs and clean up code
abhinavxd Jun 27, 2026
27f9f37
clean up comments in whatsapp channel
abhinavxd Jun 27, 2026
a65b08b
add WhatsApp partial send handling and attachment retry
abhinavxd Jun 27, 2026
c8da54e
Centralize WhatsApp template fetching and improve CSAT template recon…
abhinavxd Jun 27, 2026
1b28e08
Include sample_values in template upsert from Meta
abhinavxd Jun 27, 2026
044a692
Use CSAT template body as fallback text when template is pending
abhinavxd Jun 27, 2026
a2f3113
Simplify CSAT not-sent activity message
abhinavxd Jun 27, 2026
695aad2
Remove sync of whatsapp template on change of root url
abhinavxd Jun 30, 2026
57272a9
Add debug log for reserved template content matching in EnsureReserved
abhinavxd Jun 30, 2026
224f7ad
Add tooltip for invalid token indication in inbox data table
abhinavxd Jun 30, 2026
b54a3d7
fix WhatsApp media, status, and template bugs found in code review
abhinavxd Jun 30, 2026
371dd87
Merge branch 'main' into feat-whatsapp
abhinavxd Jun 30, 2026
92a1ef8
Merge branch 'help-center' into feat-whatsapp
abhinavxd Jul 25, 2026
fe3eaee
use one country list and renumber the whatsapp migration to v2.8.0
abhinavxd Jul 25, 2026
3ef1a73
Merge remote-tracking branch 'origin/main' into feat-whatsapp
abhinavxd Aug 16, 2026
f56db19
remove redundant comments and tighten the ones worth keeping
abhinavxd Aug 16, 2026
defc653
send whatsapp attachments as one message per file
abhinavxd Aug 16, 2026
d34c654
fix whatsapp credential validation, contact permission and phone norm…
abhinavxd Aug 16, 2026
a7c5e56
serialize whatsapp csat template reconcile per inbox
abhinavxd Aug 16, 2026
a932805
fix whatsapp phone prefix duplication, add meta call timeouts and hos…
abhinavxd Aug 16, 2026
9b3237e
return a generic error on whatsapp template sync failure and handle t…
abhinavxd Aug 17, 2026
b7c2ef9
Merge remote-tracking branch 'origin/main' into feat-whatsapp
abhinavxd Aug 22, 2026
fd4a37f
add WhatsApp channel tests and bug fixes
abhinavxd Aug 25, 2026
1a84031
clean up WhatsApp i18n keys
abhinavxd Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/frontend-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ jobs:
# The livechat widget suite makes far more than 100 widget requests a minute.
LIBREDESK_RATE_LIMIT__WIDGET__REQUESTS_PER_MINUTE: "100000"
LIBREDESK_RATE_LIMIT__PUBLIC__REQUESTS_PER_MINUTE: "100000"
# The WhatsApp suite drives the channel against the stand-in Graph API cypress starts.
LIBREDESK_WHATSAPP__API_URL: "http://127.0.0.1:9099"
CYPRESS_SYSTEM_PASSWORD: "StrongPass!123"
CYPRESS_MAILHOG_URL: "http://localhost:8025"
run: |
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
width="250">
</picture>

<br> Modern, open source, self-hosted omnichannel customer support desk. Live chat, email, and more in a single binary.
<br> Modern, open source, self-hosted omnichannel customer support desk. Email, live chat, WhatsApp, and more in a single binary.

![image](https://libredesk.io/hero-dark.png?q=5)

Expand All @@ -24,9 +24,11 @@ Visit [libredesk.io](https://libredesk.io) for more info. Check out the [**live
## Features

- **Omnichannel inbox**
Live chat and email in one inbox. Every conversation lands in the same place, whichever channel it came from.
Email, live chat, and WhatsApp in one inbox. Every conversation lands in the same place, whichever channel it came from.
- **Live chat widget**
Embed a real-time chat widget on your website. Replies go out from the same inbox your team already works in.
- **WhatsApp**
Connect a WhatsApp number through the Meta Cloud API. Agents reply from the same inbox, with approved templates for messages outside WhatsApp's 24-hour window.
- **Help center**
Publish a searchable knowledge base with collections, articles in multiple languages, and customize it however you want.
- **AI assistant**
Expand Down
2 changes: 1 addition & 1 deletion cmd/aitools.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func (t *searchContactsTool) Execute(ctx context.Context, args string) (string,
var b strings.Builder
for i, r := range results {
name := strings.TrimSpace(r.FirstName + " " + r.LastName)
fmt.Fprintf(&b, "%d. %s | Email: %s | Contact ID: %d\n", i+1, name, r.Email, r.ID)
fmt.Fprintf(&b, "%d. %s | Email: %s | Contact ID: %d\n", i+1, name, r.Email.String, r.ID)
}
return b.String(), nil
}
Expand Down
3 changes: 3 additions & 0 deletions cmd/contacts.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ func handleGetContact(r *fastglue.Request) error {
if err != nil {
return sendErrorEnvelope(r, err)
}
if identities, err := app.user.GetChannelIdentities(id); err == nil {
c.ChannelIdentities = identities
}
return r.SendEnvelope(c)
}

Expand Down
Loading
Loading