{%- comment %} Here's the complete hierarchy of software.json: The "top" level is the object type (eg, hardware, software, documentation) The second level is a "machine" aka platform key (eg, osi, pcx86, etc.) The third level is a set of category keys (eg, app, driver, lang, sys, etc.) The fourth level is a set of subcategory keys (eg, apl, basic, c, pascal, etc.) The fifth level is a set of vendor keys (eg, borland, dresearch, ibm, microsoft, etc.) The sixth level is a set of product keys (eg, quickbasic, visualbasic, etc.) The seventh level is a set of versions (eg, 1.00, 2.00, etc.) inside a @versions object The eighth level is a list of media items inside a @media array However, entries in software.json are allowed to "short-circuit" this hierarchy to some extent; ie, you can "jump" from platform, category, or subcategory directly to products by placing a "@products" key inside any of those three levels. The "osi" section is one example: there is a limited amount of software for that platform, so there's no need to force users to drill down as much; the subcategories of BASIC programs are more like vendors, each subcategory has a list of products, and each product is a single media item (assumed whenever @versions is omitted). Other special keys include: @title: this should generally appear at every level, because the keys only describe the hierarchy of the objects, not their names; one exception are version entries, where the version key *is* the version number, and if a no @title is present for a version, a default title (product @title plus version key) will be used instead. @hardware: an optional entry inside a version to define a default hardware configuration; if that entry contains a 'url' property, we will use it to generate a link (hardware_url) for running the software. @autoMount: an optional entry inside a version to define a "custom" autoMount URL parameter, instead of the one automatically generated from the list of @media items; eg: "@autoMount": { "A": {"@diskette": "IBM-PCDOS-200-DISK1.json"}, "B": {"@diskette": "IBM-PCDOS-200-DISK2.json"} } @bootable: if there is no "custom" autoMount setting, then one will be automatically generated from the @media items, and @bootable determines whether or not the first item will be loaded into the boot drive (assumed to be "A"). {%- endcomment %}