diff --git a/.bazeliskrc b/.bazeliskrc
new file mode 100644
index 0000000..afe0b46
--- /dev/null
+++ b/.bazeliskrc
@@ -0,0 +1 @@
+USE_BAZEL_VERSION=6.2.0
diff --git a/.bazelrc b/.bazelrc
index 5f30ba4..b646275 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -1,9 +1,4 @@
-common --curses=auto
-common --show_timestamps=true
-
-test --keep_going
 test --test_output=errors
-test --test_tag_filters=-known-to-fail
 
 # To enable flake8 on all build steps, uncomment this -
 # test --aspects="//tools/flake8:flake8.bzl%flake8_aspect" --output_groups=flake8_checks
diff --git a/.bazelversion b/.bazelversion
deleted file mode 100644
index 66ce77b..0000000
--- a/.bazelversion
+++ /dev/null
@@ -1 +0,0 @@
-7.0.0
diff --git a/.envrc b/.envrc
deleted file mode 100644
index c589014..0000000
--- a/.envrc
+++ /dev/null
@@ -1,2 +0,0 @@
-export SOURCE=$(dirname $(realpath $0))
-export PATH="${SOURCE}/bin:$PATH"
diff --git a/.gitignore b/.gitignore
index 66817fe..f38a91e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,4 +24,3 @@ tmp/
 /**/*.sqlite*
 /**/config*.toml
 /**/config*.yml
-MODULE.bazel.lock
diff --git a/BUILD.bazel b/BUILD
similarity index 100%
rename from BUILD.bazel
rename to BUILD
diff --git a/MODULE.bazel b/MODULE.bazel
deleted file mode 100644
index 00bb183..0000000
--- a/MODULE.bazel
+++ /dev/null
@@ -1,6 +0,0 @@
-###############################################################################
-# Bazel now uses Bzlmod by default to manage external dependencies.
-# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel.
-#
-# For more details, please check https://github.com/bazelbuild/bazel/issues/18958
-###############################################################################
diff --git a/WORKSPACE b/WORKSPACE
index 910f51c..0528d59 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -62,14 +62,76 @@ load("@arrdem_source_pypi//:requirements.bzl", "install_deps")
 # Call it to define repos for your requirements.
 install_deps()
 
-# git_repository(
-#    name = "rules_zapp",
-#    remote = "https://git.arrdem.com/arrdem/rules_zapp.git",
-#    commit = "961be891e5cff539e14f2050d5cd9e82845ce0f2",
-#    # tag = "0.1.2",
+git_repository(
+   name = "rules_zapp",
+   remote = "https://git.arrdem.com/arrdem/rules_zapp.git",
+   commit = "961be891e5cff539e14f2050d5cd9e82845ce0f2",
+   # tag = "0.1.2",
+)
+
+# local_repository(
+#     name = "rules_zapp",
+#     path = "/home/arrdem/Documents/hobby/programming/lang/python/rules_zapp",
 # )
 
-local_repository(
-    name = "rules_zapp",
-    path = "/home/arrdem/Documents/hobby/programming/lang/python/rules_zapp",
+####################################################################################################
+# Docker support
+####################################################################################################
+
+http_archive(
+    name = "io_bazel_rules_docker",
+    sha256 = "b1e80761a8a8243d03ebca8845e9cc1ba6c82ce7c5179ce2b295cd36f7e394bf",
+    urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.25.0/rules_docker-v0.25.0.tar.gz"],
+)
+
+load("@io_bazel_rules_docker//toolchains/docker:toolchain.bzl",
+    docker_toolchain_configure="toolchain_configure"
+)
+
+docker_toolchain_configure(
+  name = "docker_config",
+  docker_flags = [
+  ],
+)
+
+load(
+    "@io_bazel_rules_docker//repositories:repositories.bzl",
+    container_repositories = "repositories",
+)
+container_repositories()
+
+load(
+    "@io_bazel_rules_docker//repositories:deps.bzl",
+    container_deps = "deps"
+)
+
+container_deps()
+
+load(
+    "@io_bazel_rules_docker//container:container.bzl",
+    "container_pull",
+)
+
+# container_pull(
+#   name = "python_base",
+#   registry = "index.docker.io",
+#   repository = "library/python",
+#   tag = "3.10.8-alpine"
+#   # sha256 = "digest:d78a749034380426dd6cec6a0db139459ca701630533ffce112adbcdd996fddd",
+# )
+
+# container_pull(
+#   name = "python_base",
+#   registry = "gcr.io",
+#   repository = "distroless/python3-debian11",
+#   tag = "latest"
+#   # sha256 = "digest:d78a749034380426dd6cec6a0db139459ca701630533ffce112adbcdd996fddd",
+# )
+
+container_pull(
+  name = "python_base",
+  registry = "index.docker.io",
+  repository = "library/python",
+  tag = "3.11-buster"
+  # sha256 = "digest:d78a749034380426dd6cec6a0db139459ca701630533ffce112adbcdd996fddd",
 )
diff --git a/bin/bazel b/bin/bazel
deleted file mode 100755
index 40517be..0000000
--- a/bin/bazel
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-exec "${SOURCE}/projects/bazelshim/src/bazelshim/__main__.py" --bazelshim_exclude="$(realpath "${SOURCE}")/bin" "$@"
diff --git a/bin/bazelisk b/bin/bazelisk
deleted file mode 100755
index 40517be..0000000
--- a/bin/bazelisk
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-exec "${SOURCE}/projects/bazelshim/src/bazelshim/__main__.py" --bazelshim_exclude="$(realpath "${SOURCE}")/bin" "$@"
diff --git a/projects/activitypub_relay/BUILD.bazel b/projects/activitypub_relay/BUILD
similarity index 90%
rename from projects/activitypub_relay/BUILD.bazel
rename to projects/activitypub_relay/BUILD
index bc5205a..2996201 100644
--- a/projects/activitypub_relay/BUILD.bazel
+++ b/projects/activitypub_relay/BUILD
@@ -10,6 +10,6 @@ py_project(
         py_requirement("pyyaml"),
         py_requirement("retry"),
     ],
-    main = "src/relay/__main__.py",
+    main = "src/python/relay/__main__.py",
     shebang = "/usr/bin/env python3"
 )
diff --git a/projects/activitypub_relay/src/relay/__init__.py b/projects/activitypub_relay/src/python/relay/__init__.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/__init__.py
rename to projects/activitypub_relay/src/python/relay/__init__.py
diff --git a/projects/activitypub_relay/src/relay/__main__.py b/projects/activitypub_relay/src/python/relay/__main__.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/__main__.py
rename to projects/activitypub_relay/src/python/relay/__main__.py
diff --git a/projects/activitypub_relay/src/relay/application.py b/projects/activitypub_relay/src/python/relay/application.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/application.py
rename to projects/activitypub_relay/src/python/relay/application.py
diff --git a/projects/activitypub_relay/src/relay/config.py b/projects/activitypub_relay/src/python/relay/config.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/config.py
rename to projects/activitypub_relay/src/python/relay/config.py
diff --git a/projects/activitypub_relay/src/relay/database.py b/projects/activitypub_relay/src/python/relay/database.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/database.py
rename to projects/activitypub_relay/src/python/relay/database.py
diff --git a/projects/activitypub_relay/src/relay/http_debug.py b/projects/activitypub_relay/src/python/relay/http_debug.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/http_debug.py
rename to projects/activitypub_relay/src/python/relay/http_debug.py
diff --git a/projects/activitypub_relay/src/relay/misc.py b/projects/activitypub_relay/src/python/relay/misc.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/misc.py
rename to projects/activitypub_relay/src/python/relay/misc.py
diff --git a/projects/activitypub_relay/src/relay/processors.py b/projects/activitypub_relay/src/python/relay/processors.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/processors.py
rename to projects/activitypub_relay/src/python/relay/processors.py
diff --git a/projects/activitypub_relay/src/relay/views.py b/projects/activitypub_relay/src/python/relay/views.py
similarity index 100%
rename from projects/activitypub_relay/src/relay/views.py
rename to projects/activitypub_relay/src/python/relay/views.py
diff --git a/projects/aloe/BUILD.bazel b/projects/aloe/BUILD
similarity index 76%
rename from projects/aloe/BUILD.bazel
rename to projects/aloe/BUILD
index 70e6342..97107d9 100644
--- a/projects/aloe/BUILD.bazel
+++ b/projects/aloe/BUILD
@@ -4,7 +4,7 @@ py_project(
 
 zapp_binary(
     name = "aloe",
-    main = "src/aloe/__main__.py",
+    main = "src/python/aloe/__main__.py",
     deps = [
         ":lib",
         py_requirement("icmplib"),
diff --git a/projects/aloe/src/aloe/__main__.py b/projects/aloe/src/python/aloe/__main__.py
similarity index 100%
rename from projects/aloe/src/aloe/__main__.py
rename to projects/aloe/src/python/aloe/__main__.py
diff --git a/projects/aloe/src/aloe/cursedlogger.py b/projects/aloe/src/python/aloe/cursedlogger.py
similarity index 100%
rename from projects/aloe/src/aloe/cursedlogger.py
rename to projects/aloe/src/python/aloe/cursedlogger.py
diff --git a/projects/aloe/src/aloe/icmp.py b/projects/aloe/src/python/aloe/icmp.py
similarity index 100%
rename from projects/aloe/src/aloe/icmp.py
rename to projects/aloe/src/python/aloe/icmp.py
diff --git a/projects/anosql-migrations/BUILD.bazel b/projects/anosql-migrations/BUILD
similarity index 100%
rename from projects/anosql-migrations/BUILD.bazel
rename to projects/anosql-migrations/BUILD
diff --git a/projects/anosql-migrations/src/anosql_migrations.py b/projects/anosql-migrations/src/python/anosql_migrations.py
similarity index 100%
rename from projects/anosql-migrations/src/anosql_migrations.py
rename to projects/anosql-migrations/src/python/anosql_migrations.py
diff --git a/projects/anosql-migrations/test/test_migrations.py b/projects/anosql-migrations/test/python/test_migrations.py
similarity index 100%
rename from projects/anosql-migrations/test/test_migrations.py
rename to projects/anosql-migrations/test/python/test_migrations.py
diff --git a/projects/anosql/BUILD.bazel b/projects/anosql/BUILD
similarity index 100%
rename from projects/anosql/BUILD.bazel
rename to projects/anosql/BUILD
diff --git a/projects/anosql/src/anosql/__init__.py b/projects/anosql/src/python/anosql/__init__.py
similarity index 100%
rename from projects/anosql/src/anosql/__init__.py
rename to projects/anosql/src/python/anosql/__init__.py
diff --git a/projects/anosql/src/anosql/adapters/__init__.py b/projects/anosql/src/python/anosql/adapters/__init__.py
similarity index 100%
rename from projects/anosql/src/anosql/adapters/__init__.py
rename to projects/anosql/src/python/anosql/adapters/__init__.py
diff --git a/projects/anosql/src/anosql/adapters/psycopg2.py b/projects/anosql/src/python/anosql/adapters/psycopg2.py
similarity index 100%
rename from projects/anosql/src/anosql/adapters/psycopg2.py
rename to projects/anosql/src/python/anosql/adapters/psycopg2.py
diff --git a/projects/anosql/src/anosql/adapters/sqlite3.py b/projects/anosql/src/python/anosql/adapters/sqlite3.py
similarity index 100%
rename from projects/anosql/src/anosql/adapters/sqlite3.py
rename to projects/anosql/src/python/anosql/adapters/sqlite3.py
diff --git a/projects/anosql/src/anosql/core.py b/projects/anosql/src/python/anosql/core.py
similarity index 100%
rename from projects/anosql/src/anosql/core.py
rename to projects/anosql/src/python/anosql/core.py
diff --git a/projects/anosql/src/anosql/exceptions.py b/projects/anosql/src/python/anosql/exceptions.py
similarity index 100%
rename from projects/anosql/src/anosql/exceptions.py
rename to projects/anosql/src/python/anosql/exceptions.py
diff --git a/projects/anosql/src/anosql/patterns.py b/projects/anosql/src/python/anosql/patterns.py
similarity index 100%
rename from projects/anosql/src/anosql/patterns.py
rename to projects/anosql/src/python/anosql/patterns.py
diff --git a/projects/anosql/test/__init__.py b/projects/anosql/test/python/__init__.py
similarity index 100%
rename from projects/anosql/test/__init__.py
rename to projects/anosql/test/python/__init__.py
diff --git a/projects/anosql/test/blogdb/data/blogs_data.csv b/projects/anosql/test/python/blogdb/data/blogs_data.csv
similarity index 100%
rename from projects/anosql/test/blogdb/data/blogs_data.csv
rename to projects/anosql/test/python/blogdb/data/blogs_data.csv
diff --git a/projects/anosql/test/blogdb/data/users_data.csv b/projects/anosql/test/python/blogdb/data/users_data.csv
similarity index 100%
rename from projects/anosql/test/blogdb/data/users_data.csv
rename to projects/anosql/test/python/blogdb/data/users_data.csv
diff --git a/projects/anosql/test/blogdb/sql/blogs/blogs.sql b/projects/anosql/test/python/blogdb/sql/blogs/blogs.sql
similarity index 100%
rename from projects/anosql/test/blogdb/sql/blogs/blogs.sql
rename to projects/anosql/test/python/blogdb/sql/blogs/blogs.sql
diff --git a/projects/anosql/test/blogdb/sql/blogs/blogs_pg.sql b/projects/anosql/test/python/blogdb/sql/blogs/blogs_pg.sql
similarity index 100%
rename from projects/anosql/test/blogdb/sql/blogs/blogs_pg.sql
rename to projects/anosql/test/python/blogdb/sql/blogs/blogs_pg.sql
diff --git a/projects/anosql/test/blogdb/sql/blogs/blogs_sqlite.sql b/projects/anosql/test/python/blogdb/sql/blogs/blogs_sqlite.sql
similarity index 100%
rename from projects/anosql/test/blogdb/sql/blogs/blogs_sqlite.sql
rename to projects/anosql/test/python/blogdb/sql/blogs/blogs_sqlite.sql
diff --git a/projects/anosql/test/blogdb/sql/users/users.sql b/projects/anosql/test/python/blogdb/sql/users/users.sql
similarity index 100%
rename from projects/anosql/test/blogdb/sql/users/users.sql
rename to projects/anosql/test/python/blogdb/sql/users/users.sql
diff --git a/projects/anosql/test/conftest.py b/projects/anosql/test/python/conftest.py
similarity index 100%
rename from projects/anosql/test/conftest.py
rename to projects/anosql/test/python/conftest.py
diff --git a/projects/anosql/test/test_psycopg2.py b/projects/anosql/test/python/test_psycopg2.py
similarity index 100%
rename from projects/anosql/test/test_psycopg2.py
rename to projects/anosql/test/python/test_psycopg2.py
diff --git a/projects/anosql/test/test_simple.py b/projects/anosql/test/python/test_simple.py
similarity index 100%
rename from projects/anosql/test/test_simple.py
rename to projects/anosql/test/python/test_simple.py
diff --git a/projects/anosql/test/test_sqlite3.py b/projects/anosql/test/python/test_sqlite3.py
similarity index 100%
rename from projects/anosql/test/test_sqlite3.py
rename to projects/anosql/test/python/test_sqlite3.py
diff --git a/projects/archiver/BUILD.bazel b/projects/archiver/BUILD
similarity index 86%
rename from projects/archiver/BUILD.bazel
rename to projects/archiver/BUILD
index 9b9da65..667dc8e 100644
--- a/projects/archiver/BUILD.bazel
+++ b/projects/archiver/BUILD
@@ -15,6 +15,5 @@ zapp_binary(
     deps = [
         py_requirement("ExifRead"),
         py_requirement("yaspin"),
-    ],
-    shebang = "/usr/bin/env python3"
+    ]
 )
diff --git a/projects/async_cache/BUILD.bazel b/projects/async_cache/BUILD
similarity index 100%
rename from projects/async_cache/BUILD.bazel
rename to projects/async_cache/BUILD
diff --git a/projects/async_cache/src/async_cache/__init__.py b/projects/async_cache/src/python/async_cache/__init__.py
similarity index 100%
rename from projects/async_cache/src/async_cache/__init__.py
rename to projects/async_cache/src/python/async_cache/__init__.py
diff --git a/projects/async_cache/src/async_cache/key.py b/projects/async_cache/src/python/async_cache/key.py
similarity index 100%
rename from projects/async_cache/src/async_cache/key.py
rename to projects/async_cache/src/python/async_cache/key.py
diff --git a/projects/async_cache/src/async_cache/lru.py b/projects/async_cache/src/python/async_cache/lru.py
similarity index 100%
rename from projects/async_cache/src/async_cache/lru.py
rename to projects/async_cache/src/python/async_cache/lru.py
diff --git a/projects/async_cache/src/async_cache/ttl.py b/projects/async_cache/src/python/async_cache/ttl.py
similarity index 100%
rename from projects/async_cache/src/async_cache/ttl.py
rename to projects/async_cache/src/python/async_cache/ttl.py
diff --git a/projects/async_cache/test/test_lru.py b/projects/async_cache/test/python/test_lru.py
similarity index 100%
rename from projects/async_cache/test/test_lru.py
rename to projects/async_cache/test/python/test_lru.py
diff --git a/projects/async_cache/test/test_ttl.py b/projects/async_cache/test/python/test_ttl.py
similarity index 100%
rename from projects/async_cache/test/test_ttl.py
rename to projects/async_cache/test/python/test_ttl.py
diff --git a/projects/bazelshim/BUILD.bazel b/projects/bazelshim/BUILD.bazel
deleted file mode 100644
index 5013a2e..0000000
--- a/projects/bazelshim/BUILD.bazel
+++ /dev/null
@@ -1,4 +0,0 @@
-py_project(
-    name = "bazelshim",
-    main = "src/bazelshim/__main__.py",
-)
diff --git a/projects/bazelshim/src/bazelshim/__main__.py b/projects/bazelshim/src/bazelshim/__main__.py
deleted file mode 100755
index 62923ca..0000000
--- a/projects/bazelshim/src/bazelshim/__main__.py
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/env python3
-
-# Since this can't run under Bazel, we have to set up the sys.path ourselves
-import os
-import sys
-from pathlib import Path
-
-if (p := str(Path(sys.argv[0]).absolute().parent.parent)) not in sys.path:
-    sys.path.pop(0)  # Remove '.' / ''
-    sys.path.insert(0, p)  # Insert the bazelshim root
-
-# Now that's out of the way...
-from dataclasses import dataclass
-from shlex import quote, split as shlex
-import sys
-import tomllib
-from pathlib import Path
-from typing import List, Optional
-from itertools import chain
-
-
-# FIXME: Allow user-defined extensions here
-VERBS = [
-    "aquery",
-    "build",
-    "clean",
-    "coverage",
-    "cquery",
-    "dump",
-    "fetch",
-    "help",
-    "info",
-    "mod",
-    "query",
-    "run",
-    "sync",
-    "test",
-    "watch",
-]
-
-
-def path():
-    for it in os.getenv("PATH").split(":"):
-        yield Path(it)
-
-
-def which(cmd):
-    for it in path():
-        f: Path = (it / cmd).absolute()
-        if f.exists() and f.stat().st_mode & 0x700:
-            yield f
-
-
-def normalize_opts(args: List[str]) -> List[str]:
-    acc = []
-
-    if args[0].endswith("bazel") or args[0].endswith("bazelis"):
-        acc.append(args.pop(0))
-
-    while len(args) >= 2:
-        if args[0] == "--":
-            # Break
-            acc.extend(args)
-            break
-
-        elif "=" in args[0]:
-            # If it's a k/v form pass it through
-            acc.append(args.pop(0))
-
-        elif args[0].startswith("--no"):
-            # Convert --no<foo> args to --<foo>=no
-            acc.append("--" + args.pop(0).lstrip("--no") + "=false")
-
-        elif args[0] == "--isatty=0":
-            acc.append("--isatty=false")
-            args.pop(0)
-
-        elif (
-            args[0].startswith("--")
-            and not args[1].startswith("--")
-            and args[1] not in VERBS
-        ):
-            # If the next thing isn't an opt, assume it's a '--a b' form
-            acc.append(args[0] + "=" + args[1])
-            args.pop(0)
-            args.pop(0)
-
-        elif args[0].startswith("--"):
-            # Assume it's a boolean true flag
-            acc.append(args.pop(0) + "=true")
-
-        else:
-            acc.append(args.pop(0))
-
-    else:
-        if args:
-            acc.extend(args)
-
-    return acc
-
-
-@dataclass
-class BazelCli:
-    binary: str
-    startup_opts: List[str]
-    command: Optional[str]
-    command_opts: List[str]
-    subprocess_opts: List[str]
-
-    @classmethod
-    def parse_cli(cls, args: List[str]) -> "BazelCli":
-        args = normalize_opts(args)
-        binary = args.pop(0)
-
-        startup_opts = []
-        while args and args[0].startswith("--"):
-            startup_opts.append(args.pop(0))
-
-        command = None
-        if args and args[0] in VERBS:
-            command = args.pop(0)
-
-        command_opts = []
-        while args and args[0] != "--":
-            command_opts.append(args.pop(0))
-
-        subprocess_opts = []
-        if args:
-            if args[0] == "--":
-                args.pop(0)
-            subprocess_opts.extend(args)
-
-        return cls(
-            binary=binary,
-            startup_opts=startup_opts,
-            command=command,
-            command_opts=command_opts,
-            subprocess_opts=subprocess_opts,
-        )
-
-    def render_cli(self):
-        acc = [
-            self.binary,
-            *self.startup_opts,
-        ]
-        if self.command:
-            if self.command == "watch":
-                acc.extend(self.command_opts)
-            else:
-                acc.append(self.command)
-                acc.extend(self.command_opts)
-
-            if self.command == "test":
-                acc.extend(["--test_arg=" + it for it in self.subprocess_opts])
-            elif self.command == "run":
-                acc.append("--")
-                acc.extend(self.subprocess_opts)
-            elif self.command and not self.subprocess_opts:
-                pass
-            else:
-                print(
-                    f"Warning: {self.command} does not support -- args! {self.subprocess_opts!r}",
-                    file=sys.stderr,
-                )
-
-        return acc
-
-    def executable(self, exclude: List[Path]):
-        """Try to resolve as via which() an executable to delegate to."""
-
-        if self.command == "watch":
-            for p in chain(which("ibazel")):
-                if p.parent not in exclude:
-                    return str(p)
-
-        else:
-            for p in chain(which("bazelisk"), which("bazel")):
-                if p.parent not in exclude:
-                    return str(p)
-
-    def render_text(self, next):
-        lines = []
-        lines.append("  " + next)
-        base_prefix = "      "
-        for arg in self.render_cli()[1:]:
-            prefix = base_prefix
-            if arg in VERBS or arg == self.command:
-                prefix = "    "
-            elif arg == "--":
-                base_prefix += "  "
-            lines.append(prefix + arg)
-        return "\\\n".join(lines)
-
-
-# FIXME: Use some sort of plugin model here to implement interceptors
-def middleware(cli):
-    return cli
-
-
-if __name__ == "__main__":
-    # This script has a magical flag to help with resolving bazel
-    exclude = []
-    while len(sys.argv) > 1 and sys.argv[1].startswith("--bazelshim_exclude"):
-        exclude.append(Path(sys.argv.pop(1).split("=")[1]).absolute())
-
-    us = Path(sys.argv[0]).absolute()
-    exclude.append(us.parent)
-
-    cli = BazelCli.parse_cli(["bazel"] + sys.argv[1:])
-    cli = middleware(cli)
-    next = cli.executable(exclude=exclude)
-    if sys.stderr.isatty() and not "--isatty=false" in cli.command_opts:
-        print(
-            "\u001b[33mInfo\u001b[0m: Executing\n" + cli.render_text(next),
-            file=sys.stderr,
-        )
-    os.execv(next, cli.render_cli())
diff --git a/projects/bazelshim/test/test_normalizer.py b/projects/bazelshim/test/test_normalizer.py
deleted file mode 100644
index a2cf3ca..0000000
--- a/projects/bazelshim/test/test_normalizer.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python3
-
-from shlex import split as shlex
-
-from bazelshim.__main__ import normalize_opts
-
-import pytest
-
-
-@pytest.mark.parametrize(
-    "a, b",
-    [
-        (
-            "bazel clean",
-            [
-                "bazel",
-                "clean",
-            ],
-        ),
-        (
-            "bazel --client_debug clean",
-            [
-                "bazel",
-                "--client_debug=true",
-                "clean",
-            ],
-        ),
-        (
-            "bazel build //foo:bar //baz:*",
-            [
-                "bazel",
-                "build",
-                "//foo:bar",
-                "//baz:*",
-            ],
-        ),
-        (
-            "bazel test //foo:bar //baz:* -- -vvv",
-            [
-                "bazel",
-                "test",
-                "//foo:bar",
-                "//baz:*",
-                "--",
-                "-vvv",
-            ],
-        ),
-        (
-            "bazel test --shell_executable /bin/bish //foo:bar //baz:* -- -vvv",
-            [
-                "bazel",
-                "test",
-                "--shell_executable=/bin/bish",
-                "//foo:bar",
-                "//baz:*",
-                "--",
-                "-vvv",
-            ],
-        ),
-        (
-            "bazel run //foo:bar -- --foo=bar --baz=qux",
-            [
-                "bazel",
-                "run",
-                "//foo:bar",
-                "--",
-                "--foo=bar",
-                "--baz=qux",
-            ],
-        ),
-    ],
-)
-def test_normalize_opts(a, b):
-    assert normalize_opts(shlex(a)) == b
diff --git a/projects/bazelshim/test/test_parser.py b/projects/bazelshim/test/test_parser.py
deleted file mode 100644
index c2cc3d0..0000000
--- a/projects/bazelshim/test/test_parser.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python3
-
-from shlex import split as shlex
-
-from bazelshim.__main__ import BazelCli
-
-import pytest
-
-
-@pytest.mark.parametrize(
-    "a, b",
-    [
-        (
-            "bazel clean",
-            BazelCli("bazel", [], "clean", [], []),
-        ),
-        (
-            "bazel --client_debug clean",
-            BazelCli("bazel", ["--client_debug=true"], "clean", [], []),
-        ),
-        (
-            "bazel build //foo:bar //baz:*",
-            BazelCli("bazel", [], "build", ["//foo:bar", "//baz:*"], []),
-        ),
-        (
-            "bazel test //foo:bar //baz:* -- -vvv",
-            BazelCli("bazel", [], "test", ["//foo:bar", "//baz:*"], ["-vvv"]),
-        ),
-        (
-            "bazel test --shell_executable /bin/bish //foo:bar //baz:* -- -vvv",
-            BazelCli(
-                "bazel",
-                [],
-                "test",
-                ["--shell_executable=/bin/bish", "//foo:bar", "//baz:*"],
-                ["-vvv"],
-            ),
-        ),
-        (
-            "bazel run //foo:bar -- --foo=bar --baz=qux",
-            BazelCli(
-                "bazel",
-                [],
-                "run",
-                ["//foo:bar"],
-                ["--foo=bar", "--baz=qux"],
-            ),
-        ),
-    ],
-)
-def test_normalize_opts(a, b):
-    assert BazelCli.parse_cli(shlex(a)) == b
diff --git a/projects/bazelshim/src/bazelshim/__init__.py b/projects/bussard/src/python/bussard/__init__.py
similarity index 100%
rename from projects/bazelshim/src/bazelshim/__init__.py
rename to projects/bussard/src/python/bussard/__init__.py
diff --git a/projects/bussard/src/bussard/bfmt b/projects/bussard/src/python/bussard/bfmt
similarity index 100%
rename from projects/bussard/src/bussard/bfmt
rename to projects/bussard/src/python/bussard/bfmt
diff --git a/projects/bussard/src/bussard/bparse b/projects/bussard/src/python/bussard/bparse
similarity index 100%
rename from projects/bussard/src/bussard/bparse
rename to projects/bussard/src/python/bussard/bparse
diff --git a/projects/bussard/src/bussard/__init__.py b/projects/bussard/src/python/bussard/gen/__init__.py
similarity index 100%
rename from projects/bussard/src/bussard/__init__.py
rename to projects/bussard/src/python/bussard/gen/__init__.py
diff --git a/projects/bussard/src/bussard/reader.py b/projects/bussard/src/python/bussard/reader.py
similarity index 100%
rename from projects/bussard/src/bussard/reader.py
rename to projects/bussard/src/python/bussard/reader.py
diff --git a/projects/bussard/test/bussard/test_reader.py b/projects/bussard/test/python/bussard/test_reader.py
similarity index 100%
rename from projects/bussard/test/bussard/test_reader.py
rename to projects/bussard/test/python/bussard/test_reader.py
diff --git a/projects/calf/BUILD.bazel b/projects/calf/BUILD
similarity index 80%
rename from projects/calf/BUILD.bazel
rename to projects/calf/BUILD
index baed3a6..c1e87be 100644
--- a/projects/calf/BUILD.bazel
+++ b/projects/calf/BUILD
@@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"])
 
 py_library(
     name = "lib",
-    srcs = glob(["src/**/*.py"]),
+    srcs = glob(["src/python/**/*.py"]),
     imports = ["src/python"],
     deps = [
         py_requirement("pyrsistent"),
diff --git a/projects/calf/src/calf/__init__.py b/projects/calf/src/python/calf/__init__.py
similarity index 100%
rename from projects/calf/src/calf/__init__.py
rename to projects/calf/src/python/calf/__init__.py
diff --git a/projects/calf/src/calf/analyzer.py b/projects/calf/src/python/calf/analyzer.py
similarity index 100%
rename from projects/calf/src/calf/analyzer.py
rename to projects/calf/src/python/calf/analyzer.py
diff --git a/projects/calf/src/calf/cursedrepl.py b/projects/calf/src/python/calf/cursedrepl.py
similarity index 100%
rename from projects/calf/src/calf/cursedrepl.py
rename to projects/calf/src/python/calf/cursedrepl.py
diff --git a/projects/calf/src/calf/grammar.py b/projects/calf/src/python/calf/grammar.py
similarity index 100%
rename from projects/calf/src/calf/grammar.py
rename to projects/calf/src/python/calf/grammar.py
diff --git a/projects/calf/src/calf/io/reader.py b/projects/calf/src/python/calf/io/reader.py
similarity index 100%
rename from projects/calf/src/calf/io/reader.py
rename to projects/calf/src/python/calf/io/reader.py
diff --git a/projects/calf/src/calf/lexer.py b/projects/calf/src/python/calf/lexer.py
similarity index 100%
rename from projects/calf/src/calf/lexer.py
rename to projects/calf/src/python/calf/lexer.py
diff --git a/projects/calf/src/calf/packages.py b/projects/calf/src/python/calf/packages.py
similarity index 100%
rename from projects/calf/src/calf/packages.py
rename to projects/calf/src/python/calf/packages.py
diff --git a/projects/calf/src/calf/parser.py b/projects/calf/src/python/calf/parser.py
similarity index 100%
rename from projects/calf/src/calf/parser.py
rename to projects/calf/src/python/calf/parser.py
diff --git a/projects/calf/src/calf/reader.py b/projects/calf/src/python/calf/reader.py
similarity index 100%
rename from projects/calf/src/calf/reader.py
rename to projects/calf/src/python/calf/reader.py
diff --git a/projects/calf/src/calf/token.py b/projects/calf/src/python/calf/token.py
similarity index 100%
rename from projects/calf/src/calf/token.py
rename to projects/calf/src/python/calf/token.py
diff --git a/projects/calf/src/calf/types.py b/projects/calf/src/python/calf/types.py
similarity index 100%
rename from projects/calf/src/calf/types.py
rename to projects/calf/src/python/calf/types.py
diff --git a/projects/calf/src/calf/util.py b/projects/calf/src/python/calf/util.py
similarity index 100%
rename from projects/calf/src/calf/util.py
rename to projects/calf/src/python/calf/util.py
diff --git a/projects/calf/tests/python/BUILD.bazel b/projects/calf/tests/python/BUILD
similarity index 100%
rename from projects/calf/tests/python/BUILD.bazel
rename to projects/calf/tests/python/BUILD
diff --git a/projects/cherry-shim/BUILD.bazel b/projects/cherry-shim/BUILD
similarity index 100%
rename from projects/cherry-shim/BUILD.bazel
rename to projects/cherry-shim/BUILD
diff --git a/projects/cherry-shim/src/cherry_shim.py b/projects/cherry-shim/src/python/cherry_shim.py
similarity index 100%
rename from projects/cherry-shim/src/cherry_shim.py
rename to projects/cherry-shim/src/python/cherry_shim.py
diff --git a/projects/clusterctrl/BUILD.bazel b/projects/clusterctrl/BUILD
similarity index 83%
rename from projects/clusterctrl/BUILD.bazel
rename to projects/clusterctrl/BUILD
index 9de3323..0f44e22 100644
--- a/projects/clusterctrl/BUILD.bazel
+++ b/projects/clusterctrl/BUILD
@@ -7,7 +7,7 @@ py_project(
 
 zapp_binary(
     name = "clusterctrl",
-    main = "src/clusterctrl/__main__.py",
+    main = "src/python/clusterctrl/__main__.py",
     imports = [
         "src/python",
     ],
diff --git a/projects/clusterctrl/src/clusterctrl/__main__.py b/projects/clusterctrl/src/python/clusterctrl/__main__.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/__main__.py
rename to projects/clusterctrl/src/python/clusterctrl/__main__.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/alert.py b/projects/clusterctrl/src/python/clusterctrl/cmd/alert.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/alert.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/alert.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/fan.py b/projects/clusterctrl/src/python/clusterctrl/cmd/fan.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/fan.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/fan.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/hub.py b/projects/clusterctrl/src/python/clusterctrl/cmd/hub.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/hub.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/hub.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/led.py b/projects/clusterctrl/src/python/clusterctrl/cmd/led.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/led.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/led.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/power.py b/projects/clusterctrl/src/python/clusterctrl/cmd/power.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/power.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/power.py
diff --git a/projects/clusterctrl/src/clusterctrl/cmd/save.py b/projects/clusterctrl/src/python/clusterctrl/cmd/save.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/cmd/save.py
rename to projects/clusterctrl/src/python/clusterctrl/cmd/save.py
diff --git a/projects/clusterctrl/src/clusterctrl/driver.py b/projects/clusterctrl/src/python/clusterctrl/driver.py
similarity index 100%
rename from projects/clusterctrl/src/clusterctrl/driver.py
rename to projects/clusterctrl/src/python/clusterctrl/driver.py
diff --git a/projects/clusterctrl/test/test_driver.py b/projects/clusterctrl/test/python/test_driver.py
similarity index 100%
rename from projects/clusterctrl/test/test_driver.py
rename to projects/clusterctrl/test/python/test_driver.py
diff --git a/projects/damm/BUILD.bazel b/projects/damm/BUILD
similarity index 100%
rename from projects/damm/BUILD.bazel
rename to projects/damm/BUILD
diff --git a/projects/damm/src/damm.py b/projects/damm/src/python/damm.py
similarity index 100%
rename from projects/damm/src/damm.py
rename to projects/damm/src/python/damm.py
diff --git a/projects/damm/test/test_damm.py b/projects/damm/test/python/test_damm.py
similarity index 100%
rename from projects/damm/test/test_damm.py
rename to projects/damm/test/python/test_damm.py
diff --git a/projects/damm/test/test_hypothesis.py b/projects/damm/test/python/test_hypothesis.py
similarity index 100%
rename from projects/damm/test/test_hypothesis.py
rename to projects/damm/test/python/test_hypothesis.py
diff --git a/projects/datalog-shell/BUILD.bazel b/projects/datalog-shell/BUILD
similarity index 80%
rename from projects/datalog-shell/BUILD.bazel
rename to projects/datalog-shell/BUILD
index f849f1d..0a4e2d9 100644
--- a/projects/datalog-shell/BUILD.bazel
+++ b/projects/datalog-shell/BUILD
@@ -1,6 +1,6 @@
 zapp_binary(
     name = "datalog-shell",
-    main = "src/datalog/shell/__main__.py",
+    main = "src/python/datalog/shell/__main__.py",
     imports = [
         "src/python"
     ],
diff --git a/projects/datalog-shell/src/datalog/shell/__main__.py b/projects/datalog-shell/src/python/datalog/shell/__main__.py
similarity index 100%
rename from projects/datalog-shell/src/datalog/shell/__main__.py
rename to projects/datalog-shell/src/python/datalog/shell/__main__.py
diff --git a/projects/datalog/BUILD.bazel b/projects/datalog/BUILD
similarity index 100%
rename from projects/datalog/BUILD.bazel
rename to projects/datalog/BUILD
diff --git a/projects/bussard/src/bussard/gen/__init__.py b/projects/datalog/src/python/__init__.py
similarity index 100%
rename from projects/bussard/src/bussard/gen/__init__.py
rename to projects/datalog/src/python/__init__.py
diff --git a/projects/datalog/src/__init__.py b/projects/datalog/src/python/datalog/__init__.py
similarity index 100%
rename from projects/datalog/src/__init__.py
rename to projects/datalog/src/python/datalog/__init__.py
diff --git a/projects/datalog/src/datalog/debris.py b/projects/datalog/src/python/datalog/debris.py
similarity index 100%
rename from projects/datalog/src/datalog/debris.py
rename to projects/datalog/src/python/datalog/debris.py
diff --git a/projects/datalog/src/datalog/easy.py b/projects/datalog/src/python/datalog/easy.py
similarity index 100%
rename from projects/datalog/src/datalog/easy.py
rename to projects/datalog/src/python/datalog/easy.py
diff --git a/projects/datalog/src/datalog/evaluator.py b/projects/datalog/src/python/datalog/evaluator.py
similarity index 100%
rename from projects/datalog/src/datalog/evaluator.py
rename to projects/datalog/src/python/datalog/evaluator.py
diff --git a/projects/datalog/src/datalog/parser.py b/projects/datalog/src/python/datalog/parser.py
similarity index 100%
rename from projects/datalog/src/datalog/parser.py
rename to projects/datalog/src/python/datalog/parser.py
diff --git a/projects/datalog/src/datalog/reader.py b/projects/datalog/src/python/datalog/reader.py
similarity index 100%
rename from projects/datalog/src/datalog/reader.py
rename to projects/datalog/src/python/datalog/reader.py
diff --git a/projects/datalog/src/datalog/types.py b/projects/datalog/src/python/datalog/types.py
similarity index 100%
rename from projects/datalog/src/datalog/types.py
rename to projects/datalog/src/python/datalog/types.py
diff --git a/projects/datalog/test/test_datalog_evaluator.py b/projects/datalog/test/python/test_datalog_evaluator.py
similarity index 100%
rename from projects/datalog/test/test_datalog_evaluator.py
rename to projects/datalog/test/python/test_datalog_evaluator.py
diff --git a/projects/datalog/test/test_datalog_reader.py b/projects/datalog/test/python/test_datalog_reader.py
similarity index 100%
rename from projects/datalog/test/test_datalog_reader.py
rename to projects/datalog/test/python/test_datalog_reader.py
diff --git a/projects/flowmetal/BUILD.bazel b/projects/flowmetal/BUILD
similarity index 75%
rename from projects/flowmetal/BUILD.bazel
rename to projects/flowmetal/BUILD
index 6110e78..1df43c3 100644
--- a/projects/flowmetal/BUILD.bazel
+++ b/projects/flowmetal/BUILD
@@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"])
 
 py_library(
     name = "lib",
-    srcs = glob(["src/flowmetal/*.py"]),
+    srcs = glob(["src/python/flowmetal/*.py"]),
     imports = [
         "src/python"
     ],
@@ -17,5 +17,5 @@ py_binary(
         py_requirement("click"),
         py_requirement("redis"),
     ],
-    main = "src/flowmetal/__main__.py",
+    main = "src/python/flowmetal/__main__.py",
 )
diff --git a/projects/flowmetal/scratch/BUILD.bazel b/projects/flowmetal/scratch/BUILD
similarity index 100%
rename from projects/flowmetal/scratch/BUILD.bazel
rename to projects/flowmetal/scratch/BUILD
diff --git a/projects/flowmetal/src/flowmetal/__main__.py b/projects/flowmetal/src/python/flowmetal/__main__.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/__main__.py
rename to projects/flowmetal/src/python/flowmetal/__main__.py
diff --git a/projects/flowmetal/src/flowmetal/db/base.py b/projects/flowmetal/src/python/flowmetal/db/base.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/db/base.py
rename to projects/flowmetal/src/python/flowmetal/db/base.py
diff --git a/projects/flowmetal/src/flowmetal/db/redis.py b/projects/flowmetal/src/python/flowmetal/db/redis.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/db/redis.py
rename to projects/flowmetal/src/python/flowmetal/db/redis.py
diff --git a/projects/flowmetal/src/flowmetal/frontend.py b/projects/flowmetal/src/python/flowmetal/frontend.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/frontend.py
rename to projects/flowmetal/src/python/flowmetal/frontend.py
diff --git a/projects/flowmetal/src/flowmetal/interpreter.py b/projects/flowmetal/src/python/flowmetal/interpreter.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/interpreter.py
rename to projects/flowmetal/src/python/flowmetal/interpreter.py
diff --git a/projects/flowmetal/src/flowmetal/models.py b/projects/flowmetal/src/python/flowmetal/models.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/models.py
rename to projects/flowmetal/src/python/flowmetal/models.py
diff --git a/projects/flowmetal/src/flowmetal/reaper.py b/projects/flowmetal/src/python/flowmetal/reaper.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/reaper.py
rename to projects/flowmetal/src/python/flowmetal/reaper.py
diff --git a/projects/flowmetal/src/flowmetal/scheduler.py b/projects/flowmetal/src/python/flowmetal/scheduler.py
similarity index 100%
rename from projects/flowmetal/src/flowmetal/scheduler.py
rename to projects/flowmetal/src/python/flowmetal/scheduler.py
diff --git a/projects/gandi/BUILD.bazel b/projects/gandi/BUILD
similarity index 79%
rename from projects/gandi/BUILD.bazel
rename to projects/gandi/BUILD
index e887cbb..936b3c7 100644
--- a/projects/gandi/BUILD.bazel
+++ b/projects/gandi/BUILD
@@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"])
 
 py_library(
     name = "gandi",
-    srcs = glob(["src/gandi/client.py"]),
+    srcs = glob(["src/python/gandi/client.py"]),
     imports = [
         "src/python",
     ],
diff --git a/projects/datalog/src/datalog/__init__.py b/projects/gandi/src/python/gandi/__init__.py
similarity index 100%
rename from projects/datalog/src/datalog/__init__.py
rename to projects/gandi/src/python/gandi/__init__.py
diff --git a/projects/gandi/src/gandi/client.py b/projects/gandi/src/python/gandi/client.py
similarity index 100%
rename from projects/gandi/src/gandi/client.py
rename to projects/gandi/src/python/gandi/client.py
diff --git a/projects/gcode-interpreter/src/gcode_interpreter.py b/projects/gcode-interpreter/src/python/gcode_interpreter.py
similarity index 100%
rename from projects/gcode-interpreter/src/gcode_interpreter.py
rename to projects/gcode-interpreter/src/python/gcode_interpreter.py
diff --git a/projects/gh-unnotifier/BUILD.bazel b/projects/gh-unnotifier/BUILD
similarity index 78%
rename from projects/gh-unnotifier/BUILD.bazel
rename to projects/gh-unnotifier/BUILD
index 6373c3e..a820dab 100644
--- a/projects/gh-unnotifier/BUILD.bazel
+++ b/projects/gh-unnotifier/BUILD
@@ -1,6 +1,6 @@
 py_project(
     name = "gh-unnotifier",
-    main = "src/ghunnotif/__main__.py",
+    main = "src/python/ghunnotif/__main__.py",
     main_deps = [
         py_requirement("click"),
         py_requirement("requests"),
diff --git a/projects/gh-unnotifier/src/ghunnotif/__main__.py b/projects/gh-unnotifier/src/python/ghunnotif/__main__.py
similarity index 100%
rename from projects/gh-unnotifier/src/ghunnotif/__main__.py
rename to projects/gh-unnotifier/src/python/ghunnotif/__main__.py
diff --git a/projects/jobq/BUILD.bazel b/projects/jobq/BUILD
similarity index 100%
rename from projects/jobq/BUILD.bazel
rename to projects/jobq/BUILD
diff --git a/projects/jobq/src/jobq/__init__.py b/projects/jobq/src/python/jobq/__init__.py
similarity index 100%
rename from projects/jobq/src/jobq/__init__.py
rename to projects/jobq/src/python/jobq/__init__.py
diff --git a/projects/jobq/test/test_jobq.py b/projects/jobq/test/python/test_jobq.py
similarity index 100%
rename from projects/jobq/test/test_jobq.py
rename to projects/jobq/test/python/test_jobq.py
diff --git a/projects/jobqd/BUILD.bazel b/projects/jobqd/BUILD
similarity index 79%
rename from projects/jobqd/BUILD.bazel
rename to projects/jobqd/BUILD
index 5b1e36d..71d56e8 100644
--- a/projects/jobqd/BUILD.bazel
+++ b/projects/jobqd/BUILD
@@ -1,6 +1,6 @@
 zapp_binary(
     name = "jobqd",
-    main = "src/jobqd/__main__.py",
+    main = "src/python/jobqd/__main__.py",
     imports = [
         "src/python",
     ],
@@ -13,7 +13,7 @@ zapp_binary(
 py_library(
     name = "client",
     srcs = [
-        "src/jobqd/rest/api.py",
+        "src/python/jobqd/rest/api.py",
     ],
     imports = [
         "src/python",
diff --git a/projects/jobqd/src/jobqd/__main__.py b/projects/jobqd/src/python/jobqd/__main__.py
similarity index 100%
rename from projects/jobqd/src/jobqd/__main__.py
rename to projects/jobqd/src/python/jobqd/__main__.py
diff --git a/projects/jobqd/src/jobqd/openapi.yaml b/projects/jobqd/src/python/jobqd/openapi.yaml
similarity index 100%
rename from projects/jobqd/src/jobqd/openapi.yaml
rename to projects/jobqd/src/python/jobqd/openapi.yaml
diff --git a/projects/jobqd/src/jobqd/rest/api.py b/projects/jobqd/src/python/jobqd/rest/api.py
similarity index 100%
rename from projects/jobqd/src/jobqd/rest/api.py
rename to projects/jobqd/src/python/jobqd/rest/api.py
diff --git a/projects/lilith/BUILD.bazel b/projects/lilith/BUILD
similarity index 86%
rename from projects/lilith/BUILD.bazel
rename to projects/lilith/BUILD
index 858526e..c7909ad 100644
--- a/projects/lilith/BUILD.bazel
+++ b/projects/lilith/BUILD
@@ -1,6 +1,6 @@
 py_project(
     name = "lilith",
-    main = "src/lilith/__main__.py",
+    main = "src/python/lilith/__main__.py",
     lib_deps = [
         py_requirement("lark"),
         py_requirement("pyyaml"),
diff --git a/projects/gandi/src/gandi/__init__.py b/projects/lilith/src/python/lilith/__init__.py
similarity index 100%
rename from projects/gandi/src/gandi/__init__.py
rename to projects/lilith/src/python/lilith/__init__.py
diff --git a/projects/lilith/src/lilith/__main__.py b/projects/lilith/src/python/lilith/__main__.py
similarity index 100%
rename from projects/lilith/src/lilith/__main__.py
rename to projects/lilith/src/python/lilith/__main__.py
diff --git a/projects/lilith/src/lilith/grammar.lark b/projects/lilith/src/python/lilith/grammar.lark
similarity index 100%
rename from projects/lilith/src/lilith/grammar.lark
rename to projects/lilith/src/python/lilith/grammar.lark
diff --git a/projects/lilith/src/lilith/interpreter.py b/projects/lilith/src/python/lilith/interpreter.py
similarity index 100%
rename from projects/lilith/src/lilith/interpreter.py
rename to projects/lilith/src/python/lilith/interpreter.py
diff --git a/projects/lilith/src/lilith/parser.py b/projects/lilith/src/python/lilith/parser.py
similarity index 100%
rename from projects/lilith/src/lilith/parser.py
rename to projects/lilith/src/python/lilith/parser.py
diff --git a/projects/lilith/src/lilith/prelude.lil b/projects/lilith/src/python/lilith/prelude.lil
similarity index 100%
rename from projects/lilith/src/lilith/prelude.lil
rename to projects/lilith/src/python/lilith/prelude.lil
diff --git a/projects/lilith/src/lilith/reader.py b/projects/lilith/src/python/lilith/reader.py
similarity index 100%
rename from projects/lilith/src/lilith/reader.py
rename to projects/lilith/src/python/lilith/reader.py
diff --git a/projects/lilith/test/conftest.py b/projects/lilith/test/python/conftest.py
similarity index 100%
rename from projects/lilith/test/conftest.py
rename to projects/lilith/test/python/conftest.py
diff --git a/projects/lilith/test/test_interpreter.py b/projects/lilith/test/python/test_interpreter.py
similarity index 100%
rename from projects/lilith/test/test_interpreter.py
rename to projects/lilith/test/python/test_interpreter.py
diff --git a/projects/lilith/test/test_parser.py b/projects/lilith/test/python/test_parser.py
similarity index 100%
rename from projects/lilith/test/test_parser.py
rename to projects/lilith/test/python/test_parser.py
diff --git a/projects/lilith/test/test_reader.py b/projects/lilith/test/python/test_reader.py
similarity index 100%
rename from projects/lilith/test/test_reader.py
rename to projects/lilith/test/python/test_reader.py
diff --git a/projects/octodash/BUILD.bazel b/projects/octodash/BUILD
similarity index 100%
rename from projects/octodash/BUILD.bazel
rename to projects/octodash/BUILD
diff --git a/projects/octostep/BUILD.bazel b/projects/octostep/BUILD
similarity index 100%
rename from projects/octostep/BUILD.bazel
rename to projects/octostep/BUILD
diff --git a/projects/proquint/BUILD.bazel b/projects/proquint/BUILD
similarity index 85%
rename from projects/proquint/BUILD.bazel
rename to projects/proquint/BUILD
index c94e574..c55fdfd 100644
--- a/projects/proquint/BUILD.bazel
+++ b/projects/proquint/BUILD
@@ -7,7 +7,7 @@ py_project(
 
 zapp_binary(
     name = "qint",
-    main = "src/proquint/__main__.py",
+    main = "src/python/proquint/__main__.py",
     shebang = "#!/usr/bin/env python3",
     imports = [
         "src/python",
diff --git a/projects/proquint/src/proquint/__init__.py b/projects/proquint/src/python/proquint/__init__.py
similarity index 100%
rename from projects/proquint/src/proquint/__init__.py
rename to projects/proquint/src/python/proquint/__init__.py
diff --git a/projects/proquint/src/proquint/__main__.py b/projects/proquint/src/python/proquint/__main__.py
similarity index 100%
rename from projects/proquint/src/proquint/__main__.py
rename to projects/proquint/src/python/proquint/__main__.py
diff --git a/projects/proquint/test/test_examples.py b/projects/proquint/test/python/test_examples.py
similarity index 100%
rename from projects/proquint/test/test_examples.py
rename to projects/proquint/test/python/test_examples.py
diff --git a/projects/proquint/test/test_hypothesis.py b/projects/proquint/test/python/test_hypothesis.py
similarity index 100%
rename from projects/proquint/test/test_hypothesis.py
rename to projects/proquint/test/python/test_hypothesis.py
diff --git a/projects/public_dns/BUILD.bazel b/projects/public_dns/BUILD
similarity index 83%
rename from projects/public_dns/BUILD.bazel
rename to projects/public_dns/BUILD
index 487b8bb..989fd2e 100644
--- a/projects/public_dns/BUILD.bazel
+++ b/projects/public_dns/BUILD
@@ -1,6 +1,6 @@
 py_project(
     name = "updater",
-    main = "src/updater/__main__.py",
+    main = "src/python/updater/__main__.py",
     shebang = "/usr/bin/env python3",
     lib_deps = [
         "//projects/gandi",
diff --git a/projects/public_dns/src/updater/__init__.py b/projects/public_dns/src/python/updater/__init__.py
similarity index 100%
rename from projects/public_dns/src/updater/__init__.py
rename to projects/public_dns/src/python/updater/__init__.py
diff --git a/projects/public_dns/src/updater/__main__.py b/projects/public_dns/src/python/updater/__main__.py
similarity index 100%
rename from projects/public_dns/src/updater/__main__.py
rename to projects/public_dns/src/python/updater/__main__.py
diff --git a/projects/public_dns/test/test_parsing.py b/projects/public_dns/test/python/test_parsing.py
similarity index 100%
rename from projects/public_dns/test/test_parsing.py
rename to projects/public_dns/test/python/test_parsing.py
diff --git a/projects/ratchet/BUILD.bazel b/projects/ratchet/BUILD
similarity index 76%
rename from projects/ratchet/BUILD.bazel
rename to projects/ratchet/BUILD
index f2e5198..fe5d756 100644
--- a/projects/ratchet/BUILD.bazel
+++ b/projects/ratchet/BUILD
@@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"])
 
 py_library(
     name = "lib",
-    srcs = glob(["src/**/*.py"]),
+    srcs = glob(["src/python/**/*.py"]),
     imports = ["src/python"],
     deps = [
     ]
diff --git a/projects/ratchet/src/ratchet/__init__.py b/projects/ratchet/src/python/ratchet/__init__.py
similarity index 100%
rename from projects/ratchet/src/ratchet/__init__.py
rename to projects/ratchet/src/python/ratchet/__init__.py
diff --git a/projects/ratchet/src/ratchet/backend/sqlite.py b/projects/ratchet/src/python/ratchet/backend/sqlite.py
similarity index 100%
rename from projects/ratchet/src/ratchet/backend/sqlite.py
rename to projects/ratchet/src/python/ratchet/backend/sqlite.py
diff --git a/projects/reqman/BUILD.bazel b/projects/reqman/BUILD
similarity index 75%
rename from projects/reqman/BUILD.bazel
rename to projects/reqman/BUILD
index ef2d306..fc2cb8b 100644
--- a/projects/reqman/BUILD.bazel
+++ b/projects/reqman/BUILD
@@ -1,6 +1,6 @@
 zapp_binary(
     name = "reqman",
-    main = "src/reqman/__main__.py",
+    main = "src/python/reqman/__main__.py",
     imports = [
         "src/python",
     ],
diff --git a/projects/reqman/src/reqman/__main__.py b/projects/reqman/src/python/reqman/__main__.py
similarity index 100%
rename from projects/reqman/src/reqman/__main__.py
rename to projects/reqman/src/python/reqman/__main__.py
diff --git a/projects/shoggoth/BUILD.bazel b/projects/shoggoth/BUILD
similarity index 83%
rename from projects/shoggoth/BUILD.bazel
rename to projects/shoggoth/BUILD
index 3e46607..563d7bb 100644
--- a/projects/shoggoth/BUILD.bazel
+++ b/projects/shoggoth/BUILD
@@ -1,6 +1,6 @@
 py_project(
     name = "shoggoth",
-    main = "src/shoggoth/repl/__main__.py",
+    main = "src/python/shoggoth/repl/__main__.py",
     main_deps = [
         py_requirement("prompt_toolkit"),
         py_requirement("yaspin"),
@@ -17,7 +17,7 @@ py_project(
 
 zapp_binary(
     name ="ichor",
-    main = "src/ichor/__main__.py",
+    main = "src/python/ichor/__main__.py",
     shebang ="/usr/bin/env python3",
     deps = [
         ":lib",
diff --git a/projects/shoggoth/src/ichor/NOTES.md b/projects/shoggoth/src/python/ichor/NOTES.md
similarity index 100%
rename from projects/shoggoth/src/ichor/NOTES.md
rename to projects/shoggoth/src/python/ichor/NOTES.md
diff --git a/projects/lilith/src/lilith/__init__.py b/projects/shoggoth/src/python/ichor/__init__.py
similarity index 100%
rename from projects/lilith/src/lilith/__init__.py
rename to projects/shoggoth/src/python/ichor/__init__.py
diff --git a/projects/shoggoth/src/ichor/__main__.py b/projects/shoggoth/src/python/ichor/__main__.py
similarity index 100%
rename from projects/shoggoth/src/ichor/__main__.py
rename to projects/shoggoth/src/python/ichor/__main__.py
diff --git a/projects/shoggoth/src/ichor/assembler.py b/projects/shoggoth/src/python/ichor/assembler.py
similarity index 100%
rename from projects/shoggoth/src/ichor/assembler.py
rename to projects/shoggoth/src/python/ichor/assembler.py
diff --git a/projects/shoggoth/src/ichor/bootstrap.py b/projects/shoggoth/src/python/ichor/bootstrap.py
similarity index 100%
rename from projects/shoggoth/src/ichor/bootstrap.py
rename to projects/shoggoth/src/python/ichor/bootstrap.py
diff --git a/projects/shoggoth/src/ichor/interpreter.py b/projects/shoggoth/src/python/ichor/interpreter.py
similarity index 100%
rename from projects/shoggoth/src/ichor/interpreter.py
rename to projects/shoggoth/src/python/ichor/interpreter.py
diff --git a/projects/shoggoth/src/ichor/isa.py b/projects/shoggoth/src/python/ichor/isa.py
similarity index 100%
rename from projects/shoggoth/src/ichor/isa.py
rename to projects/shoggoth/src/python/ichor/isa.py
diff --git a/projects/shoggoth/src/ichor/state.py b/projects/shoggoth/src/python/ichor/state.py
similarity index 100%
rename from projects/shoggoth/src/ichor/state.py
rename to projects/shoggoth/src/python/ichor/state.py
diff --git a/projects/shoggoth/src/ichor/typing.py b/projects/shoggoth/src/python/ichor/typing.py
similarity index 100%
rename from projects/shoggoth/src/ichor/typing.py
rename to projects/shoggoth/src/python/ichor/typing.py
diff --git a/projects/shoggoth/src/shoggoth/analyzer.py b/projects/shoggoth/src/python/shoggoth/analyzer.py
similarity index 100%
rename from projects/shoggoth/src/shoggoth/analyzer.py
rename to projects/shoggoth/src/python/shoggoth/analyzer.py
diff --git a/projects/shoggoth/src/shoggoth/parser.py b/projects/shoggoth/src/python/shoggoth/parser.py
similarity index 100%
rename from projects/shoggoth/src/shoggoth/parser.py
rename to projects/shoggoth/src/python/shoggoth/parser.py
diff --git a/projects/shoggoth/src/shoggoth/reader.py b/projects/shoggoth/src/python/shoggoth/reader.py
similarity index 100%
rename from projects/shoggoth/src/shoggoth/reader.py
rename to projects/shoggoth/src/python/shoggoth/reader.py
diff --git a/projects/shoggoth/src/shoggoth/repl/__main__.py b/projects/shoggoth/src/python/shoggoth/repl/__main__.py
similarity index 100%
rename from projects/shoggoth/src/shoggoth/repl/__main__.py
rename to projects/shoggoth/src/python/shoggoth/repl/__main__.py
diff --git a/projects/shoggoth/src/shoggoth/types.py b/projects/shoggoth/src/python/shoggoth/types.py
similarity index 100%
rename from projects/shoggoth/src/shoggoth/types.py
rename to projects/shoggoth/src/python/shoggoth/types.py
diff --git a/projects/shoggoth/test/ichor/fixtures.py b/projects/shoggoth/test/python/ichor/fixtures.py
similarity index 100%
rename from projects/shoggoth/test/ichor/fixtures.py
rename to projects/shoggoth/test/python/ichor/fixtures.py
diff --git a/projects/shoggoth/test/ichor/test_assembler.py b/projects/shoggoth/test/python/ichor/test_assembler.py
similarity index 100%
rename from projects/shoggoth/test/ichor/test_assembler.py
rename to projects/shoggoth/test/python/ichor/test_assembler.py
diff --git a/projects/shoggoth/test/ichor/test_bootstrap.py b/projects/shoggoth/test/python/ichor/test_bootstrap.py
similarity index 100%
rename from projects/shoggoth/test/ichor/test_bootstrap.py
rename to projects/shoggoth/test/python/ichor/test_bootstrap.py
diff --git a/projects/shoggoth/test/ichor/test_interpreter.py b/projects/shoggoth/test/python/ichor/test_interpreter.py
similarity index 100%
rename from projects/shoggoth/test/ichor/test_interpreter.py
rename to projects/shoggoth/test/python/ichor/test_interpreter.py
diff --git a/projects/shoggoth/test/ichor/test_parsers.py b/projects/shoggoth/test/python/ichor/test_parsers.py
similarity index 100%
rename from projects/shoggoth/test/ichor/test_parsers.py
rename to projects/shoggoth/test/python/ichor/test_parsers.py
diff --git a/projects/shoggoth/test/ichor/test_state.py b/projects/shoggoth/test/python/ichor/test_state.py
similarity index 100%
rename from projects/shoggoth/test/ichor/test_state.py
rename to projects/shoggoth/test/python/ichor/test_state.py
diff --git a/projects/shoggoth/test/shogoth/test_parser.py b/projects/shoggoth/test/python/shogoth/test_parser.py
similarity index 100%
rename from projects/shoggoth/test/shogoth/test_parser.py
rename to projects/shoggoth/test/python/shogoth/test_parser.py
diff --git a/projects/smith/BUILD.bazel b/projects/smith/BUILD
similarity index 80%
rename from projects/smith/BUILD.bazel
rename to projects/smith/BUILD
index 8936098..f69a080 100644
--- a/projects/smith/BUILD.bazel
+++ b/projects/smith/BUILD
@@ -7,5 +7,5 @@ py_project(
     main_deps = [
         py_requirement("click"),
     ],
-    main = "src/smith/__main__.py",
+    main = "src/python/smith/__main__.py",
 )
diff --git a/projects/smith/src/smith/__main__.py b/projects/smith/src/python/smith/__main__.py
similarity index 100%
rename from projects/smith/src/smith/__main__.py
rename to projects/smith/src/python/smith/__main__.py
diff --git a/projects/templater/BUILD.bazel b/projects/templater/BUILD
similarity index 100%
rename from projects/templater/BUILD.bazel
rename to projects/templater/BUILD
diff --git a/projects/tentacles/BUILD.bazel b/projects/tentacles/BUILD
similarity index 80%
rename from projects/tentacles/BUILD.bazel
rename to projects/tentacles/BUILD
index 7ee4194..349c659 100644
--- a/projects/tentacles/BUILD.bazel
+++ b/projects/tentacles/BUILD
@@ -2,7 +2,7 @@ py_project(
     name = "tentacles",
     shebang = "/usr/bin/env python3",
     zip_safe = False,
-    main = "src/tentacles/__main__.py",
+    main = "src/python/tentacles/__main__.py",
     main_deps = [
         "//projects/anosql",
         "//projects/anosql-migrations",
@@ -15,6 +15,6 @@ py_project(
         py_requirement("cherrypy"),
     ],
     lib_data = [
-        "//projects/tentacles/src/tentacles/static/css",
+        "//projects/tentacles/src/python/tentacles/static/css",
     ],
 )
diff --git a/projects/tentacles/src/fastmail.py b/projects/tentacles/src/python/fastmail.py
similarity index 100%
rename from projects/tentacles/src/fastmail.py
rename to projects/tentacles/src/python/fastmail.py
diff --git a/projects/tentacles/src/gcode.py b/projects/tentacles/src/python/gcode.py
similarity index 100%
rename from projects/tentacles/src/gcode.py
rename to projects/tentacles/src/python/gcode.py
diff --git a/projects/shoggoth/src/ichor/__init__.py b/projects/tentacles/src/python/tentacles/__init__.py
similarity index 100%
rename from projects/shoggoth/src/ichor/__init__.py
rename to projects/tentacles/src/python/tentacles/__init__.py
diff --git a/projects/tentacles/src/tentacles/__main__.py b/projects/tentacles/src/python/tentacles/__main__.py
similarity index 100%
rename from projects/tentacles/src/tentacles/__main__.py
rename to projects/tentacles/src/python/tentacles/__main__.py
diff --git a/projects/tentacles/src/tentacles/blueprints/admin_ui.py b/projects/tentacles/src/python/tentacles/blueprints/admin_ui.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/admin_ui.py
rename to projects/tentacles/src/python/tentacles/blueprints/admin_ui.py
diff --git a/projects/tentacles/src/tentacles/blueprints/api.py b/projects/tentacles/src/python/tentacles/blueprints/api.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/api.py
rename to projects/tentacles/src/python/tentacles/blueprints/api.py
diff --git a/projects/tentacles/src/tentacles/blueprints/file_ui.py b/projects/tentacles/src/python/tentacles/blueprints/file_ui.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/file_ui.py
rename to projects/tentacles/src/python/tentacles/blueprints/file_ui.py
diff --git a/projects/tentacles/src/tentacles/blueprints/job_ui.py b/projects/tentacles/src/python/tentacles/blueprints/job_ui.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/job_ui.py
rename to projects/tentacles/src/python/tentacles/blueprints/job_ui.py
diff --git a/projects/tentacles/src/tentacles/blueprints/user_ui.py b/projects/tentacles/src/python/tentacles/blueprints/user_ui.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/user_ui.py
rename to projects/tentacles/src/python/tentacles/blueprints/user_ui.py
diff --git a/projects/tentacles/src/tentacles/blueprints/util.py b/projects/tentacles/src/python/tentacles/blueprints/util.py
similarity index 100%
rename from projects/tentacles/src/tentacles/blueprints/util.py
rename to projects/tentacles/src/python/tentacles/blueprints/util.py
diff --git a/projects/tentacles/src/tentacles/db.py b/projects/tentacles/src/python/tentacles/db.py
similarity index 100%
rename from projects/tentacles/src/tentacles/db.py
rename to projects/tentacles/src/python/tentacles/db.py
diff --git a/projects/tentacles/src/tentacles/globals.py b/projects/tentacles/src/python/tentacles/globals.py
similarity index 100%
rename from projects/tentacles/src/tentacles/globals.py
rename to projects/tentacles/src/python/tentacles/globals.py
diff --git a/projects/tentacles/src/tentacles/sql/__init__.py b/projects/tentacles/src/python/tentacles/sql/__init__.py
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/__init__.py
rename to projects/tentacles/src/python/tentacles/sql/__init__.py
diff --git a/projects/tentacles/src/tentacles/sql/emails.sql b/projects/tentacles/src/python/tentacles/sql/emails.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/emails.sql
rename to projects/tentacles/src/python/tentacles/sql/emails.sql
diff --git a/projects/tentacles/src/tentacles/sql/files.sql b/projects/tentacles/src/python/tentacles/sql/files.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/files.sql
rename to projects/tentacles/src/python/tentacles/sql/files.sql
diff --git a/projects/tentacles/src/tentacles/sql/jobs.sql b/projects/tentacles/src/python/tentacles/sql/jobs.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/jobs.sql
rename to projects/tentacles/src/python/tentacles/sql/jobs.sql
diff --git a/projects/tentacles/src/tentacles/sql/migrations.sql b/projects/tentacles/src/python/tentacles/sql/migrations.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/migrations.sql
rename to projects/tentacles/src/python/tentacles/sql/migrations.sql
diff --git a/projects/tentacles/src/tentacles/sql/printers.sql b/projects/tentacles/src/python/tentacles/sql/printers.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/printers.sql
rename to projects/tentacles/src/python/tentacles/sql/printers.sql
diff --git a/projects/tentacles/src/tentacles/sql/user_keys.sql b/projects/tentacles/src/python/tentacles/sql/user_keys.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/user_keys.sql
rename to projects/tentacles/src/python/tentacles/sql/user_keys.sql
diff --git a/projects/tentacles/src/tentacles/sql/user_statuses.sql b/projects/tentacles/src/python/tentacles/sql/user_statuses.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/user_statuses.sql
rename to projects/tentacles/src/python/tentacles/sql/user_statuses.sql
diff --git a/projects/tentacles/src/tentacles/sql/users.sql b/projects/tentacles/src/python/tentacles/sql/users.sql
similarity index 100%
rename from projects/tentacles/src/tentacles/sql/users.sql
rename to projects/tentacles/src/python/tentacles/sql/users.sql
diff --git a/projects/tentacles/src/tentacles/static/__init__.py b/projects/tentacles/src/python/tentacles/static/__init__.py
similarity index 100%
rename from projects/tentacles/src/tentacles/static/__init__.py
rename to projects/tentacles/src/python/tentacles/static/__init__.py
diff --git a/projects/tentacles/src/tentacles/static/cancel.svg b/projects/tentacles/src/python/tentacles/static/cancel.svg
similarity index 100%
rename from projects/tentacles/src/tentacles/static/cancel.svg
rename to projects/tentacles/src/python/tentacles/static/cancel.svg
diff --git a/projects/tentacles/src/tentacles/static/css/BUILD.bazel b/projects/tentacles/src/python/tentacles/static/css/BUILD
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/BUILD.bazel
rename to projects/tentacles/src/python/tentacles/static/css/BUILD
diff --git a/projects/tentacles/src/tentacles/static/css/_normalize.scss b/projects/tentacles/src/python/tentacles/static/css/_normalize.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/_normalize.scss
rename to projects/tentacles/src/python/tentacles/static/css/_normalize.scss
diff --git a/projects/tentacles/src/tentacles/static/css/_skeleton.scss b/projects/tentacles/src/python/tentacles/static/css/_skeleton.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/_skeleton.scss
rename to projects/tentacles/src/python/tentacles/static/css/_skeleton.scss
diff --git a/projects/tentacles/src/tentacles/static/css/_tirefire.scss b/projects/tentacles/src/python/tentacles/static/css/_tirefire.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/_tirefire.scss
rename to projects/tentacles/src/python/tentacles/static/css/_tirefire.scss
diff --git a/projects/tentacles/src/tentacles/static/css/style.scss b/projects/tentacles/src/python/tentacles/static/css/style.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/style.scss
rename to projects/tentacles/src/python/tentacles/static/css/style.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_alerts.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_alerts.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_alerts.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_alerts.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_basics.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_basics.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_basics.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_basics.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_colors.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_colors.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_colors.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_colors.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_dots.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_dots.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_dots.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_dots.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_fonts.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_fonts.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_fonts.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_fonts.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_nav.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_nav.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_nav.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_nav.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_timers.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_timers.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_timers.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_timers.scss
diff --git a/projects/tentacles/src/tentacles/static/css/tirefire/_tooltips.scss b/projects/tentacles/src/python/tentacles/static/css/tirefire/_tooltips.scss
similarity index 100%
rename from projects/tentacles/src/tentacles/static/css/tirefire/_tooltips.scss
rename to projects/tentacles/src/python/tentacles/static/css/tirefire/_tooltips.scss
diff --git a/projects/tentacles/src/tentacles/static/delete.svg b/projects/tentacles/src/python/tentacles/static/delete.svg
similarity index 100%
rename from projects/tentacles/src/tentacles/static/delete.svg
rename to projects/tentacles/src/python/tentacles/static/delete.svg
diff --git a/projects/tentacles/src/tentacles/static/download.svg b/projects/tentacles/src/python/tentacles/static/download.svg
similarity index 100%
rename from projects/tentacles/src/tentacles/static/download.svg
rename to projects/tentacles/src/python/tentacles/static/download.svg
diff --git a/projects/tentacles/src/tentacles/static/font/AauxNextBlk.otf b/projects/tentacles/src/python/tentacles/static/font/AauxNextBlk.otf
similarity index 100%
rename from projects/tentacles/src/tentacles/static/font/AauxNextBlk.otf
rename to projects/tentacles/src/python/tentacles/static/font/AauxNextBlk.otf
diff --git a/projects/tentacles/src/tentacles/static/font/aauxnextbdwebfont.otf b/projects/tentacles/src/python/tentacles/static/font/aauxnextbdwebfont.otf
similarity index 100%
rename from projects/tentacles/src/tentacles/static/font/aauxnextbdwebfont.otf
rename to projects/tentacles/src/python/tentacles/static/font/aauxnextbdwebfont.otf
diff --git a/projects/tentacles/src/tentacles/static/font/aauxnextltwebfont.otf b/projects/tentacles/src/python/tentacles/static/font/aauxnextltwebfont.otf
similarity index 100%
rename from projects/tentacles/src/tentacles/static/font/aauxnextltwebfont.otf
rename to projects/tentacles/src/python/tentacles/static/font/aauxnextltwebfont.otf
diff --git a/projects/tentacles/src/tentacles/static/font/aauxnextmdwebfont.otf b/projects/tentacles/src/python/tentacles/static/font/aauxnextmdwebfont.otf
similarity index 100%
rename from projects/tentacles/src/tentacles/static/font/aauxnextmdwebfont.otf
rename to projects/tentacles/src/python/tentacles/static/font/aauxnextmdwebfont.otf
diff --git a/projects/tentacles/src/tentacles/static/print.svg b/projects/tentacles/src/python/tentacles/static/print.svg
similarity index 100%
rename from projects/tentacles/src/tentacles/static/print.svg
rename to projects/tentacles/src/python/tentacles/static/print.svg
diff --git a/projects/tentacles/src/tentacles/static/tentacles.svg b/projects/tentacles/src/python/tentacles/static/tentacles.svg
similarity index 100%
rename from projects/tentacles/src/tentacles/static/tentacles.svg
rename to projects/tentacles/src/python/tentacles/static/tentacles.svg
diff --git a/projects/tentacles/src/tentacles/templates/__init__.py b/projects/tentacles/src/python/tentacles/templates/__init__.py
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/__init__.py
rename to projects/tentacles/src/python/tentacles/templates/__init__.py
diff --git a/projects/tentacles/src/tentacles/templates/add_printer.html.j2 b/projects/tentacles/src/python/tentacles/templates/add_printer.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/add_printer.html.j2
rename to projects/tentacles/src/python/tentacles/templates/add_printer.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/admin.html.j2 b/projects/tentacles/src/python/tentacles/templates/admin.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/admin.html.j2
rename to projects/tentacles/src/python/tentacles/templates/admin.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/analysis_failure_email.html.j2 b/projects/tentacles/src/python/tentacles/templates/analysis_failure_email.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/analysis_failure_email.html.j2
rename to projects/tentacles/src/python/tentacles/templates/analysis_failure_email.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/approval_email.html.j2 b/projects/tentacles/src/python/tentacles/templates/approval_email.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/approval_email.html.j2
rename to projects/tentacles/src/python/tentacles/templates/approval_email.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/base.html.j2 b/projects/tentacles/src/python/tentacles/templates/base.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/base.html.j2
rename to projects/tentacles/src/python/tentacles/templates/base.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/edit_printer.html.j2 b/projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/edit_printer.html.j2
rename to projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/files.html.j2 b/projects/tentacles/src/python/tentacles/templates/files.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/files.html.j2
rename to projects/tentacles/src/python/tentacles/templates/files.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/files_admin_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/files_admin_list.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/files_admin_list.html.j2
rename to projects/tentacles/src/python/tentacles/templates/files_admin_list.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/files_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/files_list.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/files_list.html.j2
rename to projects/tentacles/src/python/tentacles/templates/files_list.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/index.html.j2 b/projects/tentacles/src/python/tentacles/templates/index.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/index.html.j2
rename to projects/tentacles/src/python/tentacles/templates/index.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/jobs.html.j2 b/projects/tentacles/src/python/tentacles/templates/jobs.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/jobs.html.j2
rename to projects/tentacles/src/python/tentacles/templates/jobs.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/jobs_history.html.j2 b/projects/tentacles/src/python/tentacles/templates/jobs_history.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/jobs_history.html.j2
rename to projects/tentacles/src/python/tentacles/templates/jobs_history.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/jobs_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/jobs_list.html.j2
rename to projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/login.html.j2 b/projects/tentacles/src/python/tentacles/templates/login.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/login.html.j2
rename to projects/tentacles/src/python/tentacles/templates/login.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/macros.html.j2 b/projects/tentacles/src/python/tentacles/templates/macros.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/macros.html.j2
rename to projects/tentacles/src/python/tentacles/templates/macros.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/printers.html.j2 b/projects/tentacles/src/python/tentacles/templates/printers.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/printers.html.j2
rename to projects/tentacles/src/python/tentacles/templates/printers.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/printers_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/printers_list.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/printers_list.html.j2
rename to projects/tentacles/src/python/tentacles/templates/printers_list.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/register.html.j2 b/projects/tentacles/src/python/tentacles/templates/register.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/register.html.j2
rename to projects/tentacles/src/python/tentacles/templates/register.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/streams.html.j2 b/projects/tentacles/src/python/tentacles/templates/streams.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/streams.html.j2
rename to projects/tentacles/src/python/tentacles/templates/streams.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/user.html.j2 b/projects/tentacles/src/python/tentacles/templates/user.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/user.html.j2
rename to projects/tentacles/src/python/tentacles/templates/user.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/users_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/users_list.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/users_list.html.j2
rename to projects/tentacles/src/python/tentacles/templates/users_list.html.j2
diff --git a/projects/tentacles/src/tentacles/templates/verification_email.html.j2 b/projects/tentacles/src/python/tentacles/templates/verification_email.html.j2
similarity index 100%
rename from projects/tentacles/src/tentacles/templates/verification_email.html.j2
rename to projects/tentacles/src/python/tentacles/templates/verification_email.html.j2
diff --git a/projects/tentacles/src/tentacles/workers.py b/projects/tentacles/src/python/tentacles/workers.py
similarity index 100%
rename from projects/tentacles/src/tentacles/workers.py
rename to projects/tentacles/src/python/tentacles/workers.py
diff --git a/projects/tentacles/src/tentacles/__init__.py b/projects/tentacles/src/tentacles/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/projects/tentacles/test/conftest.py b/projects/tentacles/test/python/conftest.py
similarity index 100%
rename from projects/tentacles/test/conftest.py
rename to projects/tentacles/test/python/conftest.py
diff --git a/projects/tentacles/test/test_gcode.py b/projects/tentacles/test/python/test_gcode.py
similarity index 100%
rename from projects/tentacles/test/test_gcode.py
rename to projects/tentacles/test/python/test_gcode.py
diff --git a/projects/tentacles/test/test_store.py b/projects/tentacles/test/python/test_store.py
similarity index 100%
rename from projects/tentacles/test/test_store.py
rename to projects/tentacles/test/python/test_store.py
diff --git a/projects/tentacles/test/test_store_users.py b/projects/tentacles/test/python/test_store_users.py
similarity index 100%
rename from projects/tentacles/test/test_store_users.py
rename to projects/tentacles/test/python/test_store_users.py
diff --git a/projects/vfs/BUILD.bazel b/projects/vfs/BUILD
similarity index 100%
rename from projects/vfs/BUILD.bazel
rename to projects/vfs/BUILD
diff --git a/projects/vfs/src/vfs/__init__.py b/projects/vfs/src/python/vfs/__init__.py
similarity index 100%
rename from projects/vfs/src/vfs/__init__.py
rename to projects/vfs/src/python/vfs/__init__.py
diff --git a/projects/vfs/src/vfs/impl.py b/projects/vfs/src/python/vfs/impl.py
similarity index 100%
rename from projects/vfs/src/vfs/impl.py
rename to projects/vfs/src/python/vfs/impl.py
diff --git a/projects/yamlschema/BUILD.bazel b/projects/yamlschema/BUILD
similarity index 100%
rename from projects/yamlschema/BUILD.bazel
rename to projects/yamlschema/BUILD
diff --git a/projects/yamlschema/src/yamlschema/__init__.py b/projects/yamlschema/src/python/yamlschema/__init__.py
similarity index 100%
rename from projects/yamlschema/src/yamlschema/__init__.py
rename to projects/yamlschema/src/python/yamlschema/__init__.py
diff --git a/projects/yamlschema/test/test_yamlschema.py b/projects/yamlschema/test/python/test_yamlschema.py
similarity index 100%
rename from projects/yamlschema/test/test_yamlschema.py
rename to projects/yamlschema/test/python/test_yamlschema.py
diff --git a/tools/autoflake/BUILD.bazel b/tools/autoflake/BUILD
similarity index 100%
rename from tools/autoflake/BUILD.bazel
rename to tools/autoflake/BUILD
diff --git a/tools/black/BUILD.bazel b/tools/black/BUILD
similarity index 100%
rename from tools/black/BUILD.bazel
rename to tools/black/BUILD
diff --git a/tools/build_rules/BUILD.bazel b/tools/build_rules/BUILD
similarity index 100%
rename from tools/build_rules/BUILD.bazel
rename to tools/build_rules/BUILD
diff --git a/tools/build_rules/prelude_bazel b/tools/build_rules/prelude_bazel
index 2b615ad..97565b3 100644
--- a/tools/build_rules/prelude_bazel
+++ b/tools/build_rules/prelude_bazel
@@ -36,3 +36,10 @@ load("//tools/build_rules:webp.bzl",
 load("@rules_zapp//zapp:zapp.bzl",
      "zapp_binary",
 )
+
+load(
+    "@io_bazel_rules_docker//container:container.bzl",
+    "container_image",
+    "container_bundle",
+    "container_push",
+)
diff --git a/tools/flake8/BUILD.bazel b/tools/flake8/BUILD
similarity index 100%
rename from tools/flake8/BUILD.bazel
rename to tools/flake8/BUILD
diff --git a/tools/isort/BUILD.bazel b/tools/isort/BUILD
similarity index 100%
rename from tools/isort/BUILD.bazel
rename to tools/isort/BUILD
diff --git a/tools/openapi/BUILD.bazel b/tools/openapi/BUILD
similarity index 100%
rename from tools/openapi/BUILD.bazel
rename to tools/openapi/BUILD
diff --git a/tools/python/BUILD.bazel b/tools/python/BUILD
similarity index 94%
rename from tools/python/BUILD.bazel
rename to tools/python/BUILD
index 860a229..181f52e 100644
--- a/tools/python/BUILD.bazel
+++ b/tools/python/BUILD
@@ -40,5 +40,8 @@ py_pytest(
     srcs = [
         "test_licenses.py",
     ],
+    data = [
+        "requirements.txt",
+    ],
     deps = all_requirements,
 )
diff --git a/tools/python/defs.bzl b/tools/python/defs.bzl
index a375abf..4e750bd 100644
--- a/tools/python/defs.bzl
+++ b/tools/python/defs.bzl
@@ -170,7 +170,7 @@ def py_project(name=None,
     """
     A helper for defining conventionally-formatted python project.
 
-    Assumes that there's a {src,test}/ where src/ is a library and test/ is local tests only.
+    Assumes that there's a {src,test}/{resources,python} where src/ is a library and test/ is local tests only.
 
     Each test_*.py source generates its own implicit test target. This allows for automatic test parallelism. Non
     test_*.py files are implicitly srcs for the generated test targets. This is the same as making them implicitly a
@@ -179,26 +179,28 @@ def py_project(name=None,
     """
 
     lib_srcs = (lib_srcs or []) + \
-        native.glob(["src/**/*.py"],
+        native.glob(["src/python/**/*.py"],
                     exclude=[
                         "**/*.pyc",
                     ])
 
     lib_data = (lib_data or []) + \
-        native.glob(["src/**/*"],
+        native.glob(["src/resources/**/*",
+                     "src/python/**/*"],
                     exclude=[
                         "**/*.py",
                         "**/*.pyc",
                     ])
 
     test_srcs = (test_srcs or []) + \
-        native.glob(["test/**/*.py"],
+        native.glob(["test/python/**/*.py"],
                     exclude=[
                         "**/*.pyc",
                     ])
 
     test_data = (test_data or []) + \
-        native.glob(["test/**/*"],
+        native.glob(["test/resources/**/*",
+                     "test/python/**/*"],
                     exclude=[
                         "**/*.py",
                         "**/*.pyc",
@@ -212,7 +214,8 @@ def py_project(name=None,
         deps=lib_deps,
         data=lib_data,
         imports=[
-            "src",
+            "src/python",
+            "src/resources",
         ],
         visibility = [
             "//visibility:public",
@@ -226,7 +229,8 @@ def py_project(name=None,
             deps=(main_deps or []) + [lib_name],
             data=(main_data or []),
             imports=[
-                "src",
+                "src/python",
+                "src/resources",
             ],
             visibility = [
                 "//visibility:public",
@@ -239,7 +243,8 @@ def py_project(name=None,
             deps=(main_deps or []) + [lib_name],
             data=lib_data,
             imports=[
-                "src",
+                "src/python",
+                "src/resources",
             ],
             visibility = [
                 "//visibility:public",
@@ -251,7 +256,7 @@ def py_project(name=None,
     for src in test_srcs:
         if "test_" in src:
             py_pytest(
-                name=src.split("/")[-1].replace(".py", ""),
+                name=src.split("/")[-1],
                 srcs=[src] + [f for f in test_srcs if "test_" not in f],
                 deps=[lib_name] + (test_deps or []),
                 data=test_data,
diff --git a/tools/python/requirements_lock.txt b/tools/python/requirements_lock.txt
index 3e0862b..912d645 100644
--- a/tools/python/requirements_lock.txt
+++ b/tools/python/requirements_lock.txt
@@ -1,63 +1,62 @@
-aiohttp==3.9.3
+aiohttp==3.8.5
 aiohttp-basicauth==1.0.0
 aiosignal==1.3.1
-aiosql==9.4
+aiosql==9.0
 alabaster==0.7.13
 annotated-types==0.5.0
 async-lru==2.0.4
 async-timeout==4.0.2
-attrs==23.2.0
+attrs==23.1.0
 autocommand==2.2.2
-autoflake==2.2.1
+autoflake==2.2.0
 Babel==2.12.1
-beautifulsoup4==4.12.3
-black==24.1.1
+beautifulsoup4==4.12.2
+black==23.7.0
 blinker==1.6.2
 build==0.10.0
-cachetools==5.3.2
+cachetools==5.3.1
 certifi==2023.7.22
 charset-normalizer==3.2.0
 cheroot==10.0.0
 CherryPy==18.8.0
-click==8.1.7
-colored==2.2.4
+click==8.1.6
+colored==2.2.3
 commonmark==0.9.1
 coverage==7.2.7
 decorator==5.1.1
 deepmerge==1.1.0
 docutils==0.20.1
 ExifRead==3.0.0
-flake8==7.0.0
-Flask==3.0.2
+flake8==6.0.0
+Flask==2.3.2
 frozenlist==1.4.0
-hypothesis==6.98.2
-ibis==3.3.0
-icmplib==3.0.4
+hypothesis==6.82.0
+ibis==3.2.0
+icmplib==3.0.3
 idna==3.4
 imagesize==1.4.1
 inflect==7.0.0
 iniconfig==2.0.0
-isort==5.13.2
+isort==5.12.0
 itsdangerous==2.1.2
 jaraco.collections==4.3.0
 jaraco.context==4.3.0
 jaraco.functools==3.8.0
 jaraco.text @ git+https://github.com/arrdem/jaraco.text.git@0dd8d0b25a93c3fad896f3a92d11caff61ff273d
 jedi==0.18.2
-Jinja2==3.1.3
+Jinja2==3.1.2
 jsonschema==4.18.4
-jsonschema-path==0.3.2
 jsonschema-spec==0.2.3
 jsonschema-specifications==2023.7.1
-lark==1.1.9
+lark==1.1.7
 lazy-object-proxy==1.9.0
-libsass==0.23.0
+libsass==0.22.0
 livereload==2.6.3
-lxml==5.1.0
-Markdown==3.5.2
+lxml==4.9.3
+Markdown==3.4.4
 MarkupSafe==2.1.3
 mccabe==0.7.0
-meraki==1.42.0
+meraki==1.34.0
 mirakuru==2.5.1
 mistune==2.0.5
 more-itertools==10.0.0
@@ -65,43 +64,43 @@ multidict==6.0.4
 mypy-extensions==1.0.0
 octorest==0.4
 openapi-schema-validator==0.6.0
-openapi-spec-validator==0.7.1
+openapi-spec-validator==0.6.0
 packaging==23.1
 parso==0.8.3
 pathable==0.4.3
 pathspec==0.11.1
 picobox==3.0.0
 pip==23.1.2
-pip-tools==7.3.0
+pip-tools==7.1.0
 platformdirs==3.9.1
 pluggy==1.2.0
 port-for==0.7.1
 portend==3.2.0
-prompt-toolkit==3.0.43
+prompt-toolkit==3.0.39
 proquint==0.2.1
 psutil==5.9.5
 psycopg==3.1.9
-psycopg2==2.9.9
+psycopg2==2.9.6
 pudb==2022.1.3
 py==1.11.0
-pycodestyle==2.11.1
-pycryptodome==3.20.0
+pycodestyle==2.10.0
+pycryptodome==3.18.0
 pydantic==2.1.1
 pydantic_core==2.4.0
-pyflakes==3.2.0
+pyflakes==3.0.1
 Pygments==2.15.1
 pyproject_hooks==1.0.0
-pyrsistent==0.20.0
+pyrsistent==0.19.3
 pytest==7.4.0
 pytest-cov==4.1.0
-pytest-postgresql==5.1.0
+pytest-postgresql==5.0.0
 pytest-pudb==0.7.0
-pytest-timeout==2.2.0
+pytest-timeout==2.1.0
 pytimeparse==1.1.8
 pytz==2023.3
 PyYAML==6.0.1
 recommonmark==0.7.1
-redis==5.0.1
+redis==4.6.0
 referencing==0.29.3
 requests==2.31.0
 retry==0.9.2
@@ -109,21 +108,21 @@ rfc3339-validator==0.1.4
 rpds-py==0.9.2
 setuptools==68.0.0
 six==1.16.0
-smbus2==0.4.3
+smbus2==0.4.2
 snowballstemmer==2.2.0
 sortedcontainers==2.4.0
 soupsieve==2.4.1
-Sphinx==7.2.6
+Sphinx==7.1.1
 sphinx_mdinclude==0.5.3
 sphinxcontrib-applehelp==1.0.4
 sphinxcontrib-devhelp==1.0.2
 sphinxcontrib-htmlhelp==2.0.1
 sphinxcontrib-httpdomain==1.8.1
 sphinxcontrib-jsmath==1.0.1
-sphinxcontrib-openapi==0.8.3
+sphinxcontrib-openapi==0.8.1
 sphinxcontrib-programoutput==0.17
 sphinxcontrib-qthelp==1.0.3
-sphinxcontrib-serializinghtml==1.1.10
+sphinxcontrib-serializinghtml==1.1.5
 tempora==5.5.0
 termcolor==2.3.0
 toml==0.10.2
@@ -136,9 +135,9 @@ urwid==2.1.2
 urwid-readline==0.13
 wcwidth==0.2.6
 websocket-client==1.6.1
-Werkzeug==3.0.1
+Werkzeug==2.3.6
 wheel==0.40.0
-yamllint==1.34.0
+yamllint==1.32.0
 yarl==1.9.2
-yaspin==3.0.1
+yaspin==2.3.0
 zc.lockfile==3.0.post1
diff --git a/tools/python/test_licenses.py b/tools/python/test_licenses.py
index 32e9515..32e7246 100644
--- a/tools/python/test_licenses.py
+++ b/tools/python/test_licenses.py
@@ -22,11 +22,8 @@ APPROVED_LICENSES = [
     MPL20 := "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
     PSFL := "License :: OSI Approved :: Python Software Foundation License",
     LGPL := "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
-    LGPL3 := 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)',
-    LGPL3P := "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
+    LGPL3 := "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
     ISCL := "License :: OSI Approved :: ISC License (ISCL)",
-    ZOPE := 'License :: OSI Approved :: Zope Public License',
-    PUBLIC := 'License :: Public Domain',
 ]
 
 UNAPPROVED_LICENSES = [
@@ -38,7 +35,6 @@ UNAPPROVED_LICENSES = [
 # This data is GARBO.
 LICENSES_BY_LOWERNAME = {
     "apache 2.0": APACHE,
-    "apache 2": APACHE,
     "apache": APACHE,
     "http://www.apache.org/licenses/license-2.0": APACHE,
     "bsd 3": BSD,
@@ -65,8 +61,6 @@ APPROVED_PACKAGES = [
     "yamllint",  # WARNING: YAMLLINT IS GLP3"d.
     "Flask_Log_Request_ID",  # MIT, currently depended on as a git dep.
     "anosql",  # BSD
-    "pathable", # Apache 2
-    "proquint", # MIT
 ]
 
 
@@ -132,7 +126,7 @@ def licenses(dist: DistInfoDistribution):
     if not lics:
         lics.append(license)
 
-    return [l.strip() for l in lics]
+    return lics
 
 
 @pytest.mark.parametrize(
diff --git a/tools/sass/BUILD.bazel b/tools/sass/BUILD
similarity index 100%
rename from tools/sass/BUILD.bazel
rename to tools/sass/BUILD
diff --git a/tools/sphinx/BUILD.bazel b/tools/sphinx/BUILD
similarity index 100%
rename from tools/sphinx/BUILD.bazel
rename to tools/sphinx/BUILD
diff --git a/tools/unify/BUILD.bazel b/tools/unify/BUILD
similarity index 100%
rename from tools/unify/BUILD.bazel
rename to tools/unify/BUILD
diff --git a/tools/xfmt/BUILD.bazel b/tools/xfmt/BUILD
similarity index 100%
rename from tools/xfmt/BUILD.bazel
rename to tools/xfmt/BUILD
diff --git a/tools/yamllint/BUILD.bazel b/tools/yamllint/BUILD
similarity index 100%
rename from tools/yamllint/BUILD.bazel
rename to tools/yamllint/BUILD