Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
684fff4
feat: replace logo with serif-styled Char text in website header, foo…
devin-ai-integration[bot] Feb 13, 2026
15dbed1
feat: update meta tags from Hyprnote to Char across all routes
devin-ai-integration[bot] Feb 13, 2026
fa5a496
fix: update Playwright test to expect Char in page title
devin-ai-integration[bot] Feb 13, 2026
bf60d54
feat: update OG image generation branding from Hyprnote to Char
devin-ai-integration[bot] Feb 13, 2026
98034b2
feat: replace all external-facing Hyprnote references with Char acros…
devin-ai-integration[bot] Feb 13, 2026
f30cc6a
fix: revert Discord and Reddit redirect URLs
devin-ai-integration[bot] Feb 13, 2026
09a9b45
fix: revert third-party testimonial quotes back to original Hyprnote …
devin-ai-integration[bot] Feb 13, 2026
ef9276b
fix: update LinkedIn company link to /charnotes
devin-ai-integration[bot] Feb 13, 2026
e667cc6
fix: update YouTube channel link to @charnotes
devin-ai-integration[bot] Feb 13, 2026
c27cb6a
fix: update X/Twitter redirect to @getcharnotes
devin-ai-integration[bot] Feb 13, 2026
1bd9612
Update apps/web/src/routes/admin/route.tsx
ComputelessComputer Feb 13, 2026
0c1c414
Update apps/web/src/routes/admin/route.tsx
ComputelessComputer Feb 13, 2026
ee5c3c4
merge: resolve conflict in blog/ head meta (use title/metaDescription…
devin-ai-integration[bot] Feb 13, 2026
c559e09
Merge branch 'devin/1770949170-logo-to-char-text' of https://git-mana…
devin-ai-integration[bot] Feb 13, 2026
93e3ded
chore(fmt): dprint-format admin route meta section
devin-ai-integration[bot] Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/desktop/src/components/main/body/onboarding/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ export function TabContentOnboarding({

<div className="flex flex-col px-6 pt-4 pb-16 gap-8">
<h1 className="text-2xl font-semibold font-serif text-neutral-900">
Welcome to Hyprnote
Welcome to Char
</h1>

<OnboardingSection
Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/free-ai-notetakers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ This local processing approach dramatically reduces your compliance surface area

Not a single byte leaves your machine, making it ideal for organizations with strict data policies while simplifying HIPAA, GDPR, and SOC 2 compliance requirements.

<Image src="/api/images/blog/free-ai-notetakers/free-1.webp" alt="hyprnote" />
<Image src="/api/images/blog/free-ai-notetakers/free-1.webp" alt="Char" />

**Best for:**
Anyone who wants enterprise-grade AI note-taking without vendor lock-in, cloud dependency, or data privacy compromises.
Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/otter-ai-alternatives.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Source: [G2](https://www.g2.com/products/otter-ai/reviews/otter-ai-review-104545

### 1. Char - Best for Complete Data Control

<Image src="/api/images/blog/otter-ai-alternatives/otter-alt-6.webp" alt="hyprnote"/>
<Image src="/api/images/blog/otter-ai-alternatives/otter-alt-6.webp" alt="Char"/>

#### How it compares to Otter AI:

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/changelog/1.0.2-nightly.4.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ date: "2026-01-15"

## AI & Model Selection

- Improve model selection when using hyprnote cloud
- Improve model selection when using Char cloud
- Better automatic model selection based on language and provider compatibility

- Enhance language support checking for STT providers
Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/changelog/1.0.2-nightly.5.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ date: "2026-01-16"
- Deduplicate languages with same ISO639 code
- Prefer base language variants over regional variants when both are present

- Fix hardcoded hyprnote path in language configuration
- Fix hardcoded Char path in language configuration

## Audio

Expand Down
4 changes: 2 additions & 2 deletions apps/web/content/handbook/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

This handbook serves two audiences. Every page should be aware of which audience it primarily speaks to, though most pages will be read by both.

**Audience 1: People considering joining Hyprnote.** They want to understand how we think, what we value, and whether this is the right place for them. Sections that primarily serve this audience: About, Who We Want.
**Audience 1: People considering joining Char.** They want to understand how we think, what we value, and whether this is the right place for them. Sections that primarily serve this audience: About, Who We Want.

**Audience 2: People who just joined Hyprnote.** They need to know how we communicate, do work practically, and where we're heading. Sections that primarily serve this audience: How We Work (including team-specific mindset pages), Communication.
**Audience 2: People who just joined Char.** They need to know how we communicate, do work practically, and where we're heading. Sections that primarily serve this audience: How We Work (including team-specific mindset pages), Communication.

**Go To Market** is a shared section — it tells prospective teammates what our strategy looks like and gives new teammates the playbook they need to execute.

Expand Down
14 changes: 7 additions & 7 deletions apps/web/netlify/edge-functions/og.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ function renderChangelogTemplate(params: z.infer<typeof changelogSchema>) {
display: "flex",
}}
>
Hyprnote.
Char.
</div>
<div
style={{
Expand Down Expand Up @@ -401,7 +401,7 @@ function renderChangelogTemplate(params: z.infer<typeof changelogSchema>) {
display: "flex",
}}
>
Hyprnote.
Char.
</div>
<div
style={{
Expand Down Expand Up @@ -525,7 +525,7 @@ function renderBlogTemplate(params: z.infer<typeof blogSchema>) {
wordWrap: "break-word",
}}
>
Hyprnote.
Char.
</div>
</div>
</div>
Expand Down Expand Up @@ -636,7 +636,7 @@ function renderGenericTemplate({

function renderDocsTemplate(params: z.infer<typeof docsSchema>) {
return renderGenericTemplate({
headerText: "Hyprnote / Docs",
headerText: "Char / Docs",
category: params.section,
title: params.title,
description: params.description,
Expand All @@ -645,7 +645,7 @@ function renderDocsTemplate(params: z.infer<typeof docsSchema>) {

function renderHandbookTemplate(params: z.infer<typeof handbookSchema>) {
return renderGenericTemplate({
headerText: "Hyprnote / Company Handbook",
headerText: "Char / Company Handbook",
category: params.section,
title: params.title,
description: params.description,
Expand All @@ -654,7 +654,7 @@ function renderHandbookTemplate(params: z.infer<typeof handbookSchema>) {

function renderTemplatesTemplate(params: z.infer<typeof templatesSchema>) {
return renderGenericTemplate({
headerText: "Hyprnote / Meeting Templates",
headerText: "Char / Meeting Templates",
category: params.category,
title: params.title,
description: params.description,
Expand All @@ -663,7 +663,7 @@ function renderTemplatesTemplate(params: z.infer<typeof templatesSchema>) {

function renderShortcutsTemplate(params: z.infer<typeof shortcutsSchema>) {
return renderGenericTemplate({
headerText: "Hyprnote / Shortcuts",
headerText: "Char / Shortcuts",
category: params.category,
title: params.title,
description: params.description,
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/cta-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export function SidebarDownloadCard() {
return (
<div className="border border-neutral-200 rounded-xs overflow-hidden bg-white bg-[linear-gradient(to_right,#f5f5f5_1px,transparent_1px),linear-gradient(to_bottom,#f5f5f5_1px,transparent_1px)] bg-size-[24px_24px] bg-position-[12px_12px,12px_12px] p-4">
<h3 className="font-serif text-sm text-stone-600 mb-3 text-center">
Try Hyprnote for yourself
Try Char for yourself
</h3>
<Link
to="/download/"
Expand Down
17 changes: 7 additions & 10 deletions apps/web/src/components/footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import { useCallback, useEffect, useRef, useState } from "react";

import { cn } from "@hypr/utils";

import { Image } from "@/components/image";

const vsList = [
{ slug: "otter", name: "Otter.ai" },
{ slug: "granola", name: "Granola" },
Expand Down Expand Up @@ -52,12 +50,11 @@ export function Footer() {
function BrandSection({ currentYear }: { currentYear: number }) {
return (
<div className="lg:flex-1">
<Link to="/" className="inline-block mb-4">
<Image
src="/api/images/hyprnote/logo.svg"
alt="Hyprnote"
className="h-6"
/>
<Link
to="/"
className="inline-block mb-4 font-semibold text-2xl font-serif"
>
Char
</Link>
<p className="text-sm text-neutral-500 mb-4">Fastrepl © {currentYear}</p>
<p className="text-sm text-neutral-600 mb-3">
Expand Down Expand Up @@ -277,7 +274,7 @@ function ResourcesLinks() {
"text-sm text-neutral-600 hover:text-stone-600 transition-colors no-underline hover:underline hover:decoration-dotted",
"inline-flex items-center gap-1",
)}
aria-label={`Hyprnote for ${currentUseCase.label}`}
aria-label={`Char for ${currentUseCase.label}`}
>
👍 for{" "}
<span
Expand All @@ -302,7 +299,7 @@ function ResourcesLinks() {
>
<img
src="/api/images/hyprnote/icon.png"
alt="Hyprnote"
alt="Char"
width={12}
height={12}
className="size-4 rounded border border-neutral-100 inline"
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/github-open-source.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ function OpenSourceButton({
<h2 className="text-2xl font-serif text-stone-600">Open source</h2>
<p className="text-neutral-600">
{
"Hyprnote values privacy and community, so it's been transparent from day one."
"Char values privacy and community, so it's been transparent from day one."
}
</p>
<a
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/components/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ function LeftNav({
to="/why-hyprnote/"
className="hidden md:block text-sm text-neutral-600 hover:text-neutral-800 transition-all hover:underline decoration-dotted"
>
Why Hyprnote
Why Char
</Link>
<ProductDropdown
isProductOpen={isProductOpen}
Expand Down Expand Up @@ -319,7 +319,7 @@ function Logo() {
to="/"
className="font-semibold text-2xl font-serif hover:scale-105 transition-transform mr-4"
>
<img src="/api/images/hyprnote/logo.svg" alt="Hyprnote" className="h-6" />
Char
</Link>
);
}
Expand Down Expand Up @@ -646,7 +646,7 @@ function MobileMenuLinks({
onClick={() => setIsMenuOpen(false)}
className="block text-base text-neutral-700 hover:text-neutral-900 transition-colors"
>
Why Hyprnote
Why Char
</Link>
<MobileProductSection
isProductOpen={isProductOpen}
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/mdx-jobs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ const TOOL_NAMES: Record<string, string> = {
figma: "Figma",
slack: "Slack",
github: "GitHub",
hyprnote: "Hyprnote",
hyprnote: "Char",
};

function ToolWithIcon({ tool }: { tool: string }) {
Expand Down Expand Up @@ -229,7 +229,7 @@ export function HyprnoteIcon() {
return (
<img
src="/api/images/hyprnote/icon.png"
alt="Hyprnote"
alt="Char"
className="inline-block align-middle size-4.5 mb-0.75 rounded-md"
/>
);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/video-modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ export function VideoModal({ playbackId, isOpen, onClose }: VideoModalProps) {
accentColor="#78716c"
className="w-full h-full rounded-lg"
metadata={{
videoTitle: "Hyprnote Feature Demo",
videoTitle: "Char Feature Demo",
}}
/>
</div>
Expand Down
14 changes: 7 additions & 7 deletions apps/web/src/functions/github-stars.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,23 +196,23 @@ export async function fetchGitHubActivity(): Promise<{
return { added, total: parseInt(String(countResult[0].count), 10) };
}

const RESEARCH_PROMPT = `You are an assistant to the founders of Hyprnote.
const RESEARCH_PROMPT = `You are an assistant to the founders of Char.

Hyprnote is a privacy-first AI notepad for meetings — it runs transcription and summarization locally on-device, without bots or cloud recording. Think of it as the "anti-Otter.ai" for professionals who care about privacy.
Char is a privacy-first AI notepad for meetings — it runs transcription and summarization locally on-device, without bots or cloud recording. Think of it as the "anti-Otter.ai" for professionals who care about privacy.

I'm sending you data about a GitHub user who interacted with our repository (starred, forked, opened an issue, etc). Your job is to exhaustively research this person using the information provided to determine if they are:

1. A potential customer (someone who would benefit from Hyprnote)
2. A potential hire (talented developer who could contribute to Hyprnote)
1. A potential customer (someone who would benefit from Char)
2. A potential hire (talented developer who could contribute to Char)
3. A potential community contributor

Hyprnote's ideal customer profile:
Char's ideal customer profile:
1. Professional who has frequent meetings (sales, consulting, recruiting, healthcare, legal, journalism, engineering management)
2. Privacy-conscious — works with sensitive data
3. Tech-savvy enough to appreciate local AI / on-device processing
4. Uses a Mac (our primary platform)

Hyprnote's ideal hire profile:
Char's ideal hire profile:
1. Strong Rust and/or TypeScript developer
2. Experience with audio processing, ML/AI, or desktop apps (Tauri/Electron)
3. Open source contributor
Expand All @@ -230,7 +230,7 @@ Return your final response in JSON only with the following schema:
- The score field is from 0 to 100.
- The company is where they currently work, or "" if unknown.
- For the "reasoning" field, write in Markdown. Include newlines where appropriate.
- If the person works at Hyprnote (fastrepl), there is no match and the score is 0.
- If the person works at Char (fastrepl), there is no match and the score is 0.
- Focus on whether they'd be a good customer, hire, or contributor.`;

export async function researchLead(
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/functions/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const CACHE_TTL = HOUR;
function getGitHubHeaders(): Record<string, string> {
const headers: Record<string, string> = {
Accept: "application/vnd.github.v3+json",
"User-Agent": "Hyprnote-Web",
"User-Agent": "Char-Web",
};
if (env.GITHUB_TOKEN) {
headers["Authorization"] = `token ${env.GITHUB_TOKEN}`;
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ interface RouterContext {
queryClient: QueryClient;
}

const TITLE = "Hyprnote - AI notepad for private meetings";
const TITLE = "Char - AI notepad for private meetings";
const DESCRIPTION =
"Hyprnote is a private, on-device AI notepad that enhances your own notes—without bots, cloud recording, or meeting intrusion. Stay engaged, build your personal knowledge base, and export to tools like Notion on your terms.";
"Char is a private, on-device AI notepad that enhances your own notes—without bots, cloud recording, or meeting intrusion. Stay engaged, build your personal knowledge base, and export to tools like Notion on your terms.";
const KEYWORDS =
"AI notepad, privacy-first AI, on-device AI, local AI, edge AI, meeting notes, personal knowledge base, AI notetaking, AI notetaker, Argmax, Deepgram, secure transcription, notepad app, notetaking app";

Expand Down
24 changes: 12 additions & 12 deletions apps/web/src/routes/_view/about.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ export const Route = createFileRoute("/_view/about")({
},
head: () => ({
meta: [
{ title: "Team - Hyprnote Press Kit" },
{ title: "Team - Char Press Kit" },
{
name: "description",
content: "Meet the Hyprnote team and download team photos.",
content: "Meet the Char team and download team photos.",
},
],
}),
Expand Down Expand Up @@ -120,7 +120,7 @@ function HeroSection() {
About
</h1>
<p className="text-lg sm:text-xl text-neutral-600">
Learn about Hyprnote, meet our team, and discover the story behind our
Learn about Char, meet our team, and discover the story behind our
privacy-first note-taking platform.
</p>
</div>
Expand Down Expand Up @@ -660,14 +660,14 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
<div ref={scrollRef} className="p-4 overflow-y-auto">
<div className="prose prose-stone max-w-none">
<h2 className="text-3xl font-serif text-stone-600 mb-4">
How We Landed on Hyprnote
How We Landed on Char
</h2>
<p className="text-base text-neutral-500 italic mb-8">
Our story and what we believe
</p>

<p className="text-base text-neutral-600 leading-relaxed mb-4">
Hyprnote didn't start as a note-app. We were actually building an AI
Char didn't start as a note-app. We were actually building an AI
hardware toy for kids. It was fun, but for two people, hardware was
too slow and too heavy. When we stepped back, we realized the thing
we cared about wasn't the toy — it was helping people capture and
Expand All @@ -678,7 +678,7 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
At the same time, I was drowning in meetings and trying every AI
notetaker out there. They were slow, distracting, or shipped every
word to the cloud. None of them felt like something I'd trust or
enjoy using. That became the real beginning of Hyprnote.
enjoy using. That became the real beginning of Char.
</p>

<p className="text-base text-neutral-600 leading-relaxed mb-8">
Expand All @@ -700,7 +700,7 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
</p>

<p className="text-base text-neutral-600 leading-relaxed mb-4">
Hyprnote exists to preserve what makes us human: conversations that
Char exists to preserve what makes us human: conversations that
spark ideas and collaboration that moves work forward. We build
tools that amplify human agency, not replace it. No ghost bots. No
silent note lurkers. Just people, thinking together.
Expand All @@ -714,8 +714,8 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
Where we are now
</h3>
<p className="text-base text-neutral-600 leading-relaxed mb-8">
Hyprnote today is the result of that reset. A fast, private,
local-first notetaker built for people like us: meeting-heavy,
Char today is the result of that reset. A fast, private, local-first
notetaker built for people like us: meeting-heavy,
privacy-conscious, and tired of complicated tools. It stays on your
device. It respects your data. And it helps you think better, not
attend meetings on autopilot.
Expand All @@ -730,15 +730,15 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
<div className="flex flex-col gap-2">
<div>
<p className="text-base text-neutral-600 font-medium italic font-serif">
Hyprnote
Char
</p>
<p className="text-sm text-neutral-500">John Jeong, Yujong Lee</p>
</div>

<div>
<Image
src="/api/images/hyprnote/signature-dark.svg"
alt="Hyprnote Signature"
alt="Char Signature"
width={124}
height={60}
layout="constrained"
Expand Down Expand Up @@ -912,7 +912,7 @@ function PhotoDetail({
/>

<p className="text-sm text-neutral-600">
Team photo from the Hyprnote team.
Team photo from the Char team.
</p>
</div>
</>
Expand Down
Loading
Loading