diff --git a/.idx/dev.nix b/.idx/dev.nix
deleted file mode 100644
index 6d5bdb7ba..000000000
--- a/.idx/dev.nix
+++ /dev/null
@@ -1,57 +0,0 @@
-# To learn more about how to use Nix to configure your environment
-# see: https://developers.google.com/idx/guides/customize-idx-env
-{ pkgs, ... }: {
- # Which nixpkgs channel to use.
- channel = "stable-25.05"; # or "unstable"
-
- # Use https://search.nixos.org/packages to find packages
- packages = [
- pkgs.python3
- pkgs.nodejs_24
- ];
-
- # Sets environment variables in the workspace
- env = {};
- idx = {
- # Search for the extensions you want on https://open-vsx.org/ and use "publisher.id"
- extensions = [
- # "vscodevim.vim"
- ];
-
- # Enable previews and customize configuration
- previews = {
- # Currently disabled because the preview system wasn't working
- enable = false;
- previews = {
- web = {
- command = [
- "npm"
- "run"
- "start"
- "--"
- "--port"
- "$PORT"
- "--host"
- "0.0.0.0"
- "--disable-host-check"
- ];
- manager = "web";
- };
- };
- };
-
- # Workspace lifecycle hooks
- workspace = {
- # Runs when a workspace is first created
- onCreate = {
- # npm-install = "npm install";
- # Currently disabled because the preview system wasn't working
- };
- # Runs when the workspace is (re)started
- onStart = {
- # npm-install = "npm install";
- # Currently disabled because the preview system wasn't working
- };
- };
- };
-}
diff --git a/.idx/icon.png b/.idx/icon.png
deleted file mode 100644
index ce744ea7a..000000000
Binary files a/.idx/icon.png and /dev/null differ
diff --git a/src/gui/doc/el().md b/src/gui/doc/el().md
deleted file mode 100644
index edc5fba5f..000000000
--- a/src/gui/doc/el().md
+++ /dev/null
@@ -1,89 +0,0 @@
-# el()
-
-> **note:** this is _new_. You might try to do things that intuitively should work and they won't. You might have to add support for some attribute in `UIElement.el` itself. Just remember; you don't have to. It's still the DOM API, so you can call a method on the element or pass it to `$(...)` to get some real work done.
-
-## The Premise
-
-`el()` is the element creator. It is a utility function built on the idea that the primary reason developers don't use the DOM API is simply because it's too verbose to be convenient. `el()` is to `document.createElement()` as jquery is to your for loops and recursive functions.
-
-Furthermore, it is perhaps possible that sometimes developers flock to complex frameworks such as React; Angular; and many more, even for relatively simple applications, simply because using the DOM API directly "just feels wrong".
-
-## The Hello World
-
-Let's start with a simple example of creating a div with a class and some text. Using the DOM API directly, it would look like this:
-```javascript
-const my_div = document.createElement('div');
-my_div.classList.add('my-class');
-my_div.innerText = 'some text';
-```
-
-Using `el()`, we can do the same as above like this:
-```javascript
-const my_div = el('div.my-class', {
- text: 'hello world'
-});
-```
-
-That's a lot nicer, isn't it?
-
-When calling `el`, you provide a **descriptor** containing your tag name, classes, id; you do this using the same format as a selector. Using the selector format for this wasn't my idea - I stole it from Pug/Jade. In this example we also pass an object with a `text` attribute. `text` assigns `.innerText` on the element, making it XSS-proof.
-
-## The "What about HTML?"
-
-"but wait!", I hear you say, "HTML strings are still cleaner!". Tools like JSX have made it possible to use HTML syntax within javascript code and avoid caveats such as XSS vulnerabilities. That's great, but you're then forced to either bring in the tooling of a larger framework or build your own framework around JSX. It may seem worth it though; in HTML, you would write the examples above like this:
-```html
-
some text
-```
-
-Putting the previous example with `el()` on a single line, we see that it's a little longer.
-
-```javascript
-el('div.myclass', { text: 'hello wolrd' });
-```
-
-However, for `div`, the most common element, you don't actually need to specify the tag name.
-
-```javascript
-el('.myclass', { text: 'hello world' });
-```
-
-Also, the second string is considered the inner-text.
-
-```javascript
-el('.myclass', 'hello world');
-```
-
-Maybe this specific example gives `el()` an advantage, but there's a good reason that it would: a `div` with some text in it is likely the second-most common element on your page; second only to divs containing other divs.
-
-## Nesting
-
-The `el` function accepts an array argument. Array arguments are expected to be arrays of DOM elements (that's what `el()` itself returns). This means you can call `el` multiple times inside an array to construct arbitrary trees.
-
-```javascript
-el([ el(), el() ])
-//
-```
-
-Okay, my comment with the hard-to-read div nesting is a little unfair; you'd probably write the HTML with proper indentation and such:
-
-```html
-
-```
-
-```javascript
-el([
- el(),
- el()
-])
-```
-
-## Passing the Parent
-
-If you pass a DOM element as the first argument, it will be treated as the parent element. This is, `parent_el.appendChild(new_el)` will be called before you get your `new_el`.
-
-```javascript
-el(some_parent_el, 'h1', 'Hello!');
-```
diff --git a/src/gui/doc/utils.md b/src/gui/doc/utils.md
deleted file mode 100644
index 2b2116c22..000000000
--- a/src/gui/doc/utils.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# utils.js — GUI Build Script (Overview)
-
-This file is responsible for:
-- Generating production and development builds of the GUI
-- Merging and minifying JS/CSS files
-- Converting icon files to base64
-- Bundling core GUI logic using Webpack
-- Generating the HTML structure dynamically for development mode
-
-## Main Functions
-
-### 🔧 build(options)
-Runs the full GUI build process.
-
-**Steps it performs:**
-1. Deletes and recreates the `/dist` folder
-2. Merges JavaScript libraries → `dist/libs.js`
-3. Converts all `src/icons/*.svg/png` to base64 → stores in `window.icons`
-4. Merges and minifies CSS → `dist/bundle.min.css`
-5. Uses Webpack to bundle `src/index.js` and dependencies → `dist/main.js`
-6. Prepends `window.gui_env = "prod"` and writes it as `dist/gui.js`
-7. Copies static assets like images, fonts, manifest, etc.
-
-### 🛠️ generateDevHtml(options)
-Dynamically builds the HTML string for development mode.
-
-**What it includes:**
-- Meta tags (SEO + social)
-- CSS & JS includes (based on env)
-- Inline base64 image data
-- JS entry points for dev (`/index.js`) or prod (`/dist/gui.js`)
-
----
-
-## Related Files
-
-| File | Role |
-|------------------|---------------------------------------|
-| `build.js` | Just imports and calls `build()` |
-| `BaseConfig.cjs` | Provides Webpack config used in build |
-| `static-assets.js` | Lists paths to JS, CSS, icons, etc |
-
----
-
diff --git a/src/gui/doc/webpack_attempts.md b/src/gui/doc/webpack_attempts.md
deleted file mode 100644
index 58af80b53..000000000
--- a/src/gui/doc/webpack_attempts.md
+++ /dev/null
@@ -1,81 +0,0 @@
-Multiple things attempted when trying to add icons to the bundle.
-
-None of this worked - eventually just prepended text on emit instead.
-
-```javascript
- // compilation.hooks.processAssets.tap(
- // {
- // name: 'AddImportPlugin',
- // stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
- // },
- // (assets) => {
- // for (const assetName of Object.keys(assets)) {
- // if (assetName.endsWith('.js')) {
- // const source = assets[assetName].source();
- // const newSource = `${icons}\n${source}`;
- // compilation.updateAsset(assetName, new compiler.webpack.sources.RawSource(newSource));
- // }
- // }
- // }
- // );
-
- // Inject into bundle
- // console.log('adding this:' + icons);
- // compilation.assets['icons-thing'] = {
- // source: () => icons,
- // size: () => icons.length,
- // };
-
- // compilation.addModule({
- // identifier() {
- // return 'icons-thing';
- // },
- // build() {
- // this._source = {
- // source() {
- // return content;
- // },
- // size() {
- // return content.length;
- // }
- // };
- // }
- // });
-
-
- // Add the generated module to Webpack's internal modules
- // compilation.hooks.optimizeModules.tap('IconsPlugin', (modules) => {
- // const virtualModule = {
- // identifier: () => 'icons.js',
- // readableIdentifier: () => 'icons.js',
- // build: () => {},
- // source: () => icons,
- // size: () => icons.length,
- // chunks: [],
- // assets: [],
- // hash: () => 'icons',
- // };
-
- // modules.push(virtualModule);
- // });
-
-});
-// this.hooks.entryOption.tap('IconsPlugin', (context, entry) => {
-// entry.main.import.push('icons-thing');
-// });
-// this.hooks.make.tapAsync('InjectTextEntryPlugin', (compilation, callback) => {
-// // Create a new asset (fake module) from the generated content
-// const content = `console.log('${this.options.text}');`;
-
-// callback();
-// });
-// this.hooks.entryOption.tap('IconsPlugin', (context, entry) => {
-// });
-// this.hooks.entryOption.tap('InjectTextEntryPlugin', (context, entry) => {
-// // Add this as an additional entry point
-// this.options.entry = {
-// ...this.options.entry,
-// 'generated-entry': '// FINDME\n'
-// };
-// });
-```
\ No newline at end of file