How a three-way merge keeps your edits
Put your theme beside the new release and you'll see hundreds of differences. Some are your size guide. Most are the theme maker's work. Telling them apart takes a third file.
The third copy tells you who changed what
A three-way merge uses the common ancestor of both versions. For a theme, that's the release you started from. With it, each difference has an owner:
| The original | Yours | The new release | What it means |
|---|---|---|---|
| A | A | B | The theme maker changed it. Take B |
| A | C | A | You changed it. Keep C |
| A | C | B | You both changed it. This needs a decision |
Version control tools have worked this way for decades. Applying it to themes takes one thing most merchants are missing, a clean copy of the release they started from. Molt keeps one for each Dawn and Horizon release.
Most files settle themselves
In a typical upgrade, most files fall into the first two rows. Shopify changed a section you left alone, so the new one goes in. You added a snippet of your own, so it stays.
Files you both changed often still merge cleanly, because the edits sit in different places. Some cases need more. A store added an attribute to a variant input, and Dawn rewrote the same line:
Original: value="{{ value | escape }}"
Your store: value="{{ value | escape }}" data-custom-option="{{ value | handleize }}"
New release: value="{{ escaped_value }}"
A line-based merge sees a conflict. A person reads it and knows what to write:
value="{{ escaped_value }}" data-custom-option="{{ value | handleize }}"
A model handles edits on the same line
For conflicts like that one, Molt sends a model all three versions of the file. The model returns the merged file, a written explanation and a confidence score. Molt then checks the result. Liquid and JSON have to parse. Under 0.7 confidence, the file goes to the merchant's review. And a separate check confirms each line the merchant added still exists somewhere, because a model can drop things while sounding sure.
JSON gets its own treatment. Shopify rewrites JSON templates when they're saved, adding comments and removing default values, so two files can match in meaning and differ in text. Molt merges JSON key by key and compares by meaning.
Code moves between files
Releases often move code to a new file. Dawn might lift part of a section into a snippet, leaving your edit stranded in a block the release removed. Molt looks for the place the surrounding code went and carries your edit along.
It also checks that the result is complete. If a release uses a block your store deleted, Shopify refuses the theme, so Molt brings the block back and tells you.
What we measured
On November 4, 2026, we merged 446 public Dawn themes from GitHub up to Dawn 16.1.1. Early passes lost merchant lines in 111 files, and after the fixes that number was zero.
A separate reviewer then read 32 of the model's merges file by file. 23 were correct and 7 had a minor difference, such as whitespace or an equivalent rewrite. 2 were wrong, and Molt had sent both to review at 0.55 confidence.
Thirty-two files is a small sample, and that reviewer read code rather than rendered pages. A merge is where checking starts, which is why Molt opens your pages on both themes and leaves publishing to you.