diff --git a/.gitea/ISSUE_TEMPLATE/bug_report.md b/.gitea/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..b483bd5
--- /dev/null
+++ b/.gitea/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,31 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ""
+labels: ""
+assignees: ""
+---
+
+**Desktop (please complete the following information):**
+
+- OS: [e.g. iOS]
+- Browser [e.g. chrome, safari]
+- Version [e.g. 22]
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+
+1. Something
+2. ...
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.gitea/ISSUE_TEMPLATE/feature_request.md b/.gitea/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..328180c
--- /dev/null
+++ b/.gitea/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,23 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ""
+labels: ""
+assignees: ""
+---
+
+Relates to:
+
+- TODO
+
+## Context
+
+TODO
+
+## Implementation
+
+TODO
+
+## Additional resources
+
+TODO
diff --git a/.gitea/pull_request_template.md b/.gitea/pull_request_template.md
new file mode 100644
index 0000000..900c085
--- /dev/null
+++ b/.gitea/pull_request_template.md
@@ -0,0 +1,18 @@
+resolves TODO
+
+## Context
+
+TODO
+
+## Implementation
+
+TODO
+
+## Screenshots
+
+TODO
+
+## Testing Instructions
+
+1. Build engine via `bin/dev build && cd build/ && make -j4`
+2. Run testbed via `./testbed`
diff --git a/.gitignore b/.gitignore
index aa505e8..02d09c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,7 +24,6 @@ CMakeUserPresets.json
*.bin
*.out
*.spv
-*.spv.h
# Runtime data
pids
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9fc89bf..43db259 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -41,8 +41,8 @@
"LD_LIBRARY_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib/VulkanLoader/lib:/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib",
"VK_ADD_LAYER_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/share/vulkan/explicit_layer.d"
},
- "cmake.buildDirectory": "${workspaceFolder}/build",
- "cmake.generator": "Ninja",
+ "cmake.useCMakePresets": "always",
+ "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json",
"cmake.configureOnOpen": true,
"files.associations": {
".clang-format": "yaml",
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..cc57b33
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,17 @@
+# Sophia
+
+## Dev helper (`bin/dev`)
+
+`bin/dev` wraps common project tasks. Run `bin/dev bash-completions` to list commands.
+
+### Creating issues
+
+Use `bin/dev issue` to create Gitea issues instead of calling the API or `tea` directly:
+
+```sh
+bin/dev issue "
" [-b ""] [-l