---
title: Compare schema snapshots
description: Compare the current schema with a saved snapshot, grouped by cause, and tick off what you planned.
seo:
  image: /og/compare.png
---

**Compare** shows what changed between the current schema and a saved snapshot. Use it to check that a change did what you planned and nothing else, or to see how two environments differ.

1. **Export a snapshot**

    Open **Compare** and export the current schema before you make a change. The file is named after the site and the day, such as `schema-city-snapshot-example-com-2026-10-07.json`, and records the host it came from.

2. **Make your change**

    Edit the schema in Umbraco as usual.

3. **Import it as a baseline**

    Import the file in **Compare**. To compare environments instead, export on one and import on the other.

:::note
Importing a snapshot never changes Umbraco. The comparison covers schema configuration only, not content usage or dependencies in custom code.
:::

## Causes and side effects

One edit can change many types. Add a property to a composition, and every type that composes it changes too. Compare groups the changes so you can tell the edit from what it caused.

```mermaid
---
config:
  flowchart:
    wrappingWidth: 400
---
flowchart TD
    C["Seo Composition<br/>Cause, property added"] --> A["Article<br/>Side effect"]
    C --> H["Home<br/>Side effect"]
    A --> P["Press Release<br/>Side effect via Article"]
```

A **cause** is a type with edits of its own:

- the type was added or removed
- properties were added, removed or changed, or a property got a new Data Type
- its groups or tabs changed
- its compositions, allowed children, or block or picker targets changed

A **side effect** is a type that only changed because of a cause, and sits under it:

- every type that composes or inherits a composition whose properties changed
- every Element Type whose incoming block relationship changed because a host's block list did
- every type whose incoming picker or allowed-child relationship changed, and every parent that gained or lost an allowed child because that child type was added or removed

A type with an edit of its own stays a cause even when it is also a side effect, and says what else it is a side effect of. Every change sits under the causes that explain it, so nothing is dropped. The summary reads, for example, "4 causes, 48 side effects, 1 unplanned".

## Mark what you planned

Tick each cause you planned with its **Planned** box, use **Mark all as planned**, or **Paste a plan** as a list of type aliases. **Show unplanned only** then leaves the changes nobody asked for. The plan lasts as long as the baseline does.

- **Copy as Markdown** gives a ticket-ready list, with both snapshots' hosts and dates, the totals, each cause ticked when planned, and its side effects nested under it.
- **Export CSV** gives one row per line, with the cause it belongs to, whether it is the cause's own edit or a side effect, and whether it was planned.

## See the changes in the city

While a baseline is loaded, the city shows a change layer and dims everything else:

- added types are azure
- types changed by their own edit are amber with a ring
- side effects are a quieter amber
- removed types are outlines where they stood

Choosing a lens replaces the change layer until the lens is off again. Show in city, from the Impact page or a Data Type, replaces it until you clear it. The List view gets a Change column, sortable and filterable, with a row for each removed type.

Matched buildings keep their baseline positions. New types appear on separate added boards.

![Compare against a baseline from before four planned edits, three marked planned, and Press Release open on the types that changed only because it was added.](/blume-assets/content/_/a12ddc268ea32086.png)
