From 627981ea908a905121012adc041fc2845c644d92 Mon Sep 17 00:00:00 2001
From: Joshua Melville <joshua.melville@northwestern.edu>
Date: Thu, 21 Nov 2024 11:36:02 +0200
Subject: [PATCH 1/4] fix sidebar generation

---
 apps/documentation/lib/writeSidebarJson.ts |  39 +-
 apps/documentation/public/sidebar.json     | 848 ++++++++++-----------
 apps/documentation/public/sitemap-0.xml    | 128 ++--
 3 files changed, 513 insertions(+), 502 deletions(-)

diff --git a/apps/documentation/lib/writeSidebarJson.ts b/apps/documentation/lib/writeSidebarJson.ts
index a6f0d6b..d908102 100644
--- a/apps/documentation/lib/writeSidebarJson.ts
+++ b/apps/documentation/lib/writeSidebarJson.ts
@@ -1,8 +1,8 @@
 import "dotenv/config"; // This is essential here, because helper functions (below) use env variables, but they are not available in the Node.js environment without dotenv! This file is run directly in Node via tsc.
 import matter from "gray-matter";
-import { readFileSync, readdirSync, writeFileSync } from "node:fs";
+import { readdirSync, readFileSync, writeFileSync } from "node:fs";
 import { join } from "node:path";
-import { type Locale, type TSideBar, locales } from "~/app/types";
+import { locales, type Locale, type SidebarLocaleDefinition, type TSideBar } from "~/app/types";
 import {
 	createFolderEntry,
 	createPageEntry,
@@ -25,7 +25,7 @@ function generateSidebarData() {
 
 	// Set up initial structure for sidebar data.
 	const sidebarData: TSideBar = locales.reduce((acc, locale) => {
-		acc[locale] = {} as TSideBar[Locale];
+		acc[locale] = {} as SidebarLocaleDefinition;
 		return acc;
 	}, {} as TSideBar);
 
@@ -34,16 +34,19 @@ function generateSidebarData() {
 	for (const file of sortedFiles) {
 		if (file.isDirectory()) {
 			const metadata = getMetaDataForDirectory(join(file.path, file.name));
+			const currentLocales = Object.keys(sidebarData);
 
 			if (metadata.type === "project") {
-				for (const locale of Object.keys(sidebarData) as Locale[]) {
+				for (const l of currentLocales) {
+					const locale = l as Locale;
+
 					sidebarData[locale] = {
 						...sidebarData[locale],
 						[file.name]: createProjectEntry(file, locale, metadata),
 					};
 				}
 
-				return;
+				continue;
 			}
 
 			// If this is a folder, create a folder entry
@@ -51,39 +54,45 @@ function generateSidebarData() {
 				const nestedPath = getNestedPath(file.path);
 
 				// Insert folder entry for each locale in the nested path
-				for (const locale of Object.keys(sidebarData) as Locale[]) {
+				for (const l of currentLocales) {
+					const locale = l as Locale;
 					set(sidebarData[locale], [...nestedPath, file.name], createFolderEntry(file, locale, metadata));
 				}
 
-				return;
+				continue;
 			}
 		}
 
 		// Only process files ending in .md or .mdx
-		if (!file.name.endsWith(".md") && !file.name.endsWith(".mdx")) return;
+		if (!file.name.endsWith(".md") && !file.name.endsWith(".mdx")) {
+			continue;
+		}
 
 		// Determine locale based on file name (format is `index.en.mdx` or `index.en.md`)
 		const locale = file.name.split(".")[1] as Locale | undefined;
 
 		// If there's no locale, or the locale isn't included in the type, ignore it.
 		if (!locale || !locales.includes(locale as Locale)) {
+			// eslint-disable-next-line no-console
 			console.warn(
 				`File ${file.name} is missing a locale or has a locale not defined in Locale. Locale is ${locale}. Skipping.`,
 			);
-			return;
+			continue;
 		}
 
-		// create a key based on the filename without the locale or extension
-		// biome-ignore lint/style/noNonNullAssertion: filename is known to have a value here
+		// Create a key based on the filename without the locale or extension
+		// biome-ignore lint/style/noNonNullAssertion: structure is known
 		const key = file.name.split(".")[0]!;
 
-		const nestedPath = getNestedPath(file.parentPath);
+		const nestedPath = getNestedPath(file.path);
 
-		const markdownFile = readFileSync(join(file.parentPath, file.name), "utf-8");
+		const markdownFile = readFileSync(join(file.path, file.name), "utf-8");
 		const matterResult = matter(markdownFile);
 
 		// If file has "hidden: true" in frontmatter, skip it
-		if (matterResult.data.hidden) return;
+		if (matterResult.data.hidden) {
+			continue;
+		}
 
 		set(sidebarData[locale], [...nestedPath, key], createPageEntry(file, matterResult));
 	}
@@ -96,5 +105,7 @@ try {
 
 	writeFileSync(join(process.cwd(), "public", "sidebar.json"), JSON.stringify(sidebarData, null, 2), "utf-8");
 } catch (e) {
+	// eslint-disable-next-line no-console
 	console.log("Error writing sidebar data!", e);
+	throw e;
 }
diff --git a/apps/documentation/public/sidebar.json b/apps/documentation/public/sidebar.json
index 4bc7f5f..3ad5076 100644
--- a/apps/documentation/public/sidebar.json
+++ b/apps/documentation/public/sidebar.json
@@ -1,425 +1,425 @@
 {
-	"en": {
-		"desktop": {
-			"type": "project",
-			"sourceFile": "/docs/desktop/index.en.mdx",
-			"label": "Desktop",
-			"children": {
-				"advanced-topics": {
-					"type": "folder",
-					"expanded": false,
-					"label": "Advanced Topics",
-					"navOrder": 50000,
-					"children": {
-						"network-canvas-graphml": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/advanced-topics/network-canvas-graphml.en.md",
-							"label": "Network Canvas GraphML Format",
-							"navOrder": null
-						},
-						"node-labelling": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/advanced-topics/node-labelling.en.md",
-							"label": "Node Labelling",
-							"navOrder": null
-						},
-						"protocol-file-format": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/advanced-topics/protocol-file-format.en.md",
-							"label": "Protocol File Format",
-							"navOrder": null
-						},
-						"protocol-schema-information": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/advanced-topics/protocol-schema-information.en.mdx",
-							"label": "Protocol Schema Information",
-							"navOrder": null
-						}
-					}
-				},
-				"getting-started": {
-					"type": "folder",
-					"expanded": true,
-					"label": "Getting Started",
-					"navOrder": 1,
-					"children": {
-						"choosing-hardware": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/getting-started/choosing-hardware.en.md",
-							"label": "Choosing a Hardware Device for Interviewer",
-							"navOrder": null
-						},
-						"configuring-devices": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/getting-started/configuring-devices.en.mdx",
-							"label": "Configuring Devices Prior To Starting Data Collection",
-							"navOrder": null
-						},
-						"installation-guide": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/getting-started/installation-guide.en.md",
-							"label": "Installation Guide",
-							"navOrder": 3
-						}
-					}
-				},
-				"interface-documentation": {
-					"type": "folder",
-					"expanded": false,
-					"label": "Interface documentation",
-					"navOrder": null,
-					"children": {
-						"categorical-bin": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/categorical-bin.en.mdx",
-							"label": "Categorical Bin",
-							"navOrder": null
-						},
-						"dyad-census": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/dyad-census.en.md",
-							"label": "Dyad Census",
-							"navOrder": null
-						},
-						"ego-form": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/ego-form.en.md",
-							"label": "Ego Form",
-							"navOrder": null
-						},
-						"information": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/information.en.mdx",
-							"label": "Information",
-							"navOrder": null
-						},
-						"large-roster-name-generator": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/large-roster-name-generator.en.mdx",
-							"label": "Large Roster Name Generator",
-							"navOrder": null
-						},
-						"name-generator-roster": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/name-generator-roster.en.mdx",
-							"label": "Name Generator for Roster Data",
-							"navOrder": null
-						},
-						"name-generator-using-forms": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/name-generator-using-forms.en.mdx",
-							"label": "Name Generator using Forms",
-							"navOrder": null
-						},
-						"name-generator-using-quick-add": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/name-generator-using-quick-add.en.mdx",
-							"label": "Name Generators using Quick Add",
-							"navOrder": null
-						},
-						"narrative": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/narrative.en.md",
-							"label": "Narrative",
-							"navOrder": null
-						},
-						"ordinal-bin": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/ordinal-bin.en.md",
-							"label": "Ordinal Bin",
-							"navOrder": null
-						},
-						"per-alter-edge-form": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/per-alter-edge-form.en.mdx",
-							"label": "Per Alter Edge Form",
-							"navOrder": null
-						},
-						"per-alter-form": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/per-alter-form.en.md",
-							"label": "Per Alter Form",
-							"navOrder": null
-						},
-						"shared": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/shared.en.md",
-							"label": "Shared Interface Options",
-							"navOrder": null
-						},
-						"small-roster-name-generator": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/small-roster-name-generator.en.mdx",
-							"label": "Small Roster Name Generator",
-							"navOrder": null
-						},
-						"sociogram": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/sociogram.en.md",
-							"label": "Sociogram",
-							"navOrder": null
-						},
-						"tie-strength-census": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/interface-documentation/tie-strength-census.en.md",
-							"label": "Tie-Strength Census",
-							"navOrder": null
-						}
-					}
-				},
-				"key-concepts": {
-					"type": "folder",
-					"expanded": false,
-					"label": "Key concepts",
-					"navOrder": null,
-					"children": {
-						"additional-variables": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/additional-variables.en.mdx",
-							"label": "Additional Variables",
-							"navOrder": null
-						},
-						"codebook": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/codebook.en.mdx",
-							"label": "Codebook",
-							"navOrder": null
-						},
-						"field-validation": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/field-validation.en.md",
-							"label": "Field Validation",
-							"navOrder": null
-						},
-						"forms": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/forms.en.mdx",
-							"label": "Forms",
-							"navOrder": null
-						},
-						"input-controls": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/input-controls.en.md",
-							"label": "Input Controls",
-							"navOrder": null
-						},
-						"interfaces": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/interfaces.en.mdx",
-							"label": "Interfaces",
-							"navOrder": null
-						},
-						"network-filtering": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/network-filtering.en.mdx",
-							"label": "Network Filtering",
-							"navOrder": null
-						},
-						"preview-mode": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/preview-mode.en.md",
-							"label": "Preview Mode",
-							"navOrder": null
-						},
-						"prompts": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/prompts.en.mdx",
-							"label": "Prompts",
-							"navOrder": null
-						},
-						"resources": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/resources.en.mdx",
-							"label": "Resources",
-							"navOrder": null
-						},
-						"skip-logic": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/skip-logic.en.mdx",
-							"label": "Skip Logic",
-							"navOrder": null
-						},
-						"the-protocol-file": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/key-concepts/the-protocol-file.en.md",
-							"label": "The Protocol File",
-							"navOrder": null
-						}
-					}
-				},
-				"project-information": {
-					"type": "folder",
-					"expanded": true,
-					"sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
-					"label": "Project Information",
-					"navOrder": 3,
-					"children": {
-						"citing-the-software": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/citing-the-software.en.md",
-							"label": "Citing the Software",
-							"navOrder": 6
-						},
-						"contributing-code": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/contributing-code.en.md",
-							"label": "Contributing Code",
-							"navOrder": null
-						},
-						"faq": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/faq.en.md",
-							"label": "Frequently Asked Questions",
-							"navOrder": 5
-						},
-						"irb-best-practices": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/irb-best-practices.en.md",
-							"label": "IRB and Security Best Practices",
-							"navOrder": null
-						},
-						"project-overview": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
-							"label": "Project Overview",
-							"navOrder": 2
-						},
-						"requests-for-collaboration": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/requests-for-collaboration.en.md",
-							"label": "Requests for Collaboration",
-							"navOrder": null
-						},
-						"security-model": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/project-information/security-model.en.md",
-							"label": "Overview of Security Model",
-							"navOrder": null
-						}
-					}
-				},
-				"tutorials": {
-					"type": "folder",
-					"expanded": true,
-					"label": "Tutorials",
-					"navOrder": 2,
-					"children": {
-						"building-a-protocol": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/tutorials/building-a-protocol.en.mdx",
-							"label": "Building a protocol using Architect",
-							"navOrder": 2
-						},
-						"protocol-and-data-workflows": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/tutorials/protocol-and-data-workflows.en.mdx",
-							"label": "Protocol and Data Workflows",
-							"navOrder": 3
-						},
-						"using-interviewer": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/tutorials/using-interviewer.en.mdx",
-							"label": "Using Interviewer",
-							"navOrder": 1
-						},
-						"working-with-data": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/tutorials/working-with-data.en.mdx",
-							"label": "Working with Network Canvas data in R",
-							"navOrder": null
-						},
-						"working-with-rosters": {
-							"type": "page",
-							"sourceFile": "/docs/desktop/tutorials/working-with-rosters.en.md",
-							"label": "Working with Roster Data",
-							"navOrder": null
-						}
-					}
-				}
-			}
-		},
-		"fresco": {
-			"type": "project",
-			"sourceFile": "/docs/fresco/about.en.mdx",
-			"label": "Fresco",
-			"children": {
-				"about": {
-					"type": "page",
-					"sourceFile": "/docs/fresco/about.en.mdx",
-					"label": "About Fresco",
-					"navOrder": 1
-				},
-				"advanced-topics": {
-					"type": "folder",
-					"expanded": true,
-					"label": "Advanced Topics",
-					"navOrder": null,
-					"children": {
-						"integration": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/advanced-topics/integration.en.mdx",
-							"label": "Integration with other survey tools",
-							"navOrder": null
-						}
-					}
-				},
-				"deployment": {
-					"type": "folder",
-					"expanded": true,
-					"label": "Deployment",
-					"navOrder": 5,
-					"children": {
-						"advanced": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/deployment/advanced.en.mdx",
-							"label": "Advanced Deployment",
-							"navOrder": null
-						},
-						"cloud-pricing": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/deployment/cloud-pricing.en.md",
-							"label": "Cloud Pricing",
-							"navOrder": 6
-						},
-						"guide": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/deployment/guide.en.mdx",
-							"label": "Deployment Guide",
-							"navOrder": 1
-						},
-						"troubleshooting": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/deployment/troubleshooting.en.mdx",
-							"label": "Troubleshooting",
-							"navOrder": 3
-						},
-						"upgrading": {
-							"type": "page",
-							"sourceFile": "/docs/fresco/deployment/upgrading.en.mdx",
-							"label": "Upgrading Fresco",
-							"navOrder": 5
-						}
-					}
-				},
-				"faq": {
-					"type": "page",
-					"sourceFile": "/docs/fresco/faq.en.mdx",
-					"label": "Frequently Asked Questions",
-					"navOrder": 3
-				},
-				"sandbox": {
-					"type": "page",
-					"sourceFile": "/docs/fresco/sandbox.en.mdx",
-					"label": "Sandbox",
-					"navOrder": 3
-				},
-				"using-fresco": {
-					"type": "page",
-					"sourceFile": "/docs/fresco/using-fresco.en.mdx",
-					"label": "Using Fresco",
-					"navOrder": 2
-				}
-			}
-		}
-	}
-}
+  "en": {
+    "desktop": {
+      "type": "project",
+      "sourceFile": "/docs/desktop/index.en.mdx",
+      "label": "Desktop",
+      "children": {
+        "advanced-topics": {
+          "type": "folder",
+          "expanded": false,
+          "label": "Advanced Topics",
+          "navOrder": 50000,
+          "children": {
+            "network-canvas-graphml": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/advanced-topics/network-canvas-graphml.en.md",
+              "label": "Network Canvas GraphML Format",
+              "navOrder": null
+            },
+            "node-labelling": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/advanced-topics/node-labelling.en.md",
+              "label": "Node Labelling",
+              "navOrder": null
+            },
+            "protocol-file-format": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/advanced-topics/protocol-file-format.en.md",
+              "label": "Protocol File Format",
+              "navOrder": null
+            },
+            "protocol-schema-information": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/advanced-topics/protocol-schema-information.en.mdx",
+              "label": "Protocol Schema Information",
+              "navOrder": null
+            }
+          }
+        },
+        "getting-started": {
+          "type": "folder",
+          "expanded": true,
+          "label": "Getting Started",
+          "navOrder": 1,
+          "children": {
+            "choosing-hardware": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/getting-started/choosing-hardware.en.md",
+              "label": "Choosing a Hardware Device for Interviewer",
+              "navOrder": null
+            },
+            "configuring-devices": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/getting-started/configuring-devices.en.mdx",
+              "label": "Configuring Devices Prior To Starting Data Collection",
+              "navOrder": null
+            },
+            "installation-guide": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/getting-started/installation-guide.en.md",
+              "label": "Installation Guide",
+              "navOrder": 3
+            }
+          }
+        },
+        "interface-documentation": {
+          "type": "folder",
+          "expanded": false,
+          "label": "Interface documentation",
+          "navOrder": null,
+          "children": {
+            "categorical-bin": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/categorical-bin.en.mdx",
+              "label": "Categorical Bin",
+              "navOrder": null
+            },
+            "dyad-census": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/dyad-census.en.md",
+              "label": "Dyad Census",
+              "navOrder": null
+            },
+            "ego-form": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/ego-form.en.md",
+              "label": "Ego Form",
+              "navOrder": null
+            },
+            "information": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/information.en.mdx",
+              "label": "Information",
+              "navOrder": null
+            },
+            "large-roster-name-generator": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/large-roster-name-generator.en.mdx",
+              "label": "Large Roster Name Generator",
+              "navOrder": null
+            },
+            "name-generator-roster": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/name-generator-roster.en.mdx",
+              "label": "Name Generator for Roster Data",
+              "navOrder": null
+            },
+            "name-generator-using-forms": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/name-generator-using-forms.en.mdx",
+              "label": "Name Generator using Forms",
+              "navOrder": null
+            },
+            "name-generator-using-quick-add": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/name-generator-using-quick-add.en.mdx",
+              "label": "Name Generators using Quick Add",
+              "navOrder": null
+            },
+            "narrative": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/narrative.en.md",
+              "label": "Narrative",
+              "navOrder": null
+            },
+            "ordinal-bin": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/ordinal-bin.en.md",
+              "label": "Ordinal Bin",
+              "navOrder": null
+            },
+            "per-alter-edge-form": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/per-alter-edge-form.en.mdx",
+              "label": "Per Alter Edge Form",
+              "navOrder": null
+            },
+            "per-alter-form": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/per-alter-form.en.md",
+              "label": "Per Alter Form",
+              "navOrder": null
+            },
+            "shared": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/shared.en.md",
+              "label": "Shared Interface Options",
+              "navOrder": null
+            },
+            "small-roster-name-generator": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/small-roster-name-generator.en.mdx",
+              "label": "Small Roster Name Generator",
+              "navOrder": null
+            },
+            "sociogram": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/sociogram.en.md",
+              "label": "Sociogram",
+              "navOrder": null
+            },
+            "tie-strength-census": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/interface-documentation/tie-strength-census.en.md",
+              "label": "Tie-Strength Census",
+              "navOrder": null
+            }
+          }
+        },
+        "key-concepts": {
+          "type": "folder",
+          "expanded": false,
+          "label": "Key concepts",
+          "navOrder": null,
+          "children": {
+            "additional-variables": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/additional-variables.en.mdx",
+              "label": "Additional Variables",
+              "navOrder": null
+            },
+            "codebook": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/codebook.en.mdx",
+              "label": "Codebook",
+              "navOrder": null
+            },
+            "field-validation": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/field-validation.en.md",
+              "label": "Field Validation",
+              "navOrder": null
+            },
+            "forms": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/forms.en.mdx",
+              "label": "Forms",
+              "navOrder": null
+            },
+            "input-controls": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/input-controls.en.md",
+              "label": "Input Controls",
+              "navOrder": null
+            },
+            "interfaces": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/interfaces.en.mdx",
+              "label": "Interfaces",
+              "navOrder": null
+            },
+            "network-filtering": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/network-filtering.en.mdx",
+              "label": "Network Filtering",
+              "navOrder": null
+            },
+            "preview-mode": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/preview-mode.en.md",
+              "label": "Preview Mode",
+              "navOrder": null
+            },
+            "prompts": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/prompts.en.mdx",
+              "label": "Prompts",
+              "navOrder": null
+            },
+            "resources": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/resources.en.mdx",
+              "label": "Resources",
+              "navOrder": null
+            },
+            "skip-logic": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/skip-logic.en.mdx",
+              "label": "Skip Logic",
+              "navOrder": null
+            },
+            "the-protocol-file": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/key-concepts/the-protocol-file.en.md",
+              "label": "The Protocol File",
+              "navOrder": null
+            }
+          }
+        },
+        "project-information": {
+          "type": "folder",
+          "expanded": true,
+          "sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
+          "label": "Project Information",
+          "navOrder": 3,
+          "children": {
+            "citing-the-software": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/citing-the-software.en.md",
+              "label": "Citing the Software",
+              "navOrder": 6
+            },
+            "contributing-code": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/contributing-code.en.md",
+              "label": "Contributing Code",
+              "navOrder": null
+            },
+            "faq": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/faq.en.md",
+              "label": "Frequently Asked Questions",
+              "navOrder": 5
+            },
+            "irb-best-practices": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/irb-best-practices.en.md",
+              "label": "IRB and Security Best Practices",
+              "navOrder": null
+            },
+            "project-overview": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
+              "label": "Project Overview",
+              "navOrder": 2
+            },
+            "requests-for-collaboration": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/requests-for-collaboration.en.md",
+              "label": "Requests for Collaboration",
+              "navOrder": null
+            },
+            "security-model": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/project-information/security-model.en.md",
+              "label": "Overview of Security Model",
+              "navOrder": null
+            }
+          }
+        },
+        "tutorials": {
+          "type": "folder",
+          "expanded": true,
+          "label": "Tutorials",
+          "navOrder": 2,
+          "children": {
+            "building-a-protocol": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/tutorials/building-a-protocol.en.mdx",
+              "label": "Building a protocol using Architect",
+              "navOrder": 2
+            },
+            "protocol-and-data-workflows": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/tutorials/protocol-and-data-workflows.en.mdx",
+              "label": "Protocol and Data Workflows",
+              "navOrder": 3
+            },
+            "using-interviewer": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/tutorials/using-interviewer.en.mdx",
+              "label": "Using Interviewer",
+              "navOrder": 1
+            },
+            "working-with-data": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/tutorials/working-with-data.en.mdx",
+              "label": "Working with Network Canvas data in R",
+              "navOrder": null
+            },
+            "working-with-rosters": {
+              "type": "page",
+              "sourceFile": "/docs/desktop/tutorials/working-with-rosters.en.md",
+              "label": "Working with Roster Data",
+              "navOrder": null
+            }
+          }
+        }
+      }
+    },
+    "fresco": {
+      "type": "project",
+      "sourceFile": "/docs/fresco/about.en.mdx",
+      "label": "Fresco",
+      "children": {
+        "about": {
+          "type": "page",
+          "sourceFile": "/docs/fresco/about.en.mdx",
+          "label": "About Fresco",
+          "navOrder": 1
+        },
+        "advanced-topics": {
+          "type": "folder",
+          "expanded": true,
+          "label": "Advanced Topics",
+          "navOrder": null,
+          "children": {
+            "integration": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/advanced-topics/integration.en.mdx",
+              "label": "Integration with other survey tools",
+              "navOrder": null
+            }
+          }
+        },
+        "deployment": {
+          "type": "folder",
+          "expanded": true,
+          "label": "Deployment",
+          "navOrder": 5,
+          "children": {
+            "advanced": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/deployment/advanced.en.mdx",
+              "label": "Advanced Deployment",
+              "navOrder": null
+            },
+            "cloud-pricing": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/deployment/cloud-pricing.en.md",
+              "label": "Cloud Pricing",
+              "navOrder": 6
+            },
+            "guide": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/deployment/guide.en.mdx",
+              "label": "Deployment Guide",
+              "navOrder": 1
+            },
+            "troubleshooting": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/deployment/troubleshooting.en.mdx",
+              "label": "Troubleshooting",
+              "navOrder": 3
+            },
+            "upgrading": {
+              "type": "page",
+              "sourceFile": "/docs/fresco/deployment/upgrading.en.mdx",
+              "label": "Upgrading Fresco",
+              "navOrder": 5
+            }
+          }
+        },
+        "faq": {
+          "type": "page",
+          "sourceFile": "/docs/fresco/faq.en.mdx",
+          "label": "Frequently Asked Questions",
+          "navOrder": 3
+        },
+        "sandbox": {
+          "type": "page",
+          "sourceFile": "/docs/fresco/sandbox.en.mdx",
+          "label": "Sandbox",
+          "navOrder": 3
+        },
+        "using-fresco": {
+          "type": "page",
+          "sourceFile": "/docs/fresco/using-fresco.en.mdx",
+          "label": "Using Fresco",
+          "navOrder": 2
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/apps/documentation/public/sitemap-0.xml b/apps/documentation/public/sitemap-0.xml
index b148fd2..a86bcbb 100644
--- a/apps/documentation/public/sitemap-0.xml
+++ b/apps/documentation/public/sitemap-0.xml
@@ -1,67 +1,67 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
-<url><loc>https://documentation.networkcanvas.com/manifest.webmanifest</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/icon.svg</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/network-canvas-graphml</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/node-labelling</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/protocol-file-format</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/protocol-schema-information</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/choosing-hardware</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/configuring-devices</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/installation-guide</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/categorical-bin</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/dyad-census</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/ego-form</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/information</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/large-roster-name-generator</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-roster</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-using-forms</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-using-quick-add</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/narrative</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/ordinal-bin</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/per-alter-edge-form</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/per-alter-form</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/shared</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/small-roster-name-generator</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/sociogram</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/tie-strength-census</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/additional-variables</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/codebook</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/field-validation</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/forms</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/input-controls</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/interfaces</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/network-filtering</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/preview-mode</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/prompts</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/resources</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/skip-logic</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/the-protocol-file</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/citing-the-software</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/contributing-code</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/faq</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/irb-best-practices</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/project-overview</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/requests-for-collaboration</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/security-model</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/building-a-protocol</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/protocol-and-data-workflows</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/using-interviewer</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/working-with-data</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/working-with-rosters</loc><lastmod>2024-11-20T19:47:48.014Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/about</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/advanced-topics/integration</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/advanced</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/cloud-pricing</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/guide</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/troubleshooting</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/upgrading</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/faq</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/sandbox</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
-<url><loc>https://documentation.networkcanvas.com/en/fresco/using-fresco</loc><lastmod>2024-11-20T19:47:48.015Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/icon.svg</loc><lastmod>2024-11-21T09:35:52.966Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com</loc><lastmod>2024-11-21T09:35:52.966Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en</loc><lastmod>2024-11-21T09:35:52.966Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/manifest.webmanifest</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/network-canvas-graphml</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/node-labelling</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/protocol-file-format</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/advanced-topics/protocol-schema-information</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/choosing-hardware</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/configuring-devices</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/getting-started/installation-guide</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/categorical-bin</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/dyad-census</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/ego-form</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/information</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/large-roster-name-generator</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-roster</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-using-forms</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/name-generator-using-quick-add</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/narrative</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/ordinal-bin</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/per-alter-edge-form</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/per-alter-form</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/shared</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/small-roster-name-generator</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/sociogram</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/interface-documentation/tie-strength-census</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/additional-variables</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/codebook</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/field-validation</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/forms</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/input-controls</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/interfaces</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/network-filtering</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/preview-mode</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/prompts</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/resources</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/skip-logic</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/key-concepts/the-protocol-file</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/citing-the-software</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/contributing-code</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/faq</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/irb-best-practices</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/project-overview</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/requests-for-collaboration</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/project-information/security-model</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/building-a-protocol</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/protocol-and-data-workflows</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/using-interviewer</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/working-with-data</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/desktop/tutorials/working-with-rosters</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/about</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/advanced-topics/integration</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/advanced</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/cloud-pricing</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/guide</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/troubleshooting</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/deployment/upgrading</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/faq</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/sandbox</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
+<url><loc>https://documentation.networkcanvas.com/en/fresco/using-fresco</loc><lastmod>2024-11-21T09:35:52.967Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
 </urlset>
\ No newline at end of file

From 90a16399e5599fa9acc19c8a6c9a17bb3eb7c9d2 Mon Sep 17 00:00:00 2001
From: Joshua Melville <joshua.melville@northwestern.edu>
Date: Thu, 21 Nov 2024 11:45:30 +0200
Subject: [PATCH 2/4] ignore anything in the public directory

---
 .vscode/settings.json                      |  10 +-
 apps/documentation/lib/writeSidebarJson.ts |   2 +-
 apps/documentation/public/sidebar.json     | 846 ++++++++++-----------
 biome.json                                 |   3 +
 4 files changed, 435 insertions(+), 426 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index fe28509..5a17fe8 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,10 @@
 {
 	"typescript.tsdk": "./node_modules/typescript/lib",
 	"typescript.enablePromptUseWorkspaceTsdk": true,
-	"cSpell.words": ["netcanvas", "Tipbox"],
+	"cSpell.words": [
+		"netcanvas",
+		"Tipbox"
+	],
 	"editor.defaultFormatter": "biomejs.biome",
 	"[typescriptreact]": {
 		"editor.defaultFormatter": "biomejs.biome"
@@ -12,5 +15,8 @@
 	"editor.codeActionsOnSave": {
 		"source.organizeImports": "always",
 		"source.fixAll": "always"
+	},
+	"[json]": {
+		"editor.defaultFormatter": "biomejs.biome"
 	}
-}
+}
\ No newline at end of file
diff --git a/apps/documentation/lib/writeSidebarJson.ts b/apps/documentation/lib/writeSidebarJson.ts
index d908102..ead2c44 100644
--- a/apps/documentation/lib/writeSidebarJson.ts
+++ b/apps/documentation/lib/writeSidebarJson.ts
@@ -103,7 +103,7 @@ function generateSidebarData() {
 try {
 	const sidebarData = generateSidebarData();
 
-	writeFileSync(join(process.cwd(), "public", "sidebar.json"), JSON.stringify(sidebarData, null, 2), "utf-8");
+	writeFileSync(join(process.cwd(), "public", "sidebar.json"), JSON.stringify(sidebarData, null, "\t"), "utf-8");
 } catch (e) {
 	// eslint-disable-next-line no-console
 	console.log("Error writing sidebar data!", e);
diff --git a/apps/documentation/public/sidebar.json b/apps/documentation/public/sidebar.json
index 3ad5076..d8ef199 100644
--- a/apps/documentation/public/sidebar.json
+++ b/apps/documentation/public/sidebar.json
@@ -1,425 +1,425 @@
 {
-  "en": {
-    "desktop": {
-      "type": "project",
-      "sourceFile": "/docs/desktop/index.en.mdx",
-      "label": "Desktop",
-      "children": {
-        "advanced-topics": {
-          "type": "folder",
-          "expanded": false,
-          "label": "Advanced Topics",
-          "navOrder": 50000,
-          "children": {
-            "network-canvas-graphml": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/advanced-topics/network-canvas-graphml.en.md",
-              "label": "Network Canvas GraphML Format",
-              "navOrder": null
-            },
-            "node-labelling": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/advanced-topics/node-labelling.en.md",
-              "label": "Node Labelling",
-              "navOrder": null
-            },
-            "protocol-file-format": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/advanced-topics/protocol-file-format.en.md",
-              "label": "Protocol File Format",
-              "navOrder": null
-            },
-            "protocol-schema-information": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/advanced-topics/protocol-schema-information.en.mdx",
-              "label": "Protocol Schema Information",
-              "navOrder": null
-            }
-          }
-        },
-        "getting-started": {
-          "type": "folder",
-          "expanded": true,
-          "label": "Getting Started",
-          "navOrder": 1,
-          "children": {
-            "choosing-hardware": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/getting-started/choosing-hardware.en.md",
-              "label": "Choosing a Hardware Device for Interviewer",
-              "navOrder": null
-            },
-            "configuring-devices": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/getting-started/configuring-devices.en.mdx",
-              "label": "Configuring Devices Prior To Starting Data Collection",
-              "navOrder": null
-            },
-            "installation-guide": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/getting-started/installation-guide.en.md",
-              "label": "Installation Guide",
-              "navOrder": 3
-            }
-          }
-        },
-        "interface-documentation": {
-          "type": "folder",
-          "expanded": false,
-          "label": "Interface documentation",
-          "navOrder": null,
-          "children": {
-            "categorical-bin": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/categorical-bin.en.mdx",
-              "label": "Categorical Bin",
-              "navOrder": null
-            },
-            "dyad-census": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/dyad-census.en.md",
-              "label": "Dyad Census",
-              "navOrder": null
-            },
-            "ego-form": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/ego-form.en.md",
-              "label": "Ego Form",
-              "navOrder": null
-            },
-            "information": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/information.en.mdx",
-              "label": "Information",
-              "navOrder": null
-            },
-            "large-roster-name-generator": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/large-roster-name-generator.en.mdx",
-              "label": "Large Roster Name Generator",
-              "navOrder": null
-            },
-            "name-generator-roster": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/name-generator-roster.en.mdx",
-              "label": "Name Generator for Roster Data",
-              "navOrder": null
-            },
-            "name-generator-using-forms": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/name-generator-using-forms.en.mdx",
-              "label": "Name Generator using Forms",
-              "navOrder": null
-            },
-            "name-generator-using-quick-add": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/name-generator-using-quick-add.en.mdx",
-              "label": "Name Generators using Quick Add",
-              "navOrder": null
-            },
-            "narrative": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/narrative.en.md",
-              "label": "Narrative",
-              "navOrder": null
-            },
-            "ordinal-bin": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/ordinal-bin.en.md",
-              "label": "Ordinal Bin",
-              "navOrder": null
-            },
-            "per-alter-edge-form": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/per-alter-edge-form.en.mdx",
-              "label": "Per Alter Edge Form",
-              "navOrder": null
-            },
-            "per-alter-form": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/per-alter-form.en.md",
-              "label": "Per Alter Form",
-              "navOrder": null
-            },
-            "shared": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/shared.en.md",
-              "label": "Shared Interface Options",
-              "navOrder": null
-            },
-            "small-roster-name-generator": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/small-roster-name-generator.en.mdx",
-              "label": "Small Roster Name Generator",
-              "navOrder": null
-            },
-            "sociogram": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/sociogram.en.md",
-              "label": "Sociogram",
-              "navOrder": null
-            },
-            "tie-strength-census": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/interface-documentation/tie-strength-census.en.md",
-              "label": "Tie-Strength Census",
-              "navOrder": null
-            }
-          }
-        },
-        "key-concepts": {
-          "type": "folder",
-          "expanded": false,
-          "label": "Key concepts",
-          "navOrder": null,
-          "children": {
-            "additional-variables": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/additional-variables.en.mdx",
-              "label": "Additional Variables",
-              "navOrder": null
-            },
-            "codebook": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/codebook.en.mdx",
-              "label": "Codebook",
-              "navOrder": null
-            },
-            "field-validation": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/field-validation.en.md",
-              "label": "Field Validation",
-              "navOrder": null
-            },
-            "forms": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/forms.en.mdx",
-              "label": "Forms",
-              "navOrder": null
-            },
-            "input-controls": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/input-controls.en.md",
-              "label": "Input Controls",
-              "navOrder": null
-            },
-            "interfaces": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/interfaces.en.mdx",
-              "label": "Interfaces",
-              "navOrder": null
-            },
-            "network-filtering": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/network-filtering.en.mdx",
-              "label": "Network Filtering",
-              "navOrder": null
-            },
-            "preview-mode": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/preview-mode.en.md",
-              "label": "Preview Mode",
-              "navOrder": null
-            },
-            "prompts": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/prompts.en.mdx",
-              "label": "Prompts",
-              "navOrder": null
-            },
-            "resources": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/resources.en.mdx",
-              "label": "Resources",
-              "navOrder": null
-            },
-            "skip-logic": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/skip-logic.en.mdx",
-              "label": "Skip Logic",
-              "navOrder": null
-            },
-            "the-protocol-file": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/key-concepts/the-protocol-file.en.md",
-              "label": "The Protocol File",
-              "navOrder": null
-            }
-          }
-        },
-        "project-information": {
-          "type": "folder",
-          "expanded": true,
-          "sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
-          "label": "Project Information",
-          "navOrder": 3,
-          "children": {
-            "citing-the-software": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/citing-the-software.en.md",
-              "label": "Citing the Software",
-              "navOrder": 6
-            },
-            "contributing-code": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/contributing-code.en.md",
-              "label": "Contributing Code",
-              "navOrder": null
-            },
-            "faq": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/faq.en.md",
-              "label": "Frequently Asked Questions",
-              "navOrder": 5
-            },
-            "irb-best-practices": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/irb-best-practices.en.md",
-              "label": "IRB and Security Best Practices",
-              "navOrder": null
-            },
-            "project-overview": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
-              "label": "Project Overview",
-              "navOrder": 2
-            },
-            "requests-for-collaboration": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/requests-for-collaboration.en.md",
-              "label": "Requests for Collaboration",
-              "navOrder": null
-            },
-            "security-model": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/project-information/security-model.en.md",
-              "label": "Overview of Security Model",
-              "navOrder": null
-            }
-          }
-        },
-        "tutorials": {
-          "type": "folder",
-          "expanded": true,
-          "label": "Tutorials",
-          "navOrder": 2,
-          "children": {
-            "building-a-protocol": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/tutorials/building-a-protocol.en.mdx",
-              "label": "Building a protocol using Architect",
-              "navOrder": 2
-            },
-            "protocol-and-data-workflows": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/tutorials/protocol-and-data-workflows.en.mdx",
-              "label": "Protocol and Data Workflows",
-              "navOrder": 3
-            },
-            "using-interviewer": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/tutorials/using-interviewer.en.mdx",
-              "label": "Using Interviewer",
-              "navOrder": 1
-            },
-            "working-with-data": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/tutorials/working-with-data.en.mdx",
-              "label": "Working with Network Canvas data in R",
-              "navOrder": null
-            },
-            "working-with-rosters": {
-              "type": "page",
-              "sourceFile": "/docs/desktop/tutorials/working-with-rosters.en.md",
-              "label": "Working with Roster Data",
-              "navOrder": null
-            }
-          }
-        }
-      }
-    },
-    "fresco": {
-      "type": "project",
-      "sourceFile": "/docs/fresco/about.en.mdx",
-      "label": "Fresco",
-      "children": {
-        "about": {
-          "type": "page",
-          "sourceFile": "/docs/fresco/about.en.mdx",
-          "label": "About Fresco",
-          "navOrder": 1
-        },
-        "advanced-topics": {
-          "type": "folder",
-          "expanded": true,
-          "label": "Advanced Topics",
-          "navOrder": null,
-          "children": {
-            "integration": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/advanced-topics/integration.en.mdx",
-              "label": "Integration with other survey tools",
-              "navOrder": null
-            }
-          }
-        },
-        "deployment": {
-          "type": "folder",
-          "expanded": true,
-          "label": "Deployment",
-          "navOrder": 5,
-          "children": {
-            "advanced": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/deployment/advanced.en.mdx",
-              "label": "Advanced Deployment",
-              "navOrder": null
-            },
-            "cloud-pricing": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/deployment/cloud-pricing.en.md",
-              "label": "Cloud Pricing",
-              "navOrder": 6
-            },
-            "guide": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/deployment/guide.en.mdx",
-              "label": "Deployment Guide",
-              "navOrder": 1
-            },
-            "troubleshooting": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/deployment/troubleshooting.en.mdx",
-              "label": "Troubleshooting",
-              "navOrder": 3
-            },
-            "upgrading": {
-              "type": "page",
-              "sourceFile": "/docs/fresco/deployment/upgrading.en.mdx",
-              "label": "Upgrading Fresco",
-              "navOrder": 5
-            }
-          }
-        },
-        "faq": {
-          "type": "page",
-          "sourceFile": "/docs/fresco/faq.en.mdx",
-          "label": "Frequently Asked Questions",
-          "navOrder": 3
-        },
-        "sandbox": {
-          "type": "page",
-          "sourceFile": "/docs/fresco/sandbox.en.mdx",
-          "label": "Sandbox",
-          "navOrder": 3
-        },
-        "using-fresco": {
-          "type": "page",
-          "sourceFile": "/docs/fresco/using-fresco.en.mdx",
-          "label": "Using Fresco",
-          "navOrder": 2
-        }
-      }
-    }
-  }
+	"en": {
+		"desktop": {
+			"type": "project",
+			"sourceFile": "/docs/desktop/index.en.mdx",
+			"label": "Desktop",
+			"children": {
+				"advanced-topics": {
+					"type": "folder",
+					"expanded": false,
+					"label": "Advanced Topics",
+					"navOrder": 50000,
+					"children": {
+						"network-canvas-graphml": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/advanced-topics/network-canvas-graphml.en.md",
+							"label": "Network Canvas GraphML Format",
+							"navOrder": null
+						},
+						"node-labelling": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/advanced-topics/node-labelling.en.md",
+							"label": "Node Labelling",
+							"navOrder": null
+						},
+						"protocol-file-format": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/advanced-topics/protocol-file-format.en.md",
+							"label": "Protocol File Format",
+							"navOrder": null
+						},
+						"protocol-schema-information": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/advanced-topics/protocol-schema-information.en.mdx",
+							"label": "Protocol Schema Information",
+							"navOrder": null
+						}
+					}
+				},
+				"getting-started": {
+					"type": "folder",
+					"expanded": true,
+					"label": "Getting Started",
+					"navOrder": 1,
+					"children": {
+						"choosing-hardware": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/getting-started/choosing-hardware.en.md",
+							"label": "Choosing a Hardware Device for Interviewer",
+							"navOrder": null
+						},
+						"configuring-devices": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/getting-started/configuring-devices.en.mdx",
+							"label": "Configuring Devices Prior To Starting Data Collection",
+							"navOrder": null
+						},
+						"installation-guide": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/getting-started/installation-guide.en.md",
+							"label": "Installation Guide",
+							"navOrder": 3
+						}
+					}
+				},
+				"interface-documentation": {
+					"type": "folder",
+					"expanded": false,
+					"label": "Interface documentation",
+					"navOrder": null,
+					"children": {
+						"categorical-bin": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/categorical-bin.en.mdx",
+							"label": "Categorical Bin",
+							"navOrder": null
+						},
+						"dyad-census": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/dyad-census.en.md",
+							"label": "Dyad Census",
+							"navOrder": null
+						},
+						"ego-form": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/ego-form.en.md",
+							"label": "Ego Form",
+							"navOrder": null
+						},
+						"information": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/information.en.mdx",
+							"label": "Information",
+							"navOrder": null
+						},
+						"large-roster-name-generator": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/large-roster-name-generator.en.mdx",
+							"label": "Large Roster Name Generator",
+							"navOrder": null
+						},
+						"name-generator-roster": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/name-generator-roster.en.mdx",
+							"label": "Name Generator for Roster Data",
+							"navOrder": null
+						},
+						"name-generator-using-forms": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/name-generator-using-forms.en.mdx",
+							"label": "Name Generator using Forms",
+							"navOrder": null
+						},
+						"name-generator-using-quick-add": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/name-generator-using-quick-add.en.mdx",
+							"label": "Name Generators using Quick Add",
+							"navOrder": null
+						},
+						"narrative": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/narrative.en.md",
+							"label": "Narrative",
+							"navOrder": null
+						},
+						"ordinal-bin": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/ordinal-bin.en.md",
+							"label": "Ordinal Bin",
+							"navOrder": null
+						},
+						"per-alter-edge-form": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/per-alter-edge-form.en.mdx",
+							"label": "Per Alter Edge Form",
+							"navOrder": null
+						},
+						"per-alter-form": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/per-alter-form.en.md",
+							"label": "Per Alter Form",
+							"navOrder": null
+						},
+						"shared": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/shared.en.md",
+							"label": "Shared Interface Options",
+							"navOrder": null
+						},
+						"small-roster-name-generator": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/small-roster-name-generator.en.mdx",
+							"label": "Small Roster Name Generator",
+							"navOrder": null
+						},
+						"sociogram": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/sociogram.en.md",
+							"label": "Sociogram",
+							"navOrder": null
+						},
+						"tie-strength-census": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/interface-documentation/tie-strength-census.en.md",
+							"label": "Tie-Strength Census",
+							"navOrder": null
+						}
+					}
+				},
+				"key-concepts": {
+					"type": "folder",
+					"expanded": false,
+					"label": "Key concepts",
+					"navOrder": null,
+					"children": {
+						"additional-variables": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/additional-variables.en.mdx",
+							"label": "Additional Variables",
+							"navOrder": null
+						},
+						"codebook": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/codebook.en.mdx",
+							"label": "Codebook",
+							"navOrder": null
+						},
+						"field-validation": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/field-validation.en.md",
+							"label": "Field Validation",
+							"navOrder": null
+						},
+						"forms": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/forms.en.mdx",
+							"label": "Forms",
+							"navOrder": null
+						},
+						"input-controls": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/input-controls.en.md",
+							"label": "Input Controls",
+							"navOrder": null
+						},
+						"interfaces": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/interfaces.en.mdx",
+							"label": "Interfaces",
+							"navOrder": null
+						},
+						"network-filtering": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/network-filtering.en.mdx",
+							"label": "Network Filtering",
+							"navOrder": null
+						},
+						"preview-mode": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/preview-mode.en.md",
+							"label": "Preview Mode",
+							"navOrder": null
+						},
+						"prompts": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/prompts.en.mdx",
+							"label": "Prompts",
+							"navOrder": null
+						},
+						"resources": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/resources.en.mdx",
+							"label": "Resources",
+							"navOrder": null
+						},
+						"skip-logic": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/skip-logic.en.mdx",
+							"label": "Skip Logic",
+							"navOrder": null
+						},
+						"the-protocol-file": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/key-concepts/the-protocol-file.en.md",
+							"label": "The Protocol File",
+							"navOrder": null
+						}
+					}
+				},
+				"project-information": {
+					"type": "folder",
+					"expanded": true,
+					"sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
+					"label": "Project Information",
+					"navOrder": 3,
+					"children": {
+						"citing-the-software": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/citing-the-software.en.md",
+							"label": "Citing the Software",
+							"navOrder": 6
+						},
+						"contributing-code": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/contributing-code.en.md",
+							"label": "Contributing Code",
+							"navOrder": null
+						},
+						"faq": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/faq.en.md",
+							"label": "Frequently Asked Questions",
+							"navOrder": 5
+						},
+						"irb-best-practices": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/irb-best-practices.en.md",
+							"label": "IRB and Security Best Practices",
+							"navOrder": null
+						},
+						"project-overview": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/project-overview.en.mdx",
+							"label": "Project Overview",
+							"navOrder": 2
+						},
+						"requests-for-collaboration": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/requests-for-collaboration.en.md",
+							"label": "Requests for Collaboration",
+							"navOrder": null
+						},
+						"security-model": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/project-information/security-model.en.md",
+							"label": "Overview of Security Model",
+							"navOrder": null
+						}
+					}
+				},
+				"tutorials": {
+					"type": "folder",
+					"expanded": true,
+					"label": "Tutorials",
+					"navOrder": 2,
+					"children": {
+						"building-a-protocol": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/tutorials/building-a-protocol.en.mdx",
+							"label": "Building a protocol using Architect",
+							"navOrder": 2
+						},
+						"protocol-and-data-workflows": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/tutorials/protocol-and-data-workflows.en.mdx",
+							"label": "Protocol and Data Workflows",
+							"navOrder": 3
+						},
+						"using-interviewer": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/tutorials/using-interviewer.en.mdx",
+							"label": "Using Interviewer",
+							"navOrder": 1
+						},
+						"working-with-data": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/tutorials/working-with-data.en.mdx",
+							"label": "Working with Network Canvas data in R",
+							"navOrder": null
+						},
+						"working-with-rosters": {
+							"type": "page",
+							"sourceFile": "/docs/desktop/tutorials/working-with-rosters.en.md",
+							"label": "Working with Roster Data",
+							"navOrder": null
+						}
+					}
+				}
+			}
+		},
+		"fresco": {
+			"type": "project",
+			"sourceFile": "/docs/fresco/about.en.mdx",
+			"label": "Fresco",
+			"children": {
+				"about": {
+					"type": "page",
+					"sourceFile": "/docs/fresco/about.en.mdx",
+					"label": "About Fresco",
+					"navOrder": 1
+				},
+				"advanced-topics": {
+					"type": "folder",
+					"expanded": true,
+					"label": "Advanced Topics",
+					"navOrder": null,
+					"children": {
+						"integration": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/advanced-topics/integration.en.mdx",
+							"label": "Integration with other survey tools",
+							"navOrder": null
+						}
+					}
+				},
+				"deployment": {
+					"type": "folder",
+					"expanded": true,
+					"label": "Deployment",
+					"navOrder": 5,
+					"children": {
+						"advanced": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/deployment/advanced.en.mdx",
+							"label": "Advanced Deployment",
+							"navOrder": null
+						},
+						"cloud-pricing": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/deployment/cloud-pricing.en.md",
+							"label": "Cloud Pricing",
+							"navOrder": 6
+						},
+						"guide": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/deployment/guide.en.mdx",
+							"label": "Deployment Guide",
+							"navOrder": 1
+						},
+						"troubleshooting": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/deployment/troubleshooting.en.mdx",
+							"label": "Troubleshooting",
+							"navOrder": 3
+						},
+						"upgrading": {
+							"type": "page",
+							"sourceFile": "/docs/fresco/deployment/upgrading.en.mdx",
+							"label": "Upgrading Fresco",
+							"navOrder": 5
+						}
+					}
+				},
+				"faq": {
+					"type": "page",
+					"sourceFile": "/docs/fresco/faq.en.mdx",
+					"label": "Frequently Asked Questions",
+					"navOrder": 3
+				},
+				"sandbox": {
+					"type": "page",
+					"sourceFile": "/docs/fresco/sandbox.en.mdx",
+					"label": "Sandbox",
+					"navOrder": 3
+				},
+				"using-fresco": {
+					"type": "page",
+					"sourceFile": "/docs/fresco/using-fresco.en.mdx",
+					"label": "Using Fresco",
+					"navOrder": 2
+				}
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/biome.json b/biome.json
index cd382fd..c019ae5 100644
--- a/biome.json
+++ b/biome.json
@@ -22,5 +22,8 @@
 		"clientKind": "git",
 		"useIgnoreFile": true
 	},
+	"files": {
+		"ignore": ["public/**/*.*"]
+	},
 	"javascript": { "formatter": { "quoteStyle": "double" } }
 }

From 37ad14fad3dffec19dd7ca982c79e073f4f73a3f Mon Sep 17 00:00:00 2001
From: Joshua Melville <joshua.melville@northwestern.edu>
Date: Thu, 21 Nov 2024 11:52:00 +0200
Subject: [PATCH 3/4] wrestle with vscode formatters

---
 .vscode/settings.json | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5a17fe8..4d12a31 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,10 +1,7 @@
 {
 	"typescript.tsdk": "./node_modules/typescript/lib",
 	"typescript.enablePromptUseWorkspaceTsdk": true,
-	"cSpell.words": [
-		"netcanvas",
-		"Tipbox"
-	],
+	"cSpell.words": ["netcanvas", "Tipbox"],
 	"editor.defaultFormatter": "biomejs.biome",
 	"[typescriptreact]": {
 		"editor.defaultFormatter": "biomejs.biome"
@@ -19,4 +16,4 @@
 	"[json]": {
 		"editor.defaultFormatter": "biomejs.biome"
 	}
-}
\ No newline at end of file
+}

From e6eadc998e7d0e5e32351f4d68517f2271d60c08 Mon Sep 17 00:00:00 2001
From: Joshua Melville <joshua.melville@northwestern.edu>
Date: Thu, 21 Nov 2024 11:54:08 +0200
Subject: [PATCH 4/4] remove unused settings

---
 .vscode/settings.json | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4d12a31..7909412 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,17 +3,8 @@
 	"typescript.enablePromptUseWorkspaceTsdk": true,
 	"cSpell.words": ["netcanvas", "Tipbox"],
 	"editor.defaultFormatter": "biomejs.biome",
-	"[typescriptreact]": {
-		"editor.defaultFormatter": "biomejs.biome"
-	},
-	"[typescript]": {
-		"editor.defaultFormatter": "biomejs.biome"
-	},
 	"editor.codeActionsOnSave": {
 		"source.organizeImports": "always",
 		"source.fixAll": "always"
-	},
-	"[json]": {
-		"editor.defaultFormatter": "biomejs.biome"
 	}
 }