Skip to content

Qdust41/Mixer

Repository files navigation

Mixer

A social posting platform built with Elixir/Phoenix, Ash Framework, and React. Users can post, reply, like, follow each other, and upload media/avatars. Metrics are tracked in ClickHouse.

Stack

  • Backend: Elixir 1.15+, Phoenix, Ash Framework (resources, policies, state machine, authentication)
  • Frontend: React + TypeScript, bundled via esbuild, styled with Tailwind CSS + DaisyUI
  • Databases: PostgreSQL (primary data), ClickHouse (metrics/analytics)
  • Storage: S3-compatible object storage (MinIO locally, any S3-compatible service in prod)
  • Email: Swoosh (local mailbox in dev, Brevo in prod)
  • API layer: AshTypescript RPC (type-safe TS client auto-generated from Ash resources)

Dev environment setup

Prerequisites

  • Elixir 1.15+ and Erlang/OTP (via asdf or system package manager)
  • PostgreSQL running locally (default: postgres/postgres on localhost:5432)
  • ClickHouse running locally (default: default/no password on localhost:8123, database mixer_metrics)
  • MinIO running locally on localhost:9000 with credentials minioadmin/minioadmin

MinIO setup

Start MinIO and create the bucket before running the app:

# Start MinIO (adjust data dir as needed)
minio server /data --console-address ":9001"

# Create the bucket (using the MinIO CLI or the web console at http://localhost:9001)
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/mixer-bucket
mc anonymous set public local/mixer-bucket

First-time setup

# Install Elixir dependencies and set up both databases
mix setup

mix setup runs mix deps.get, creates and migrates both the PostgreSQL and ClickHouse databases, and seeds initial data.

Running the server

mix phx.server

Visit http://localhost:4000. The frontend assets (esbuild + Tailwind) are compiled and watched automatically.

Email in development

Magic-link sign-in emails are delivered to the local Swoosh mailbox. View them at http://localhost:4000/dev/mailbox.

Regenerating the TypeScript RPC client

After changing Ash resource actions or attributes, regenerate the typed TS client:

mix ash_typescript.generate

The output goes to assets/js/ash_rpc.ts.

Production environment variables

Variable Description
DATABASE_URL PostgreSQL connection URL (ecto://user:pass@host/db)
SECRET_KEY_BASE Phoenix secret key (generate with mix phx.gen.secret)
TOKEN_SIGNING_SECRET Ash authentication token signing secret
CLICKHOUSE_URL ClickHouse connection URL (or use individual vars below)
CLICKHOUSE_HOST ClickHouse host
CLICKHOUSE_PORT ClickHouse port (default 8123)
CLICKHOUSE_DATABASE ClickHouse database name (default mixer_metrics)
CLICKHOUSE_USERNAME ClickHouse username (default default)
CLICKHOUSE_PASSWORD ClickHouse password
S3_ACCESS_KEY_ID S3 access key
S3_SECRET_ACCESS_KEY S3 secret key
S3_HOST S3 host (e.g. s3.amazonaws.com)
S3_BUCKET S3 bucket name
S3_ASSET_HOST Public base URL for serving assets (e.g. https://cdn.example.com)
S3_SCHEME S3 scheme (default https://)
S3_PORT S3 port (default 80)
S3_VIRTUAL_HOST Use virtual-hosted S3 URLs (default false)
BREVO_API_KEY Brevo (Sendinblue) API key for transactional email
PHX_HOST Public hostname (default mixer.jimweaver.com)
PORT HTTP port (default 4000)
PHX_SERVER Set to true to start the HTTP server in a release

About

(Mirror) A twitter clone for me to learn more elixir, phoenix, and ash with.

Topics

Resources

Stars

Watchers

Forks

Contributors