Project Snapshot
A project snapshot is a portable export of your Descope project configuration. Use snapshots to back up settings, promote changes across environments (for example, development to staging to production), or track configuration in source control. The quick reference below maps each path to its purpose; later sections go deeper on the more complex areas.
Snapshot Structure
When you export a project, Descope writes the configuration to a folder of JSON files and subdirectories. Each top-level file or folder maps to a configuration area in your project. The layout below shows what a typical export contains.
Quick Reference
| Path | Description |
|---|---|
applications.json | Federated application (OIDC/SAML) configurations. |
assets/ | Images, email templates, and other referenced media. assets.json maps each file to the snapshot paths that use it. Learn More. |
auth/ | One JSON file per enabled authentication method (for example, magiclink.json, otp.json, sso.json). |
connectors/ | Connector index and per-connector configuration. Credentials are excluded from snapshot. |
flows/ | Flow index and per-flow folders with metadata.json, contents.json, and one JSON file per screen. Learn More. |
outboundapps.json | Outbound application configurations for third-party API access. |
project.json | Project-level settings such as user invitation templates, token lifetimes, and trusted domains. |
resources.json | OAuth resource servers, such as backend APIs or MCP servers. |
roles.json | RBAC roles and permissions. |
snapshot.json | Snapshot format version. |
styles/ | Style index and theme override files for flows and widgets. Learn More. |
widgets/ | Widget definitions and widget flow configurations. widgets.json lists each widget; each ID has its own folder. Learn More. |
Assets
The assets/ directory holds binary and text files referenced elsewhere in the snapshot, like flow screen images, OAuth provider logos, email templates, and similar content. assets.json is the manifest: it maps each asset file to the snapshot paths and fields that reference it.
Asset files use content-based names with a type prefix. The hash in each filename is derived from the file contents, so identical assets share the same name across exports.
| Prefix | Description |
|---|---|
img- | Images used in flows, widgets, styles, or OAuth provider configuration (for example, .svg or .png). |
body- | HTML content, such as email or messaging templates for auth methods like magic link or OTP. |
emailbody- | Plain-text email body content. |
Other snapshot files reference assets with an asset: prefix followed by the filename—for example, "logo": "asset:img-xxxxx.svg" in an OAuth provider configuration.
When exporting with the Descope CLI, pass --no-assets to skip extracting asset files into the snapshot directory.
Flows
The flows/ directory holds every flow in the project. flows.json is the index: it lists each flow by flow ID, and each ID has a matching subdirectory under flows/.
{
"flows": [
"sign-in",
"sign-up-or-in",
"inbound-apps-user-consent"
]
}Each flow folder contains the flow logic, metadata, and one JSON file per screen.
| File | Description |
|---|---|
metadata.json | Flow display name, description, enabled state, and the list of screen IDs in the flow. |
contents.json | Flow logic—the task graph, conditions, actions, and routing between steps. |
screen-<screen-id>.json | UI definition for a single screen, including components, layout, and interactions. One file per screen listed in metadata.json. |
To work with a single flow outside a full project snapshot—for example, to import one flow into another project—use descope flow export or descope flow convert to convert between snapshot format (a flow folder) and a single JSON file.
Styles
The styles/ directory holds every style in the project, including custom styles. styles.json is the index: it lists each style by style ID, and each ID has a matching JSON file under styles/.
{
"componentsVersion": "3.14.10",
"styles": [
"custom-style-1-dark",
"custom-style-1-light",
"dark",
"light",
"sso-suite-default-dark",
"sso-suite-default-light"
]
}
Each style JSON file defines only the changes from Descope’s default light or dark styles. This means your style files specify overrides rather than full copies, making it easy to manage customizations on top of the built-in Descope appearance.
{
"components": {
"container": {
"id": {
"ROOT": {
"--descope-container-background-color": "var(--descope-colors-primary-main)"
}
}
}
},
"globals": {
"colors": {
"secondary": {
"contrast": "#FFFFFF",
"dark": "#355313",
"highlight": "#9DDA58",
"light": "#7BC32B",
"main": "#588B1FFF"
}
}
},
"name": "Custom-Style-1",
"type": "flows"
}Widgets
The widgets/ directory holds every widget in the project. widgets.json is the index: it lists each widget by widget ID, and each ID has a matching subdirectory under widgets/.
{
"widgets": [
"access-key-management",
"role-management",
"user-management",
"user-profile"
]
}Each widget folder contains the flow logic, metadata, and one JSON file per screen.
The widgets/ directory also contains a flows/ subdirectory with all of the widget flows in your project. There is a flows.json file which lists
all of the flows by their unique ID. For each flow ID, there is a corresponding folder under widgets/flows/ that contains a separate JSON file for every screen in that flow, as well as a contents.json file (with the flow logic and task graph) and a metadata.json file (with the flow's display name and configuration).
Project Metadata
Two JSON files at the root of the snapshot describe the project itself and the export:
| File | Description |
|---|---|
project.json | Project-level settings—trusted domains, email templates, session lifetimes, invite configuration, and similar options configured in the console. |
snapshot.json | The snapshot format version and included configuration areas. |