Deploy without the setup wizard
Seed the first admin and LLM key from environment variables for automated and container-platform deployments.
Container platforms (Cloud Run, Fly.io, Azure App Service, Kubernetes) inject configuration as environment variables and do not support a browser interaction at first boot. TulipFarm's headless mode seeds the instance automatically when it detects the right variables.
Before you begin
You need:
- A running TulipFarm deployment reachable over HTTPS (or HTTP for local testing).
- The ability to set environment variables in your platform's configuration.
- An API key for an LLM provider (Anthropic or OpenAI).
Set the headless seeding variables
Add all three to your deployment's environment:
ADMIN_EMAIL=admin@your-domain.com
ADMIN_PASSWORD=a-strong-password
LLM_API_KEY=sk-ant-... # or an OpenAI keyFor OpenAI instead of Anthropic:
LLM_PROVIDER=openai
LLM_API_KEY=sk-...To set the business name at the same time:
BUSINESS_NAME=Acme Corp
BUSINESS_DESCRIPTION=We sell widgets. # optionalAll three (ADMIN_EMAIL, ADMIN_PASSWORD, LLM_API_KEY) must be set together.
In production (NODE_ENV=production), providing ADMIN_EMAIL and ADMIN_PASSWORD
without LLM_API_KEY causes the API to refuse to start.
Deploy and verify
Deploy your instance. On the first boot the API logs confirm seeding:
Bootstrapped admin user admin@your-domain.com
Seeded anthropic LLM API key from envConfirm the status endpoint returns needsSetup: false:
curl https://your-instance/api/v1/setup/status{ "needsSetup": false }The web app will load the main workspace directly, bypassing the setup wizard.
What happens on restart
The seed operation is idempotent. If ADMIN_EMAIL and ADMIN_PASSWORD are still set on
a subsequent restart, the API checks whether a user already exists before creating one. If
the user exists, the seed step is skipped silently.
setupComplete: true is written to soul.yaml on the first successful seed. On later
boots, the instance reads this flag and skips all setup checks without touching the
database.
Configure LLM tiers after deployment
Headless seeding stores the LLM key and writes a default llm.config.yaml with the
provider in all three tiers (quick, standard, complex) pointing to a default model. To
adjust the model or add a fallback chain, sign in as the admin and go to
Settings → LLM Config.
Remove the wizard permanently
Once you have signed in and confirmed the workspace is functional, you can remove
ADMIN_EMAIL and ADMIN_PASSWORD from your deployment environment. Keeping them present
is harmless (the seed is idempotent), but removing them is good hygiene — there is no
reason for a password to sit in an environment variable indefinitely.
Removing the variables after the first boot does not affect the running instance. The
setupComplete flag in soul.yaml is the permanent signal; the env vars are only read
during the seed step.