diff --git a/src/site/html/static/js/templates/.gitrepo b/src/site/html/static/js/templates/.gitrepo
new file mode 100644
index 0000000..47d5079
--- /dev/null
+++ b/src/site/html/static/js/templates/.gitrepo
@@ -0,0 +1,12 @@
+; DO NOT EDIT (unless you know what you are doing)
+;
+; This subdirectory is a git "subrepo", and this file is maintained by the
+; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
+;
+[subrepo]
+ remote = /home/cloud/Code/pinski-plugins/templates
+ branch = master
+ commit = a768add65e7eb7cfd608ef5672342940b2232b4c
+ parent = e684a04b0313ed5a511a9e3cc50269ebc2b64691
+ method = merge
+ cmdver = 0.4.0
diff --git a/src/site/html/static/js/templates/api/templates.js b/src/site/html/static/js/templates/api/templates.js
new file mode 100644
index 0000000..f8df2d4
--- /dev/null
+++ b/src/site/html/static/js/templates/api/templates.js
@@ -0,0 +1,18 @@
+const passthrough = require("../../../../../passthrough")
+
+module.exports = [
+ {
+ route: "/api/templates", methods: ["GET"], code: async () => {
+ const result = {}
+ const entries = passthrough.instance.pugCache.entries()
+ for (const [file, value] of entries) {
+ const match = file.match(/client\/.*?([^/]+)\.pug$/)
+ if (match) {
+ const name = match[1]
+ result[name] = value.client.toString()
+ }
+ }
+ return [200, result]
+ }
+ }
+]
diff --git a/src/site/html/static/js/templates/templates.js b/src/site/html/static/js/templates/templates.js
new file mode 100644
index 0000000..4194aad
--- /dev/null
+++ b/src/site/html/static/js/templates/templates.js
@@ -0,0 +1,14 @@
+import {AsyncValueCache} from "../avc/avc.js"
+
+const tc = new AsyncValueCache(true, () => {
+ return fetch("/api/templates").then(res => res.json()).then(data => {
+ Object.keys(data).forEach(key => {
+ let fn = Function(data[key] + "; return template")()
+ data[key] = fn
+ })
+ console.log(`Loaded ${Object.keys(data).length} templates`)
+ return data
+ })
+})
+
+export {tc}