Quickstart
Run llmBreakr locally with Docker Compose and send your first request in under five minutes.
This gets a working gateway up with the published Docker image — no local build required.
Create your environment file
Clone the repo (or just grab .env.example) and fill in the required values:
git clone https://github.com/yashb007/llmBreakr-ai-gateway.git
cd llmBreakr-ai-gateway
cp server/.env.example .envAt minimum, set your database credentials, JWT_SECRET, CREDENTIAL_ENCRYPTION_KEY, and the bootstrap super admin:
PORT=4000
DB_HOST=localhost
DB_PORT=3306
DB_NAME=llmbreakr
DB_USER=llmbreakr
DB_PASSWORD=change-me
REDIS_HOST=localhost:6379
JWT_SECRET=change-me
CREDENTIAL_ENCRYPTION_KEY=change-me
SUPER_ADMIN_EMAIL=you@example.com
SUPER_ADMIN_NAME=Your NameSee Configuration for what every variable does.
Start the stack
docker compose up -dThis pulls yashbansal0412/llmbreakr-ai-gateway and starts a single container exposing:
4000— the gateway API and admin API3000— the management dashboard
Pin a specific release instead of latest:
IMAGE_TAG=1.0.2 docker compose up -dllmBreakr expects an external MySQL and Redis — it doesn't bundle
them in docker-compose.yml. Point DB_HOST / REDIS_HOST at your own
instances, or add them as services in your own compose file.
Log in and add a provider
Open the dashboard at http://localhost:3000, sign in with your SUPER_ADMIN_EMAIL, and add credentials for at least one provider (OpenAI, Anthropic, or Gemini) under provider configuration.
Create a project and a virtual key
From the dashboard, create a project, scope it to the models it's allowed to call, and issue a virtual key for it. That key — not your raw provider key — is what your applications will use.
Send your first request
curl -X POST http://localhost:4000/api/data/v1/chat/completions \
-H "Authorization: Bearer <virtual_key>" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{ "role": "user", "content": "Hello" }]
}'Swap model for any Anthropic or Gemini model you've enabled for the project — the request shape doesn't change.