Remote config for values that need to change after release.
Nona gives web, mobile, and backend apps one self-hosted place to read runtime values: feature-related toggles, copy, limits, JSON settings, and environment-specific behavior.
When remote config earns its keep
Environment variables are still great for deployment wiring. Remote config matters when a value needs to move at runtime, after the artifact is already in the wild.
- Mobile apps need new values without a store release.
- Operators need to change thresholds or kill switches after deploy.
- Backend services need typed settings without rebuilding containers.
- Staging and production need isolated values behind the same code path.
The Nona model
Projects
Application or service boundaries
Environments
Production, staging, development, or any runtime stage
Parameters
Typed text, boolean, number, or JSON values
Scopes
Frontend-readable, server-only, or shared access
API keys
Environment-specific runtime access
Four content types, picked for the value at hand
Every entry has a key, a value, a content type, and a scope — the same building block behind both feature flags and broader remote config.
booleancheckout_v2 = truetextApp:BannerText = "Free shipping this week"numberLimits:MaxItems = 50jsonApp:Settings = {"retries":3,"timeoutMs":2000}Poll cheaply: ETags, 304s, and prefix filters
Every read returns an ETag. Send it back as If-None-Match on your next poll and Nona responds 304 Not Modified with no body when nothing changed — so a mobile app can check for updates on every resume without paying for a full payload each time. Need only one group of settings? Filter the response by key prefix.
# First request — capture the ETag
curl -i "https://nona.example.com/api/environments/production/parameters" \
-H "X-Api-Key: your-api-key"
# ETag: "a1b2c3..."
# Poll again later — send it back as If-None-Match
curl -i "https://nona.example.com/api/environments/production/parameters" \
-H "X-Api-Key: your-api-key" \
-H 'If-None-Match: "a1b2c3..."'
# -> 304 Not Modified, no body, nothing changed
# Only need one group of settings? Filter by prefix.
curl "https://nona.example.com/api/environments/production/parameters?prefix=App:" \
-H "X-Api-Key: your-api-key"Remote config vs environment variables
These aren't competing systems — most teams use both. Environment variables fit deployment-time wiring: server-only, rarely changing, safe to redeploy for. Remote config fits values that need to change after deployment without a rebuild.
Environment variables
NONA_API_KEY (in the consuming app)Database / infra connection stringsDeployment-specific hostnamesSecret material
Nona (remote config)
Features:CheckoutApp:BannerTextLimits:MaxItemsApp:Settings
First implementation step
Keep the application wiring in env vars, then move one runtime value into Nona from the CLI:
nona entries set \
--project storefront \
--environment production \
--key App:BannerText \
--value "Free shipping this week" \
--scope client \
--content-type textThen read that value from the app over plain HTTP or an official client — see the HTTP client docs.
Frequently asked questions
Are environment variables and remote config competing systems?
No. Most teams use both — the question is which values belong in which layer.
What should stay in environment variables?
Deployment wiring, secret material, and infrastructure-specific settings that rarely change and can safely trigger a restart when they do.
What should move into remote config?
Values that need to change after deployment — feature flags, copy, thresholds, and runtime behavior settings.
How do clients avoid re-fetching config that hasn't changed?
Every read returns an ETag. Send it back as If-None-Match on the next request and Nona returns 304 Not Modified with no body when nothing changed.
Put one runtime value under control.
Add one setting that currently requires a redeploy, then switch your app to read it from Nona.
Get started