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
- JSON files live in
config/remote/{slug}.json, each with a top-level"version"integer - All configs are loaded at startup into
app.state.remote_configs - iOS app calls
GET /v1/config/{slug}on every launch - If the client sends
X-Config-Versionmatching the server version, returns{"changed": false} - 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
| Slug | Purpose |
|---|---|
idle-tips | Orb idle tip messages |
protected-prompts | System prompts, summary prompts, default prompt modes |
llm-providers | Provider endpoints and model lists |
model-capabilities | Per-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.