Configuration Options
Windshift is configured through CLI flags and environment variables. Flags take precedence over environment variables.
Server
| Flag | Env Var | Default | Description |
|---|---|---|---|
--port, -p |
PORT |
8080 |
HTTP server port |
--use-proxy |
USE_PROXY |
false |
Trust X-Forwarded-Proto headers |
--allowed-hosts |
ALLOWED_HOSTS |
- | Comma-separated allowed hostnames |
--base-url |
BASE_URL |
- | Public URL for generating links in emails, SSO redirects, and calendar feeds |
--allowed-port |
- | - | Port for CORS and WebAuthn origin |
--additional-proxies |
ADDITIONAL_PROXIES |
- | Additional trusted proxy IP addresses |
--no-csrf |
- | false |
Disable CSRF protection (development only) |
Database
| Flag | Env Var | Default | Description |
|---|---|---|---|
--db |
DB_PATH |
windshift.db |
SQLite database file path |
--postgres-connection-string |
POSTGRES_CONNECTION_STRING |
- | PostgreSQL connection string |
--pg-conn |
- | - | Short alias for --postgres-connection-string |
| - | DB_TYPE |
- | Database type override |
--max-read-conns |
MAX_READ_CONNS |
120 |
Max SQLite read connections |
--max-write-conns |
MAX_WRITE_CONNS |
1 |
Max SQLite write connections |
Files & Attachments
| Flag | Env Var | Default | Description |
|---|---|---|---|
--attachment-path |
ATTACHMENT_PATH |
- | Path for file attachments storage |
TLS
| Flag | Env Var | Default | Description |
|---|---|---|---|
--tls-cert |
- | - | Path to TLS certificate file |
--tls-key |
- | - | Path to TLS private key file |
SSH / TUI
| Flag | Env Var | Default | Description |
|---|---|---|---|
--ssh |
SSH_ENABLED |
false |
Enable SSH TUI server |
--ssh-port |
SSH_PORT |
23234 |
SSH server port |
--ssh-host |
SSH_HOST |
localhost |
SSH server bind address |
--ssh-key |
- | - | Path to SSH host key file |
Logging
| Flag | Env Var | Default | Description |
|---|---|---|---|
--log-level |
LOG_LEVEL |
info |
Log level: debug, info, warn, error |
--log-format |
LOG_FORMAT |
text |
Log format: text, json, logfmt |
Plugins
| Flag | Env Var | Default | Description |
|---|---|---|---|
--disable-plugins |
DISABLE_PLUGINS |
false |
Disable the plugin system |
Authentication
| Flag | Env Var | Default | Description |
|---|---|---|---|
--enable-fallback |
ENABLE_ADMIN_FALLBACK |
false |
Enable admin password fallback for restrictive auth setups |
AI / LLM
| Flag | Env Var | Default | Description |
|---|---|---|---|
--llm-providers |
LLM_PROVIDERS_FILE |
- | Path to a custom LLM providers JSON file |
--ai-prompts-dir |
AI_PROMPTS_DIR |
/data/prompts (Docker) |
Directory containing custom AI prompt override files |
| - | LLM_ENDPOINT |
- | Endpoint for an OpenAI-compatible inference service |
AI features are powered by a language model. Most deployments connect an external provider (Anthropic, OpenAI, Google Gemini, and others) from the in-app AI settings — paste an API key and pick a model. The settings below are for operators who want to customize the provider catalog, run their own model, or tune the prompts. See the user-facing AI Features guide for the admin workflow.
LLM providers file
Windshift ships with a built-in catalog of providers that appear in the AI settings out of the box:
| Provider | type |
API format |
|---|---|---|
| Anthropic | anthropic |
anthropic |
| OpenAI | openai |
openai |
| Google Gemini | gemini |
openai |
| Z.AI | zai |
openai |
| OpenRouter | openrouter |
openai |
| Local / Custom | local |
openai |
To add providers, change the default models, or point at a different base URL,
supply your own JSON file via --llm-providers / LLM_PROVIDERS_FILE. The file
replaces the built-in catalog. The easiest starting point is the bundled
default — copy it and edit:
internal/llm/llm_providers.json on GitHub
Each entry describes one provider and the models offered for it:
{
"providers": [
{
"type": "openai",
"name": "OpenAI",
"api_format": "openai",
"base_url": "https://api.openai.com",
"models_endpoint": "/v1/models",
"models_auth_scheme": "bearer",
"models_response_format": "openai",
"models": [
{ "id": "gpt-4o", "name": "GPT-4o", "max_tokens": 4096 }
]
}
]
}Any OpenAI-compatible endpoint works with "api_format": "openai" — set
base_url to your service. You can also point Windshift at a self-hosted,
OpenAI-compatible inference server with LLM_ENDPOINT instead of (or alongside)
a hosted provider.
AI prompt overrides
Every AI feature uses an embedded system prompt that works out of the box. To
tune the wording, tone, or instructions for a feature, place a <name>.txt file
in the directory given by --ai-prompts-dir / AI_PROMPTS_DIR (the Docker image
defaults this to /data/prompts). Only the files you provide are used — anything
missing or empty keeps its built-in default, so you can override a single feature
without touching the rest.
| Filename | Feature |
|---|---|
plan_my_day.txt |
Plan My Day |
catch_me_up.txt |
Catch Me Up |
find_similar.txt |
Find Similar |
decompose.txt |
Decompose |
release_notes.txt |
Release Notes |
dependency_analysis.txt |
Dependency Analysis |
ai_chat.txt |
AI Chat |
daily_briefing.txt |
Daily Briefing |
summarize_test_plan.txt |
Summarize Test Plan |
coding_agent_initial.txt |
Coding agent initial run prompt |
The current default prompts are a useful reference — copy one and edit it:
internal/llm/prompts/ on GitHub
Important:
ai_chat.txtcontains four runtime placeholders —%s(today's date),%s(current user's name),%d(user ID), and%d(assignee ID for "my items" lookups), in that order. Preserve all four in the same order when overriding this prompt, or chat output will be malformed.
In Docker, mount your overrides at the prompts directory:
services:
windshift:
image: ghcr.io/windshiftapp/windshift:latest
volumes:
- ./my-prompts:/data/prompts:roTo verify an override loaded without spending a model call, append
?preview=true to an AI feature endpoint — the response echoes the assembled
system prompt instead of calling the LLM:
curl "http://localhost:8080/ai/plan-my-day?preview=true"Examples
Minimal (SQLite)
./windshift --port 3000 --db /data/windshift.dbProduction (PostgreSQL + Proxy)
./windshift \
--port 8080 \
--postgres-connection-string "postgres://windshift:secret@db:5432/windshift?sslmode=require" \
--use-proxy \
--allowed-hosts windshift.example.com \
--base-url https://windshift.example.com \
--attachment-path /data/attachments \
--log-level info \
--log-format jsonDevelopment
./windshift \
--port 8080 \
--db dev.db \
--log-level debug \
--no-csrf