[{"data":1,"prerenderedAt":518},["ShallowReactive",2],{"docs":3,"doc:\u002Fdocs\u002Fverification":88},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84],{"path":5,"title":6,"description":7},"\u002Fdocs\u002Fcodemods","Codemods","A codemod is a small program that changes Live Sets. livesaver runs it over folders of sets, shows\nwhat would change, and with --apply writes the changes the same way every livesaver command\ndoes: the result must be well-formed XML, Live's backup scheme is followed\n(Backup\u002F\u003Cset> [date time].als), the run is journaled, and livesaver undo \u003Crun> puts every set\nback.",{"path":9,"title":10,"description":11},"\u002Fdocs\u002Fformat","Ableton Live file formats — what livesaver relies on","Facts collected from Live's own files (verified against real sets) and public research\n(Steinberg VST3 SDK, JUCE, Ableton's maxdevtools). Each page names its sources.",{"path":13,"title":14,"description":15},"\u002Fdocs\u002Fformat\u002Fcontainers","Containers and id spaces","How Live's files are packed: which are gzip-compressed XML and which are binary, what lies beside them, and how the ids inside a document are numbered.",{"path":17,"title":18,"description":19},"\u002Fdocs\u002Fformat\u002Ffileref","FileRef","A \u003CFileRef> locates one file. It appears in many containers, but only some are real dependencies.",{"path":21,"title":22,"description":23},"\u002Fdocs\u002Fformat\u002Ffinder","Finder tags, comments and plug-in bundles (macOS)","What status, reorg and the plug-in inventory read and write outside Live's own files.",{"path":25,"title":26,"description":27},"\u002Fdocs\u002Fformat\u002Ffingerprints","Fingerprints","How Live recognises a file again: the size and the checksum it stores with every reference, where vendors and pack updates break that, and what livesaver compares instead.",{"path":29,"title":30,"description":31},"\u002Fdocs\u002Fformat\u002Flive-setup","Live installation and library locations","Where Live keeps its app resources, its library folders and its own databases, and how livesaver finds them without being told. Everything below was read on a Mac; Windows is at the end, from Ableton's documentation.",{"path":33,"title":34,"description":35},"\u002Fdocs\u002Fformat\u002Fplugins","Plug-ins in Live Sets","How a Live Set stores a plug-in in each format, how the same plug-in is recognised across formats, and what an upgrade from VST2 to VST3 has to carry over.",{"path":37,"title":38,"description":39},"\u002Fdocs\u002Fformat\u002Fversions","\u003CAbleton> root attributes per Live version","The root is \u003CAbleton MajorVersion MinorVersion SchemaChangeCount Creator Revision>. Creator is \"Ableton Live x.y.z\".",{"path":41,"title":42,"description":43},"\u002Fdocs\u002Fguide\u002Fbrowser","In the browser","The app also runs on its own, as a page in your browser. It reads the folders you give it and changes nothing: good for a first look, or on a computer where you cannot install anything. In Chrome and Edge it can also fix samples and upgrade plug-ins, if you switch that on: see Fixing in the page.",{"path":45,"title":46,"description":47},"\u002Fdocs\u002Fguide\u002Fcommand-line","The command line","Everything the app does, the livesaver command does too, and more: project status in Finder, a catalog of your sets to search, and codemods. Every command only plans unless you pass --apply.",{"path":49,"title":50,"description":51},"\u002Fdocs\u002Fguide\u002Fgetting-started","Getting started","livesaver finds the samples your Ableton Live sets have lost, collects them into their projects, and shows which plug-ins are missing. This page takes you from nothing to your first scan.",{"path":53,"title":54,"description":55},"\u002Fdocs\u002Fguide\u002Fhistory","History and undo","Everything livesaver changes is written down as a run: what it was asked, every step it took, and the original of every set it rewrote. That is what makes an undo possible, also weeks later.",{"path":57,"title":58,"description":59},"\u002Fdocs\u002Fguide\u002Fmissing","When samples stay missing","A fix can only find what is in the folders it searches. What stays missing is listed by where it came from, because what helps differs: a pack is installed again, an old drive is plugged in, a folder is added.",{"path":61,"title":62,"description":63},"\u002Fdocs\u002Fguide\u002Fplugins","Plug-ins","Live finds a plug-in by its format and its id, never by its name. livesaver reads which plug-ins your sets use and compares them with what is installed, the way Live does, so you know before you open a set what will be missing in it.",{"path":65,"title":66,"description":67},"\u002Fdocs\u002Fguide\u002Fquestions","Questions and answers","Short answers to what comes up first. If yours is not here, ask on GitHub.",{"path":69,"title":70,"description":71},"\u002Fdocs\u002Fguide\u002Fsafety","How your work is kept safe","livesaver edits the files your music lives in. These are the rules it keeps, so that nothing is lost.",{"path":73,"title":74,"description":75},"\u002Fdocs\u002Fguide\u002Fsamples","Fix missing samples","A set that has lost its samples opens in Live with “Media files are missing”. livesaver finds the files again by what they are, puts them into the project, and points the set at them, for every project at once.",{"path":77,"title":78,"description":79},"\u002Fdocs\u002Fguide\u002Fwindows","livesaver on Windows","livesaver is made and tested on a Mac. Windows is new: it is built from what Ableton documents about Live on Windows and from the way sets that were saved on Windows store their files. No one has tried it on a Windows computer with Live yet. This page says what is there, what differs from a Mac, and what is not known.",{"path":81,"title":82,"description":83},"\u002Fdocs\u002Fverification","Verification","What is checked, and how to repeat it. Checks on a real library are read-only; everything that\nwrites runs on temporary copies.",{"path":85,"title":86,"description":87},"\u002Fdocs\u002Fweb","The web app","apps\u002Fweb is one app (Vite, Vue, Nuxt UI) that runs in two situations:",{"id":89,"title":82,"body":90,"description":83,"extension":512,"meta":513,"navigation":514,"path":81,"seo":515,"stem":516,"__hash__":517},"docs\u002Fdocs\u002Fverification.md",{"type":91,"value":92,"toc":504},"minimark",[93,97,100,110,260,264,274,352,356,359,495,498],[94,95,82],"h1",{"id":96},"verification",[98,99,83],"p",{},[101,102,104,105,109],"h2",{"id":103},"tests-bun-test","Tests (",[106,107,108],"code",{},"bun test",")",[111,112,113,163,173,179,185,203,223,241],"ul",{},[114,115,116,120,121,124,125,130,131],"li",{},[117,118,119],"strong",{},"Live-saved fixtures"," (",[106,122,123],{},"fixtures\u002F",", see ",[126,127,129],"a",{"href":128},"..\u002Ffixtures\u002FREADME","fixtures\u002FREADME.md","):\n",[111,132,133,147,153],{},[114,134,135,138,139,142,143,146],{},[106,136,137],{},"Brokenpath Project",": after ",[106,140,141],{},"collect --apply",", its references are byte-identical to what Live's\nown \"Collect All and Save\" wrote (",[106,144,145],{},"Fixed Path Project","), and the rest of the set is unchanged.",[114,148,149,152],{},[106,150,151],{},"VST2toVST3 Project",": Live saved each plug-in once as VST2 and once as VST3. The conversion\nmatches Live: Massive keeps its parameters and automation, Omnisphere's wrapped state is\nbyte-equal to Live's, and Serum's parameter list is reset.",[114,154,155,158,159,162],{},[106,156,157],{},"samples\u002FLib1\u002FKick\u002F1.wav",": the CRC livesaver computes equals the ",[106,160,161],{},"OriginalCrc"," Live stored.",[114,164,165,168,169,172],{},[117,166,167],{},"Every write path"," (collect, VST2 → VST3, status, rating sheet, reorg, move, codemods) has\ntests that apply it in a temp folder and then run ",[106,170,171],{},"undo",".",[114,174,175,178],{},[117,176,177],{},"Property tests"," for the XML scanner and patcher: random edits are applied, written and read\nback; an empty patch round-trips byte-identically.",[114,180,181,184],{},[106,182,183],{},"bun run test:node"," runs the built CLI under Node.js (collect + undo, status + undo, the\nweb server).",[114,186,187,190,191,194,195,198,199,202],{},[117,188,189],{},"Windows",", on a Mac: paths with a drive in the path helper; a fix and its undo on a made-up\ndisk with drive letters (",[106,192,193],{},"packages\u002Fops\u002Ftest\u002Fwindows.test.ts",", ",[106,196,197],{},"packages\u002Fweb\u002Ftest\u002Fwindows.test.ts","),\nwith a set of Live 10 that stores its path in backslashes; Live's folders, its settings file\nand the list of running programs as Windows has them (",[106,200,201],{},"packages\u002Fnode\u002Ftest\u002Fwindows.test.ts",").\nNone of it was tried with Live on Windows.",[114,204,205,208,209,212,213,215,216,218,219,222],{},[117,206,207],{},"On a Windows machine"," (CI, ",[106,210,211],{},"windows-latest","): ",[106,214,183],{}," runs the built command\nline there. It fixes the sets of ",[106,217,123],{}," and takes the fix back byte for byte, with the\npaths it writes read back from the set (",[106,220,221],{},"C:\u002F…\u002FSamples\u002FImported\u002F1.wav","); says where Ableton\nkeeps its folders there; refuses to write while a program called like Live runs (a copy of\nNode.js under Live's name); and moves what an undo removes to its trash folder. No Live is\ninstalled there, and no browser test runs there.",[114,224,225,228,229,232,233,236,237,240],{},[117,226,227],{},"Output in a pipe",": ",[106,230,231],{},"doctor --json"," over 400 sets through a shell pipe must arrive whole.\n(Under Bun, ",[106,234,235],{},"console.log"," dropped what a pipe could not take at once, 64 KB, as soon as\n",[106,238,239],{},"process.stdout"," had been looked at; the command line writes through the stream instead.)",[114,242,243,246,247,250,251,255,256,259],{},[106,244,245],{},"bun run test:web"," runs the built web app in a headless browser: on its own (read-only), and\nwith livesaver behind it, where it fixes one project, undoes, and fixes all on temporary\ncopies, upgrades plug-ins, and undoes runs from the history. Fixing in the page itself\n(Chromium) is compared with ",[106,248,249],{},"livesaver collect --apply"," on the same projects, and an upgrade\nof plug-ins in the page with the set livesaver writes; the folder lies in the browser's\nprivate file system, since no test browser lets a page write to the disk without a person\n(see ",[126,252,254],{"href":253},"web#how-it-is-tested","web.md","). One test does write to a folder of the disk, in\nChromium with a profile that allows the site to edit files: with the names a browser hides\nin such a folder, the fix writes the sets it can and fails for none. Shown a plug-in folder\nand Live's database folder,\nthe page says of the plug-ins what livesaver says. A scan of the size of a real\nlibrary (9,305 planned changes) must stay quick in its tables. On a real library its report\nfiles are byte-identical to the command line's (see ",[126,257,254],{"href":258},"web",").",[101,261,263],{"id":262},"corpus-round-trip","Corpus round trip",[98,265,266,269,270,273],{},[106,267,268],{},"LIVESAVER_CORPUS=\u003Cfolder> bun test corpus"," (read-only): every Live document below the folder,\nbackups included, must decode, scan and round-trip byte-identically through an empty patch. On\nevery 7th file the references are cross-checked against an independent regular expression, and\nthe plug-ins read from the plug-in devices alone (",[106,271,272],{},"pluginUses",") against those of the full\nanalysis.",[275,276,277,297],"table",{},[278,279,280],"thead",{},[281,282,283,287,291,294],"tr",{},[284,285,286],"th",{},"Corpus",[284,288,290],{"align":289},"right","Files",[284,292,293],{"align":289},"XML",[284,295,296],{},"Result",[298,299,300,315,334],"tbody",{},[281,301,302,306,309,312],{},[303,304,305],"td",{},"a music folder (sets and backups)",[303,307,308],{"align":289},"3,350",[303,310,311],{"align":289},"43.8 GB",[303,313,314],{},"all decode, scan, and round-trip byte-identically; 1,267,218 references; 479 files cross-checked against an independent regular expression, and their 1,210 plug-ins against the full analysis",[281,316,317,325,328,331],{},[303,318,319,120,322,109],{},[106,320,321],{},"~\u002FMusic\u002FAbleton",[106,323,324],{},".adg\u002F.adv\u002F.alc\u002F.agr\u002F.als",[303,326,327],{"align":289},"10,100",[303,329,330],{"align":289},"8.0 GB",[303,332,333],{},"same; 13 old binary grooves reported as unsupported",[281,335,336,345,347,349],{},[303,337,338,339,341,342],{},"a music folder, every set and backup: ",[106,340,272],{}," against ",[106,343,344],{},"analyzeSet",[303,346,308],{"align":289},[303,348,311],{"align":289},[303,350,351],{},"the same plug-ins and instance counts in every file (8,368 in all), in 11 s of CPU instead of 144 s",[101,353,355],{"id":354},"speed","Speed",[98,357,358],{},"On a library of 842 sets (804 MB gzipped, 11.9 GB of XML), Apple Silicon, 8 cores:",[275,360,361,371],{},[278,362,363],{},[281,364,365,368],{},[284,366,367],{},"Command",[284,369,370],{"align":289},"Time",[298,372,373,384,394,407,418,429,441,452,462,470,484],{},[281,374,375,381],{},[303,376,377,380],{},[106,378,379],{},"doctor",", full scan with the element index",[303,382,383],{"align":289},"34 s",[281,385,386,391],{},[303,387,388,390],{},[106,389,379],{},", reference search instead of a full scan",[303,392,393],{"align":289},"14 s",[281,395,396,401],{},[303,397,398,400],{},[106,399,379],{},", plus parse workers",[303,402,403,406],{"align":289},[117,404,405],{},"7.0 s"," cold, 3.3 s with the complete-sets cache",[281,408,409,415],{},[303,410,411,414],{},[106,412,413],{},"status"," (827 sets, dry run)",[303,416,417],{"align":289},"12 s",[281,419,420,426],{},[303,421,422,425],{},[106,423,424],{},"plugins audit"," (876 sets), full analysis of every set",[303,427,428],{"align":289},"11 s",[281,430,431,436],{},[303,432,433,435],{},[106,434,424],{},", plug-ins read from the plug-in devices alone",[303,437,438],{"align":289},[117,439,440],{},"3.4 s",[281,442,443,449],{},[303,444,445,448],{},[106,446,447],{},"plugins upgrade"," (876 sets, dry run), one set at a time",[303,450,451],{"align":289},"8.4 s",[281,453,454,459],{},[303,455,456,458],{},[106,457,447],{},", parse workers, rack and automation ids found by string search",[303,460,461],{"align":289},"7.1 s",[281,463,464,467],{},[303,465,466],{},"a scan of the web app (samples and plug-ins, 876 sets)",[303,468,469],{"align":289},"12.5 s",[281,471,472,477],{},[303,473,474],{},[106,475,476],{},"index",[303,478,479,480,483],{"align":289},"12.4 s the first time, ",[117,481,482],{},"0.6 s"," when nothing changed",[281,485,486,492],{},[303,487,488,489,109],{},"under Node (built ",[106,490,491],{},"dist",[303,493,494],{"align":289},"same pipeline, worker threads included",[98,496,497],{},"Scanner: ~495 MB\u002Fs per core on a 45 MB set (611k elements). Native byte search: ~10 GB\u002Fs.",[98,499,500,501,503],{},"Open: a warm ",[106,502,379],{}," under 2 s needs the collect decisions cached across runs.",{"title":505,"searchDepth":506,"depth":506,"links":507},"",2,[508,510,511],{"id":103,"depth":506,"text":509},"Tests (bun test)",{"id":262,"depth":506,"text":263},{"id":354,"depth":506,"text":355},"md",{},true,{"title":82,"description":83},"docs\u002Fverification","q1FX8hKiDCwy_DxHmKc0KTfEA07BQIQYiN4XfxTfiHY",1791245844395]