tulipfarm docs
Guides

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 key

For 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.   # optional

All 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 env

Confirm 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.

On this page