Skip to content
useopendesk/opendeskApache-2.0

Built in the open.
Licensed Apache‑2.0.

opendesk is developed in public. The code that runs opendesk Cloud is the code in the repository, and you can run, change and ship it under a permissive license.

## 01Why open source

Support software sits between you and every customer. It should be something you can check, move and fix yourself.

## 02The cloud is the self‑host, plus configuration

opendesk Cloud and your server run the same build. What differs is a handful of settings: billing turns on with a Stripe key, AI with a provider key. Without them, every workspace is self-hosted with no limits.

How the cloud is laid out
opendesk Cloud
one codebase
Your server
BillingSTRIPE_SECRET_KEY
Set: plans, seats and AI usage
Unset: no plans and no limits
AIANTHROPIC_API_KEY
The instance’s provider, paid as AI usage in dollars
Your key, or a local model on any OpenAI-compatible endpoint
DataDATABASE_URL
Neon Postgres, pooled
Stock Postgres beside it
EventsNATS_URL
A three-node NATS cluster
Unset: NATS runs inside the binary
Web appSERVE_WEB
Served from Cloudflare Pages
true: opendesk serves it too

## 03What is in the repository

One repository holds the server, the realtime gateway, every client, the docs and the deploy files. The contracts between them are written down before they are built.

Browse it on GitHub
cmd/opendesk, internal/API and workers. The REST API and background jobs in one binary, with NATS embedded for self-hosters.Go
realtime/Realtime gateway. Channels, presence and live updates for every open tab. It holds no database.Elixir and Phoenix
web/Web app and help center. The app your team works in, and the help center your customers search.React
web/widget/Chat widget. The embeddable chat bundle for your site, in 13 languages.TypeScript
desktop/Desktop. Loads your instance’s web app, with notifications, a dock badge and deep links.Electron
ios/iPhone. A native app with push, for Cloud or any self-hosted instance.SwiftUI
contracts/Contracts. The API, events, realtime protocol and tokens, written down before they are built.Markdown
migrations/Migrations. SQL migrations embedded in the binary and applied at boot.SQL
deploy/Deploy. Dockerfiles, the self-host bundle with Caddy, Terraform and the Cloudflare Email Worker.Docker and Terraform
docs/, site/Docs and this site. docs.opendesk.sh and opendesk.sh, in the same repository as the code.Astro

### Boring parts, on purpose

No Redis, no Kafka.
Go
API and background workers, one binary
Elixir and Phoenix
Realtime gateway, channels and presence
React
Web app, help center and chat widget
Postgres
Data, job queue and event log
NATS
Event bus, embedded or clustered
Caddy
HTTPS for self-hosted installs

## 04Apache‑2.0, without asterisks

Use opendesk commercially, modify it, run it for your clients, and keep your changes private if you want to. The license includes an explicit patent grant. Keep the notices, and say what you changed.

Read the license
LICENSEApache License, Version 2.0No license key, no separate commercial edition
Permissions
  • Commercial use
  • Modification
  • Distribution
  • Patent grant
  • Private use
Conditions
  • License and copyright notice
  • State changes
Limitations
  • Trademark use
  • Liability
  • Warranty

## 05Contributing

Issues, discussions and pull requests are welcome. Read AGENTS.md and the files in contracts/ before changing an interface between parts.

Read the contributing guide
Run it locally
$ cp .env.example .env
$ make dev-db # Postgres on localhost:55432
$ make api # the Go API and workers, with embedded NATS on :4222
$ make realtime # the Elixir gateway on :4000
$ make web # the web app on :5173
You need Go, Node.js with pnpm, Elixir and Docker
  • gofmt, go vet and go test
  • Writes publish events in the same transaction
  • Stable error codes, never raw errors
  • One-line commit messages
  • Sentence case, plain words

Give every customer a calm, good answer.

Start on the cloud in a minute, or self-host it tonight. It is the same code either way.