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.