Templates / elixir

Phoenix JSON API + Ecto + Oban Starter

Phoenix, PostgreSQL, Ecto SQL, Phoenix REST, Oban, and Swoosh form a backend service configuration where the generated project is centered on a backend service. Better Fullstack can scaffold this exact compatibility-checked selection.

01 / selection

Stack at a glance

RoleTechnologyRepository descriptionScope
BackendPhoenix
Productive Elixir web frameworkPrimary backend
DatabasePostgreSQL
Advanced SQL databaseProject-wide
ORMEcto SQL
Ecto with SQL adapters and migrationsScoped to the backend
AuthenticationNone
Skip authProject-wide
APIPhoenix REST
JSON controllers and resourcesScoped to the backend
RealtimeNone
Skip realtime featureProject-wide
Background jobsOban
PostgreSQL-backed jobs and workersScoped to the backend
EmailSwoosh
Phoenix email libraryScoped to the backend
TestingExUnit
Standard Elixir testsScoped to the backend

02 / architecture

How the pieces fit

  • The generated stack is centered on a backend service with no browser frontend.
  • Ecto SQL is scoped to the backend.
  • Phoenix REST is scoped to the backend.
  • Oban is scoped to the backend.
  • Swoosh is scoped to the backend.
  • ExUnit is scoped to the backend.

03 / output

What gets generated

The virtual generator produced 40 files across 16 directories. The output is a single-directory project.

Top-level entries

  • ./.env.example
  • ./.formatter.exs
  • ./.gitignore
  • ./AGENTS.md
  • ./CLAUDE.md
  • ./Dockerfile
  • ./README.md
  • ./config
  • ./fly.toml
  • ./lib
  • ./mix.exs
  • ./priv
  • ./test

Representative files

  • README.md
  • mix.exs
  • lib/my_app.ex
  • lib/my_app/application.ex
  • lib/my_app/catalog.ex
  • lib/my_app/catalog/item.ex
  • lib/my_app/http_client.ex
  • lib/my_app/mailer.ex

04 / create

Create command

This is the canonical Bun command generated for the selection.

bun create better-fullstack@latest my-app --ecosystem elixir --database postgres --elixir-web-framework phoenix --elixir-orm ecto-sql --elixir-auth none --elixir-api rest --elixir-realtime none --elixir-jobs oban --elixir-validation ecto-changesets --elixir-http req --elixir-json jason --elixir-email swoosh --elixir-caching none --elixir-observability telemetry --elixir-testing ex_unit --elixir-quality credo --elixir-i18n none --elixir-http-server cowboy --elixir-application-framework none --elixir-documentation none --elixir-clustering none --elixir-deploy fly --elixir-libraries none --ai-docs claude-md agents-md

05 / builder

Open in the builder

Open this exact selection →
eco
elixir
db
postgres
au
none
ert
none
ejob
oban
emailx
swoosh
edeploy
fly

06 / checks

Compatibility notes

Compatibility checked against Better Fullstack types version 2.8.0.

The generated record has 0 graph issues and 0 disabled selected options. This is a compatibility check, not a claim that this exact scaffold received a runtime smoke verification.

  • Elixir Auth is intentionally set to none.
  • Elixir Realtime is intentionally set to none.

07 / fit

When to choose this shape

Choose this shape when the generated project should expose backend functionality without a browser frontend.

08 / next

Related stacks and guide

09 / faq

Questions

Is this combination supported?

It passes the repository's compatibility analysis, selected-option checks, stack graph validation, project schema parsing, and virtual generation. That result is described here as compatibility checked.

Does it generate one app or separate parts?

The generated project is centered on a backend service. The actual generated output uses a single-directory layout.

How can I customize the selection?

Open the generated builder link above. Its query parameters reproduce this selection, and the builder can change compatible options before generating a new command.

GitHub Sponsors