From 3c46f117e22fbd0932e11c44637ad33a85e6cbaf Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Sat, 7 Feb 2026 14:06:49 +0000
Subject: [PATCH 1/3] add product/templates page and update header links
Co-Authored-By: harshika@hyprnote.com
---
apps/web/src/components/header.tsx | 4 +-
.../src/routes/_view/product/templates.tsx | 238 ++++++++++++++++++
2 files changed, 240 insertions(+), 2 deletions(-)
create mode 100644 apps/web/src/routes/_view/product/templates.tsx
diff --git a/apps/web/src/components/header.tsx b/apps/web/src/components/header.tsx
index f4baa6e2f2..92796c776d 100644
--- a/apps/web/src/components/header.tsx
+++ b/apps/web/src/components/header.tsx
@@ -32,7 +32,7 @@ function getMaxWidthClass(pathname: string): string {
const featuresList = [
{ to: "/product/ai-notetaking", label: "AI Notetaking" },
{ to: "/product/search", label: "Searchable Notes" },
- { to: "/gallery/templates", label: "Custom Templates" },
+ { to: "/product/templates", label: "Custom Templates" },
{ to: "/product/markdown", label: "Markdown Files" },
{ to: "/product/flexible-ai", label: "Flexible AI" },
{ to: "/opensource", label: "Open Source" },
@@ -46,7 +46,7 @@ const solutionsList = [
const resourcesList = [
{ to: "/blog/", label: "Blog" },
- { to: "/gallery/templates", label: "Meeting Templates" },
+ { to: "/product/templates", label: "Meeting Templates" },
{ to: "/changelog/", label: "Changelog" },
{ to: "/roadmap/", label: "Roadmap" },
{ to: "/company-handbook/", label: "Company Handbook" },
diff --git a/apps/web/src/routes/_view/product/templates.tsx b/apps/web/src/routes/_view/product/templates.tsx
new file mode 100644
index 0000000000..4c734fa4d6
--- /dev/null
+++ b/apps/web/src/routes/_view/product/templates.tsx
@@ -0,0 +1,238 @@
+import { Icon } from "@iconify-icon/react";
+import { createFileRoute, Link } from "@tanstack/react-router";
+import { allTemplates } from "content-collections";
+
+import { cn } from "@hypr/utils";
+
+import { DownloadButton } from "@/components/download-button";
+import { SlashSeparator } from "@/components/slash-separator";
+
+export const Route = createFileRoute("/_view/product/templates")({
+ component: Component,
+ head: () => ({
+ meta: [
+ { title: "Custom Templates - Hyprnote" },
+ {
+ name: "description",
+ content:
+ "Pick or build a template for your recurring meetings and get perfectly formatted notes automatically. Pre-built and custom templates for every meeting type.",
+ },
+ {
+ property: "og:title",
+ content: "Custom Templates - Hyprnote",
+ },
+ {
+ property: "og:description",
+ content:
+ "Pick or build a template for your recurring meetings and get perfectly formatted notes automatically.",
+ },
+ { property: "og:type", content: "website" },
+ {
+ property: "og:url",
+ content: "https://hyprnote.com/product/templates",
+ },
+ ],
+ }),
+});
+
+function Component() {
+ return (
+
+ );
+}
+
+function HeroSection() {
+ return (
+
+
+
+
+ Template for Every Meeting Type
+
+
+ Pick (or build) a template for your recurring meetings and get
+ perfectly formatted notes automatically.
+
+
+
+ Download for free
+
+
+
+
+
+ );
+}
+
+function HowItWorksSection() {
+ return (
+
+
+
+ How it works
+
+
+ Pick a template before or after your meeting and get notes formatted
+ that way.
+
+
+
+
+
+ Before a meeting
+
+
+ GIF
+
+
+
+
+
+ After a meeting
+
+
+ GIF
+
+
+
+
+
+ );
+}
+
+function PreBuiltOrCustomSection() {
+ return (
+
+
+
+ Pre-built or custom — your choice
+
+
+
+
+
+ Community templates
+
+
+ Pre-built templates for common meeting types. Discovery calls,
+ sprint planning, 1-on-1s, technical reviews — just pick one and
+ use it.
+
+
+ {allTemplates.slice(0, 6).map((template) => (
+
+
+ {template.category}
+
+
+ {template.title}
+
+
+ ))}
+
+
+
+ Browse all {allTemplates.length} templates
+
+
+
+
+
+
+ Custom templates
+
+
+ Build templates that match your exact workflow. Store them
+ locally. Use them whenever you need.
+
+
+ Image
+
+
+
+
+
+ );
+}
+
+function ContributeSection() {
+ return (
+
+
+
+ Got a template that works for you?
+
+
+ Submit a PR on GitHub and help the community.
+
+
+
+ Submit your idea
+
+
+
+ );
+}
+
+function CTASection() {
+ return (
+
+
+
+ Ready to transform your meetings?
+
+
+ Download Hyprnote and start using templates to capture perfect meeting
+ notes with AI.
+
+
+
+
+ Free to use. No credit card required.
+
+
+
+
+ );
+}
From cddb8be3a9bfc40035466cebdb10e770a978c1c3 Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Sat, 7 Feb 2026 14:11:28 +0000
Subject: [PATCH 2/3] fix typecheck: use anchor tags for template links
Co-Authored-By: harshika@hyprnote.com
---
apps/web/src/routeTree.gen.ts | 21 +++++++++++++++++++
.../src/routes/_view/product/templates.tsx | 14 ++++++-------
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts
index 297434c920..c7666eb88c 100644
--- a/apps/web/src/routeTree.gen.ts
+++ b/apps/web/src/routeTree.gen.ts
@@ -84,6 +84,7 @@ import { Route as ViewSolutionConsultingRouteImport } from './routes/_view/solut
import { Route as ViewSolutionCoachingRouteImport } from './routes/_view/solution/coaching'
import { Route as ViewShortcutsSlugRouteImport } from './routes/_view/shortcuts/$slug'
import { Route as ViewRoadmapSlugRouteImport } from './routes/_view/roadmap/$slug'
+import { Route as ViewProductTemplatesRouteImport } from './routes/_view/product/templates'
import { Route as ViewProductSelfHostingRouteImport } from './routes/_view/product/self-hosting'
import { Route as ViewProductSearchRouteImport } from './routes/_view/product/search'
import { Route as ViewProductNotepadRouteImport } from './routes/_view/product/notepad'
@@ -524,6 +525,11 @@ const ViewRoadmapSlugRoute = ViewRoadmapSlugRouteImport.update({
path: '/roadmap/$slug',
getParentRoute: () => ViewRouteRoute,
} as any)
+const ViewProductTemplatesRoute = ViewProductTemplatesRouteImport.update({
+ id: '/product/templates',
+ path: '/product/templates',
+ getParentRoute: () => ViewRouteRoute,
+} as any)
const ViewProductSelfHostingRoute = ViewProductSelfHostingRouteImport.update({
id: '/product/self-hosting',
path: '/product/self-hosting',
@@ -894,6 +900,7 @@ export interface FileRoutesByFullPath {
'/product/notepad': typeof ViewProductNotepadRoute
'/product/search': typeof ViewProductSearchRoute
'/product/self-hosting': typeof ViewProductSelfHostingRoute
+ '/product/templates': typeof ViewProductTemplatesRoute
'/roadmap/$slug': typeof ViewRoadmapSlugRoute
'/shortcuts/$slug': typeof ViewShortcutsSlugRoute
'/solution/coaching': typeof ViewSolutionCoachingRoute
@@ -1024,6 +1031,7 @@ export interface FileRoutesByTo {
'/product/notepad': typeof ViewProductNotepadRoute
'/product/search': typeof ViewProductSearchRoute
'/product/self-hosting': typeof ViewProductSelfHostingRoute
+ '/product/templates': typeof ViewProductTemplatesRoute
'/roadmap/$slug': typeof ViewRoadmapSlugRoute
'/shortcuts/$slug': typeof ViewShortcutsSlugRoute
'/solution/coaching': typeof ViewSolutionCoachingRoute
@@ -1160,6 +1168,7 @@ export interface FileRoutesById {
'/_view/product/notepad': typeof ViewProductNotepadRoute
'/_view/product/search': typeof ViewProductSearchRoute
'/_view/product/self-hosting': typeof ViewProductSelfHostingRoute
+ '/_view/product/templates': typeof ViewProductTemplatesRoute
'/_view/roadmap/$slug': typeof ViewRoadmapSlugRoute
'/_view/shortcuts/$slug': typeof ViewShortcutsSlugRoute
'/_view/solution/coaching': typeof ViewSolutionCoachingRoute
@@ -1296,6 +1305,7 @@ export interface FileRouteTypes {
| '/product/notepad'
| '/product/search'
| '/product/self-hosting'
+ | '/product/templates'
| '/roadmap/$slug'
| '/shortcuts/$slug'
| '/solution/coaching'
@@ -1426,6 +1436,7 @@ export interface FileRouteTypes {
| '/product/notepad'
| '/product/search'
| '/product/self-hosting'
+ | '/product/templates'
| '/roadmap/$slug'
| '/shortcuts/$slug'
| '/solution/coaching'
@@ -1561,6 +1572,7 @@ export interface FileRouteTypes {
| '/_view/product/notepad'
| '/_view/product/search'
| '/_view/product/self-hosting'
+ | '/_view/product/templates'
| '/_view/roadmap/$slug'
| '/_view/shortcuts/$slug'
| '/_view/solution/coaching'
@@ -2203,6 +2215,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ViewRoadmapSlugRouteImport
parentRoute: typeof ViewRouteRoute
}
+ '/_view/product/templates': {
+ id: '/_view/product/templates'
+ path: '/product/templates'
+ fullPath: '/product/templates'
+ preLoaderRoute: typeof ViewProductTemplatesRouteImport
+ parentRoute: typeof ViewRouteRoute
+ }
'/_view/product/self-hosting': {
id: '/_view/product/self-hosting'
path: '/product/self-hosting'
@@ -2705,6 +2724,7 @@ interface ViewRouteRouteChildren {
ViewProductNotepadRoute: typeof ViewProductNotepadRoute
ViewProductSearchRoute: typeof ViewProductSearchRoute
ViewProductSelfHostingRoute: typeof ViewProductSelfHostingRoute
+ ViewProductTemplatesRoute: typeof ViewProductTemplatesRoute
ViewRoadmapSlugRoute: typeof ViewRoadmapSlugRoute
ViewShortcutsSlugRoute: typeof ViewShortcutsSlugRoute
ViewSolutionCoachingRoute: typeof ViewSolutionCoachingRoute
@@ -2784,6 +2804,7 @@ const ViewRouteRouteChildren: ViewRouteRouteChildren = {
ViewProductNotepadRoute: ViewProductNotepadRoute,
ViewProductSearchRoute: ViewProductSearchRoute,
ViewProductSelfHostingRoute: ViewProductSelfHostingRoute,
+ ViewProductTemplatesRoute: ViewProductTemplatesRoute,
ViewRoadmapSlugRoute: ViewRoadmapSlugRoute,
ViewShortcutsSlugRoute: ViewShortcutsSlugRoute,
ViewSolutionCoachingRoute: ViewSolutionCoachingRoute,
diff --git a/apps/web/src/routes/_view/product/templates.tsx b/apps/web/src/routes/_view/product/templates.tsx
index 4c734fa4d6..1edf5e7e99 100644
--- a/apps/web/src/routes/_view/product/templates.tsx
+++ b/apps/web/src/routes/_view/product/templates.tsx
@@ -142,10 +142,9 @@ function PreBuiltOrCustomSection() {
{allTemplates.slice(0, 6).map((template) => (
-
@@ -154,17 +153,16 @@ function PreBuiltOrCustomSection() {
{template.title}
-
+
))}
-
Browse all {allTemplates.length} templates
-
+
From 32f580bad73859aec6e1bd83c985b49e0b603730 Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Sat, 7 Feb 2026 16:28:12 +0000
Subject: [PATCH 3/3] update copy: how it works subtitle, remove contribute
section, update CTA
Co-Authored-By: harshika@hyprnote.com
---
.../src/routes/_view/product/templates.tsx | 41 ++-----------------
1 file changed, 4 insertions(+), 37 deletions(-)
diff --git a/apps/web/src/routes/_view/product/templates.tsx b/apps/web/src/routes/_view/product/templates.tsx
index 1edf5e7e99..895216fb17 100644
--- a/apps/web/src/routes/_view/product/templates.tsx
+++ b/apps/web/src/routes/_view/product/templates.tsx
@@ -1,4 +1,3 @@
-import { Icon } from "@iconify-icon/react";
import { createFileRoute, Link } from "@tanstack/react-router";
import { allTemplates } from "content-collections";
@@ -48,8 +47,6 @@ function Component() {
-
-
@@ -94,8 +91,8 @@ function HowItWorksSection() {
How it works
- Pick a template before or after your meeting and get notes formatted
- that way.
+ You can pick a template before your meeting or try different formats
+ later.
@@ -184,45 +181,15 @@ function PreBuiltOrCustomSection() {
);
}
-function ContributeSection() {
- return (
-
-
-
- Got a template that works for you?
-
-
- Submit a PR on GitHub and help the community.
-
-
-
- Submit your idea
-
-
-
- );
-}
-
function CTASection() {
return (
- Ready to transform your meetings?
+ Stop reformatting notes manually
- Download Hyprnote and start using templates to capture perfect meeting
- notes with AI.
+ Download Hyprnote and set up your first template in 30 seconds.