Skip to main content

Remote Configuration

GhostPour serves JSON config files to your iOS app via GET /v1/config/{name}. This lets you update prompts, model lists, and capabilities without App Store releases.

How It Works

  1. JSON files live in config/remote/{slug}.json, each with a top-level "version" integer
  2. All configs are loaded at startup into app.state.remote_configs
  3. iOS app calls GET /v1/config/{slug} on every launch
  4. If the client sends X-Config-Version matching the server version, returns {"changed": false}
  5. Otherwise returns the full JSON payload with the new version header
Why not HTTP 304?

GhostPour returns 200 with {"changed": false} instead of 304 Not Modified because Nginx Proxy Manager mangles bare 304 responses (no cached body to serve) into 404s for downstream clients.

Available Configs

SlugPurpose
idle-tipsOrb idle tip messages
protected-promptsSystem prompts, summary prompts, default prompt modes
llm-providersProvider endpoints and model lists
model-capabilitiesPer-model context slots, token limits, feature readiness

Updating a Config

Edit the JSON in config/remote/, bump the version integer, and redeploy:

{
"version": 5,
"tips": [
"Try asking about action items from your last meeting",
"You can share images for visual context"
]
}

The iOS app picks up changes on its next launch.

Adding a New Config

Drop a .json file with a "version" field into config/remote/ and restart. The slug is the filename without .json. No code changes needed.