Export and import
Metronomo does not sync to the cloud, but it does provide Export and Import capability via a simple text file JSON schema. This allows you to back up and restore your Grooves and transport them between devices and app installs. The JSON file also makes Grooves programmatically accessible, for whatever possibilities that opens up.
Exporting
Utilities → Export writes your saved Groove library to a file. The file is named
metronomo-yyyy-mm-dd-hhmmss.json, stamped in UTC to the second so a folder of export files
sorts chronologically. If the default name is taken, the new file appends a count, e.g.
metronomo-yyyy-mm-dd-hhmmss (2).json.
The export file
The export file is a plain UTF-8 JSON document. You can open it in any text editor.
The library schema
{
"format": "metronomo.backup",
"version": 1,
"exportedAt": "2026-08-26T14:22:31.004Z",
"appVersion": "1.0.0 (4)",
"grooves": []
}
| Key | Type | Meaning |
|---|---|---|
format |
string | Always metronomo.backup. Import rejects a file without it. |
version |
number | Format version. Guards against breaking changes in the file format. |
exportedAt |
string | ISO 8601 timestamp of the export. Informational. |
appVersion |
string | The app version and build that wrote the file. Also informational. |
grooves |
array | The saved Grooves. Import fails if this is empty. |
The Groove schema
Each entry in the grooves array defines a Groove:
{
"id": "mt1d6i07-4f2a91",
"name": "Shuffle",
"bpm": 96,
"beats": 4,
"accents": [
"strong",
"medium",
"soft",
"medium"
],
"subdivision": 3,
"subdivisionPatterns": {
"3": [
"mute",
"tick",
"soft"
],
"4": [
"mute",
"tick",
"strong",
"tick"
]
},
"countIn": 4,
"alarm": {
"enabled": true,
"seconds": 300
},
"pause": {
"enabled": false
},
"createdAt": 1787220902311,
"updatedAt": 1787752724902
}
| Field | Type | Meaning |
|---|---|---|
id |
string | Unique within the library. A collision on import gives the incoming one a fresh id and renames it, so both Grooves survive. |
name |
string | The name of the Groove. A Groove with no name is skipped on import. |
bpm |
number | Tempo, 20–480. |
beats |
number | Beats per bar, 1–16. |
accents |
array | One level per beat; the length matches beats. |
subdivision |
number | Slots per beat, 1–8. |
subdivisionPatterns |
object | The tick patterns for each subdivision count. |
countIn |
number | Bars counted in before the practice clock starts, 0–8. 0 is no count in. |
alarm |
object | { "enabled": false }, or enabled with seconds, 0–7259 in seconds. |
pause |
object | { "enabled": false }, or enabled with seconds, 1–7259 in seconds. |
createdAt |
number | Unix milliseconds. |
updatedAt |
number | Unix milliseconds. |
An accent level on a beat or a subdivision slot is one of strong, medium, soft,
tick, or mute. In a subdivisionPatterns entry, slot 0 is the beat’s own place in the
grid and is always mute.
Importing
Utilities → Import imports any UTF-8 file that observes the Grooves JSON schema.
A file that parses opens a dialog box with two modes:
- Merge adds the file’s Grooves to your library. Nothing you have already saved is changed or dropped.
- Replace discards your library and installs the import in its place. This cannot be undone.
Under either mode, the Groove you are working on is left alone and can still be saved after the import even if its saved version is replaced. Settings and Preferences are unaffected.
Names and id collisions
Collisions under Merge, or between Grooves in the same file:
- An id already taken forces the duplicate to a fresh id and the name
<name> (imported). - A name already taken forces the duplicate to a new name with a number:
Shufflearriving againstShufflebecomesShuffle (2), thenShuffle (3).
Parse failures
Four conditions stop an import before anything is read. In each case nothing on the device changes:
| What you see | What it means |
|---|---|
| That file isn’t readable as JSON. | The file did not parse. |
| That file isn’t a Metronomo backup. | format is missing or is not metronomo.backup, or version is missing or below 1. |
| That backup was written by a newer version of Metronomo. | version is above the format version for your app install. |
| That backup has no Grooves in it. | grooves was empty, or every Groove in it was skipped. |
The last one is a guard on Replace more than Merge; it prevents you from replacing your Groove library with an empty set.
Import repairs
Given that a Metronomo Grooves file can be created and edited outside of Metronomo, the Import process is designed to repair boundary issues, unrecognized values, and unrecognized keys:
- A number outside the range for a known property is clamped.
- A number that is missing or unreadable for a numeric property takes the app’s default.
- An unrecognized accent level label becomes
medium. - An
accentsarray that does not match the beat count is trimmed or padded. - Keys the app does not know are dropped.
In short, a Groove that survives import is one the app could have created itself.
Four things are not repaired by Import:
- A Groove with no usable
name, or no usablebeats, is skipped entirely. - A
subdivisionPatternsentry is kept only if it describes its own count exactly. If any level is unrecognized, that entry is dropped and replaced by the default tick level.- Unlike
accents, asubdivisionPatternsentry is never trimmed or padded to fit. - Slot 0 is always pinned back to
mute, since the beat sounds fromaccents.
- Unlike
- A file whose
formatis notmetronomo.backupis not importable. - An
alarmorpausewhosesecondsis missing or unreadable is switched off, rather than set to a default.