OneEnv
Getting Started

How to use OneEnv

Everything below is the real product, in the order you'd actually click through it — from logging in to your first shared value going live across services. No step skipped, no screen assumed.

The core idea, in one loop

Every governed change in OneEnv — an env value, a DB column, an API route, a validation rule — moves through the exact same six-step loop. Learn it once and you already know how all four domains work.

Edit a value
from anywhere in the app
→
Stage on a branch
nothing applies yet
→
Submit for review
one diff, whole branch
→
Owner/Admin merges
one deliberate decision
→
Each service reviews
approve or reject, independently
→
Live in export
only for who approved

From zero to your first governed change

Nine steps, start to finish. Each one ends with what unlocks next, so you always know where you're headed.

1

Log in — no password to remember

Enter your email on the login page and we send a 6-digit code, valid for a few minutes. Type it in and you're in — no password to create, reset, or leak.

NextYou'll land on your workspace list — empty the first time.

The 6-digit code entry screen after requesting a login code
Real screen — request a code, type it in, you're in.
2

Create a workspace

A workspace is the top-level container for one team or product — its services, shared variables, database structure, API routes, and everyone who can see them. You can belong to more than one; each is fully separate.

NextGive it a name and you're dropped straight into it.

The workspace list, empty on first login
Empty the first time you log in.
The Create workspace dialog with a name filled in
Name it, and you're dropped straight in.
3

Add your services

One entry per deployable — a repo, a language (PHP, Node, Python, Scala, React, Angular, or other), and an export format (shell, dotenv, or HOCON). This is the unit everything else attaches to. Already on GitHub? An Owner/Admin can connect the workspace once and import repos directly instead — each becomes a Service with its env keys pre-populated, processed through a daily import window.

NextWith at least one service, the Env Master, DB Master, and API tabs stop being empty shells.

The New service dialog with name, repo URL, and language fields
One entry per deployable — a repo, a language, an export format.
4

Define your shared variables

Open Env Master and add a key the way that fits: one at a time, imported from a system template (Postgres and Typeform ship pre-built), or pasted in bulk from an existing .env file. Each key's value lives on the workspace-level row — there's no more "different value per environment" to keep in sync by hand.

NextA key on its own does nothing yet — a service has to inherit it.

The Env Master Variables table with two keys, DATABASE_URL and API_KEY
Two keys defined — one plain, one flagged secret.
5

Inherit values into a service

From a service's own page, attach an Env Master or a whole Template Instance. Attaching only needs membership; actually pulling in the real value needs edit permission on that service — a deliberate two-step gate so browsing what exists doesn't require the same trust as reading secrets.

NextThe service's export now resolves that key. Change it once, and every inheriting service needs to weigh in before the change is theirs.

A service's Variables tab right after inheriting DATABASE_URL
payments-api now inherits DATABASE_URL — attaching is instant, membership is all it takes.
6

Make your first change on a branch

Pick or create a Branch from the topbar selector — it's active everywhere in the app from that point on. Now edit a value from any screen: Env Master, a service's own page, wherever. It doesn't apply. It stages as a change on that branch, exactly like a pull request diff, and a concurrent edit to the same value is caught as a conflict instead of silently overwritten.

NextNothing is live yet. The branch needs to be submitted.

The New branch dialog, naming a branch add-database-url
Create a branch from the topbar — active everywhere from then on.
A toast confirming DATABASE_URL was staged on the branch, table value still unchanged
Edited the value — staged, not applied. The table hasn't moved yet.
7

Submit it, one person merges it

Submit the branch and every Owner/Admin gets a single review notification for the whole diff — readiness score, breaking-change flags, and a comment thread included. One deliberate merge, not an auto-apply.

NextMerging doesn't finish the job — it starts the per-service sign-off.

The branch detail page showing a 100/100 readiness score and the staged diff
Every branch gets a readiness score and impact matrix before you submit.
The branch_review notification with Approve & merge and Reject buttons
One notification, one deliberate Approve & merge.
8

Each affected service approves or rejects

The merge fans out one notification per service that currently inherits what changed, each scored for risk (reach, breaking-change, secret exposure, governance gaps). A service approves and its export moves to the new value; it rejects and keeps serving the last value it actually said yes to. Nothing is forced on anyone.

NextOnce approved, the new value is live for that service — immediately, not on the next deploy.

A risk-scored notification for payments-api with Approve and Reject buttons
Risk-scored, per service — payments-api decides for itself.
9

Pull it into your service

Export as shell, dotenv, HOCON, or a custom template with ${config.*} interpolation — from the UI, or headlessly with a scoped, revocable export token for CI. What comes back is always the value each service actually approved, cached and invalidated the instant anything it depends on changes.

NextYou've done the full loop once. Everything past here is the same pattern applied to more than variables.

The Export tab showing the resolved shell export with the real DATABASE_URL value
The full loop, closed — the approved value, resolved in export.

How a shared variable actually resolves

One more piece worth understanding before you rely on it: a service's own local override always wins over the shared value, and only a value your service has explicitly approved — not just what the workspace currently holds — is what export actually returns.

EnvMaster.value
the one shared value every inheriting service reads from
→ ServiceEnvInheritance.last_synced_value
this service's last APPROVED copy — what export actually resolves
→ override_value (if set)
this service's own local override, always wins when present

Beyond env values: same pattern, three more domains

Once step 6–8 above feels familiar, the rest of the product isn't new material — it's the identical branch → review → per-service-approval loop, applied to structure instead of just values.

DB Master
A shared DB → Table → Column structure services inherit whole, by table, or by single column. Adding or removing a column is governed the same way an env value is; .sql import and a migration-preview generator come built in.
API routes + API Studio
A route is owned by the service that defines it; others get a read-only synced copy or track it as a source. Editing its url/method is governed; everything else — params, headers, tests, mock responses — lives in a built-in IDE-style editor as your own draft.
Validation rules
Reusable rules (regex, min/max, predefined patterns) assignable to a DB column or inherited directly by a service. Change a rule and every column and service using it gets notified once, not once per place it's used.

What to check next

Once your first change is live, these are the screens worth knowing exist — all reachable from the sidebar once you're inside a workspace.

Notifications

The governance inbox — every pending approval, grouped by branch and by entity, risk-scored.

Workspace Report

A weighted health score plus per-domain breakdowns, and a Health Checks tab that flags duplicate keys, orphaned structure, and broken references.

History

The searchable, append-only audit trail — every merge, approval, rejection, and override.

Dependency Graph

Every governed entity in the workspace and how they actually connect, derived live — not hand-maintained.

Members & permissions

Owner/Admin/Member roles, plus a per-service none/view/edit/service_admin grant for finer control.

Tickets & Feature Requests

Raise a support ticket with screenshots, or suggest and vote on what governance capability ships next.

Global Search

Ctrl+K searches every governed domain in the workspace at once — services, env values, DB structure, API routes, validation rules.

Ready to see it on your own workspace?

No password, no card required to start — log in with an email, create a workspace, and step 3 is one click away.