Fault-tolerant support for your Phoenix application
Ecto schemas, Phoenix channels, GenServer processes, and OTP supervision trees. Escalated brings support tickets to Elixir with the resilience Phoenix is known for.
$ mix deps.getWhy Escalated
Why Escalated for Phoenix
Built for the BEAM — fault-tolerant, real-time, and functional.
Fault Tolerance
Escalated runs under OTP supervision trees. If a process crashes, it restarts automatically. Your support system stays up even when things go wrong.
Real-Time via Channels
Live ticket updates, typing indicators, and agent presence powered by Phoenix Channels. No polling, no WebSocket boilerplate.
Functional Programming
Immutable data, pattern matching, and composable pipelines. Escalated embraces Elixir idioms rather than fighting them.
Getting Started
How It Works
Three steps from zero to a working help desk.
Add the Dependency
Add {:escalated, "~> 1.0"} to mix.exs
Install & Migrate
mix deps.get && mix ecto.migrate
Mount the Router
Forward /support to Escalated.Router in your Phoenix router and the support system is live.
Features
Built for the BEAM
Escalated leverages the full power of OTP and the Phoenix ecosystem.
Ecto Schemas & Changesets
Tickets, replies, and tags are Ecto schemas with validations. Use changesets, preloads, and composable queries.
Phoenix PubSub
Ticket events broadcast via PubSub. Subscribe from any process — LiveView, Channel, or GenServer — for real-time updates.
Pluggable Authorization
Authorization uses a behaviour-based system. Implement the Escalated.Policy behaviour to control access with your own rules.
Telemetry Events
Every ticket action emits Telemetry events. Attach handlers for logging, metrics, and custom side effects.
Plug Middleware
Escalated routes work with the Plug pipeline. Apply authentication, rate limiting, and custom plugs to any route.
ExUnit Test Helpers
Ships with ExUnit helpers and factories. Create tickets, replies, and users in your test suite with clean setup functions.
Code
Idiomatic Elixir
Pattern matching, pipes, and Phoenix conventions.
# lib/my_app_web/router.ex defmodule MyAppWeb.Router do use MyAppWeb, :router forward "/support", Escalated.Router end # lib/my_app/accounts/user.ex defmodule MyApp.Accounts.User do use Ecto.Schema use Escalated.HasTickets schema "users" do has_many :tickets, Escalated.Ticket end end
Ready to add support tickets to your Phoenix app?
Add the dependency, run migrations, and mount the router. Open source, self-hosted, and built for Elixir.