diff --git a/backend/templates/app_layout.templ b/backend/templates/app_layout.templ
new file mode 100644
index 0000000..1205d8b
--- /dev/null
+++ b/backend/templates/app_layout.templ
@@ -0,0 +1,174 @@
+package templates
+
+import (
+ "backend/internal/auth"
+ "backend/internal/db/sqlc"
+ "backend/internal/web/ui"
+)
+
+// SidebarNavIcon renders the SVG icon for the given sidebar icon kind.
+// SVG paths ported verbatim from go-backend/internal/web/views/icons.templ SidebarIcon.
+templ SidebarNavIcon(kind string) {
+ switch kind {
+ case "panels":
+
+ case "tasks":
+
+ case "layers":
+
+ case "planning":
+
+ case "chat":
+
+ case "files":
+
+ default:
+
+ }
+}
+
+// SidebarNavItemRow renders one nav list item.
+// If item.Href is empty, renders as a non-interactive div (visual-only, per D-N02).
+// If item.Href is non-empty, renders as an anchor tag.
+templ SidebarNavItemRow(item sidebarNavItem) {
+ if item.Href == "" {
+
+}
+
+// SidebarOrganizationFooter renders the user/org info at the bottom of the sidebar.
+// Per D-F01/D-F02/D-F03: shows user email initial as avatar, email as name, and logout form.
+templ SidebarOrganizationFooter(user *auth.User, csrfToken string) {
+