Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
https://char.com/docs/developers
https://char.com/docs/developers?utm_source=github&utm_medium=contributing&utm_campaign=organic
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ You can also use it for taking notes for lectures or organizing your thoughts.
brew install --cask fastrepl/fastrepl/char@nightly
```

- [macOS](https://char.com/download) (public beta)
- [macOS](https://char.com/download?utm_source=github&utm_medium=readme&utm_campaign=organic) (public beta)
- [Windows](https://github.com/fastrepl/char/issues/66) (q2 2026)
- [Linux](https://github.com/fastrepl/char/issues/67) (q2 2026)

Expand Down Expand Up @@ -74,7 +74,7 @@ Char plays nice with whatever stack you're running.

Prefer a certain style? Choose from predefined templates like bullet points, agenda-based, or paragraph summary. Or create your own.

Check out our [template gallery](https://char.com/templates) and add your own [here](https://github.com/fastrepl/char/tree/main/apps/web/content/templates).
Check out our [template gallery](https://char.com/templates?utm_source=github&utm_medium=readme&utm_campaign=organic) and add your own [here](https://github.com/fastrepl/char/tree/main/apps/web/content/templates).

### AI Chat

Expand Down
9 changes: 6 additions & 3 deletions apps/desktop/src/calendar/components/shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const _PROVIDERS = [
badge: "",
icon: <Icon icon="logos:apple" width={20} height={20} />,
platform: "macos",
docsPath: "https://char.com/docs/calendar/apple",
docsPath:
"https://char.com/docs/calendar/apple?utm_source=app&utm_medium=settings&utm_campaign=organic",
nangoIntegrationId: undefined,
},
{
Expand All @@ -32,7 +33,8 @@ const _PROVIDERS = [
badge: "Internal Use Only",
icon: <Icon icon="logos:google-calendar" width={20} height={20} />,
platform: "all",
docsPath: "https://char.com/docs/calendar/gcal",
docsPath:
"https://char.com/docs/calendar/gcal?utm_source=app&utm_medium=settings&utm_campaign=organic",
nangoIntegrationId: "google-calendar",
},
{
Expand All @@ -42,7 +44,8 @@ const _PROVIDERS = [
badge: "Coming soon",
icon: <OutlookIcon size={20} />,
platform: "all",
docsPath: "https://char.com/docs/calendar/outlook",
docsPath:
"https://char.com/docs/calendar/outlook?utm_source=app&utm_medium=settings&utm_campaign=organic",
nangoIntegrationId: undefined,
},
] as const satisfies readonly CalendarProvider[];
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/changelog/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ function ChangelogHeader({
className="gap-1.5 text-neutral-600 hover:text-black"
onClick={() =>
openerCommands.openUrl(
`https://char.com/changelog/${version}`,
`https://char.com/changelog/${version}?utm_source=app&utm_medium=changelog&utm_campaign=organic`,
null,
)
}
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/src/settings/ai/llm/shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const _PROVIDERS = [
models: { label: "Available models", url: "https://lmstudio.ai/models" },
setup: {
label: "Setup guide",
url: "https://char.com/docs/faq/local-llm-setup/#lm-studio-setup",
url: "https://char.com/docs/faq/local-llm-setup/?utm_source=app&utm_medium=settings&utm_campaign=organic#lm-studio-setup",
},
},
},
Expand All @@ -76,7 +76,7 @@ const _PROVIDERS = [
models: { label: "Available models", url: "https://ollama.com/library" },
setup: {
label: "Setup guide",
url: "https://char.com/docs/faq/local-llm-setup/#ollama-setup",
url: "https://char.com/docs/faq/local-llm-setup/?utm_source=app&utm_medium=settings&utm_campaign=organic#ollama-setup",
},
},
},
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/settings/ai/stt/configure.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ function HyprProviderCard({
<div className="flex items-center gap-3 py-2">
<div className="flex-1 border-t border-dashed border-neutral-300" />
<a
href="https://char.com/docs/developers/local-models"
href="https://char.com/docs/developers/local-models?utm_source=app&utm_medium=settings&utm_campaign=organic"
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-1 text-xs text-neutral-400 hover:underline"
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/settings/data/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export function Data() {
<div>
<StyledStreamdown className="text-neutral-500">
{
"Import data from other apps. Read more about [import](https://char.com/docs/data/#import) and [export](https://char.com/docs/data/#export)."
"Import data from other apps. Read more about [import](https://char.com/docs/data/?utm_source=app&utm_medium=settings&utm_campaign=organic#import) and [export](https://char.com/docs/data/?utm_source=app&utm_medium=settings&utm_campaign=organic#export)."
}
</StyledStreamdown>

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/best-ai-notetaker.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ The AI assists with drafting, summarizing long documents, answering questions ab

I'm Char's founder. I'm putting my tool first, though I'll explain why rather than asking you to trust me.

Every AI note-taking tool I tested before building [Char](https://char.com/) forced the same choice: use their cloud, their models, their rules. My data went where they decided, stored how they decided. No way to switch, no way out.
Every AI note-taking tool I tested before building [Char](https://char.com/?utm_source=website&utm_medium=blog&utm_campaign=organic) forced the same choice: use their cloud, their models, their rules. My data went where they decided, stored how they decided. No way to switch, no way out.

Char exists because of that. It's an open-source AI notepad for meetings that stores everything as plain markdown files on your device. Zero lock-in. You choose your AI stack: managed cloud, bring your own API keys, or run local models. No bots. No vendor dependency.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Each of these tools brings different strengths to meeting capture and analysis.

### 1. Char: complete control over your data and AI stack

Most transcription software forces you into their cloud, their servers, their rules. **[Char](https://char.com)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.
Most transcription software forces you into their cloud, their servers, their rules. **[Char](https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.

You decide if your audio, transcripts, or notes ever leave your device. You pick your preferred STT and LLM provider, which means you can go completely local if you want to. No forced stack. No lock-in.

Expand Down
6 changes: 3 additions & 3 deletions apps/web/content/articles/chatgpt-data-retention-policy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ This is relevant if you're evaluating how OpenAI fits into a broader AI workflow

If you're already paying for API access, you can use that same key for meeting transcription and notes without going through the consumer product.

[Char](https://char.com/) is an open-source AI notepad for meetings that lets you bring your own API key. Connect your OpenAI, Anthropic, Google Gemini, or Azure-hosted GPT key, and your meeting data goes through the API. The retention policies from your API agreement apply, not the consumer defaults described above.
[Char](https://char.com/?utm_source=website&utm_medium=blog&utm_campaign=organic) is an open-source AI notepad for meetings that lets you bring your own API key. Connect your OpenAI, Anthropic, Google Gemini, or Azure-hosted GPT key, and your meeting data goes through the API. The retention policies from your API agreement apply, not the consumer defaults described above.

If even API-level retention is too much, Char also runs fully offline with local models through Ollama or LM Studio. Nothing leaves your machine.

Expand All @@ -107,6 +107,6 @@ More than a transcription tool. Char does real-time transcription while you jot

You're not locked into one provider. If your security team approves a different model next quarter, switch the key. Your notes are markdown files on your machine either way.

[Download Char for macOS](https://char.com/download/apple-silicon) and use the AI provider your security team actually trusts.
[Download Char for macOS](https://char.com/download/apple-silicon?utm_source=website&utm_medium=blog&utm_campaign=organic) and use the AI provider your security team actually trusts.

&nbsp;
&nbsp;
2 changes: 1 addition & 1 deletion apps/web/content/articles/mac-productivity-apps.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ If you're a Mac user looking to actually get more done (not just feel productive

Meetings suck, but they're inevitable. The next best thing is making sure you never miss a detail with a note-taker that doesn't lock your data in someone else's cloud. I built Char for this reason.

[Char](https://char.com/) is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack. You decide if your audio, transcripts, or notes ever leave your device. You pick your preferred STT and LLM provider, which means you can go completely local if you want to. No forced stack. No lock-in.
[Char](https://char.com/?utm_source=website&utm_medium=blog&utm_campaign=organic) is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack. You decide if your audio, transcripts, or notes ever leave your device. You pick your preferred STT and LLM provider, which means you can go completely local if you want to. No forced stack. No lock-in.

#### Key Features:

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/markdown-note-taking-apps.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ This list covers five apps, each strong for a specific use case, so you can find

![](https://auth.hyprnote.com/storage/v1/object/public/blog/articles/markdown-note-taking-apps/image-1.png)

**[Char](https://char.com/)** (formerly Hypernote) is an open-source AI notepad built specifically for meetings. It transcribes your conversations in real-time, and when the meeting ends, it combines the transcript with your manual notes to create the perfect summary. No bots join your calls, everything is stored as plain markdown files with zero lock-in, and you get to choose your preferred STT and LLM provider.
**[Char](https://char.com/?utm_source=website&utm_medium=blog&utm_campaign=organic)** (formerly Hypernote) is an open-source AI notepad built specifically for meetings. It transcribes your conversations in real-time, and when the meeting ends, it combines the transcript with your manual notes to create the perfect summary. No bots join your calls, everything is stored as plain markdown files with zero lock-in, and you get to choose your preferred STT and LLM provider.

#### Key Features:

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/meeting-minutes-software.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ If you're worried about missing important details while taking minutes of the me

![Char (foremly Char)](https://auth.hyprnote.com/storage/v1/object/public/blog/blog/char-summary.png)

**[Char](https://char.com)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.
**[Char](https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.

You decide if your audio, transcripts, or notes ever leave your device. You pick your preferred STT and LLM provider, which means you can go completely local if you want to.

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/meeting-productivity-tools.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Let's get into it.

Most AI meeting tools make the same trade: convenience in exchange for your data living in someone else's database, locked into their format, processed by their AI. Char doesn't make that trade.

<u>[Char](https://char.com)</u> (formerly Hyprnote) is an open-source AI notepad for meetings, built for people who want complete control over their files, their AI stack, and what happens to their data. 
<u>[Char](https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic)</u> (formerly Hyprnote) is an open-source AI notepad for meetings, built for people who want complete control over their files, their AI stack, and what happens to their data. 

Every meeting is saved as a plain .md file on your device. You choose which AI processes it. Nothing is locked behind Char's ecosystem.

Expand Down
2 changes: 1 addition & 1 deletion apps/web/content/articles/mistral-api-key.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,4 @@ Everything else stays local. The audio file, the transcript, the summary are all

Plus, all core features, local transcription, and BYOK stay completely free. You’re already paying for the API key, you shouldn’t have to pay twice. But if you want cloud services and don't want to manage keys at all, there is a $8/month plan you can check out. 

To connect Mistral, open Char's settings, go to API Keys, paste your key, and that's it. Try it out for free now - [Download Char for macOS](https://char.com/download/).
To connect Mistral, open Char's settings, go to API Keys, paste your key, and that's it. Try it out for free now - [Download Char for macOS](https://char.com/download/?utm_source=website&utm_medium=blog&utm_campaign=organic).
2 changes: 1 addition & 1 deletion apps/web/content/docs/about/0.hello-world.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Char will remember everything that's said, derive insights, and act on your beha

## Get in touch

[Book a 20-min call](https://char.com/founders) with us to chat about what we're building.
[Book a 20-min call](https://char.com/founders?utm_source=website&utm_medium=docs&utm_campaign=organic) with us to chat about what we're building.

Cheers,
Team Char
Expand Down
40 changes: 40 additions & 0 deletions apps/web/content/docs/developers/12.analytics.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,46 @@ Notes:
| `trial_skipped` | `reason = "not_eligible"`, `source` | `crates/api-subscription/src/trial.rs`, `crates/api-subscription/src/routes/billing.rs` |
| `trial_failed` | `reason` (`stripe_error`, `customer_error`, `rpc_error`), `source` | `crates/api-subscription/src/trial.rs`, `crates/api-subscription/src/routes/billing.rs` |

## UTM parameters on owned links

All owned outbound links that drive traffic to `char.com` carry UTM parameters so installs and page visits can be attributed by source in PostHog.

### Convention

| Parameter | Description | Values |
|-----------|-------------|--------|
| `utm_source` | Where the link lives | `github`, `app`, `website` |
| `utm_medium` | Type of content | `readme`, `contributing`, `settings`, `changelog`, `onboarding`, `blog`, `docs` |
| `utm_campaign` | Campaign type | `organic` for all evergreen links |

### Where UTMs are applied

| Source | `utm_source` | `utm_medium` | Example file |
|--------|-------------|--------------|--------------|
| GitHub README | `github` | `readme` | `README.md` |
| GitHub CONTRIBUTING | `github` | `contributing` | `CONTRIBUTING.md` |
| Desktop app settings | `app` | `settings` | `apps/desktop/src/settings/ai/llm/shared.tsx` |
| Desktop app changelog | `app` | `changelog` | `apps/desktop/src/changelog/index.tsx` |
| In-app onboarding | `app` | `onboarding` | `crates/db-user/assets/onboarding-raw.html` |
| Blog article CTAs | `website` | `blog` | `apps/web/content/articles/*.mdx` |
| Documentation | `website` | `docs` | `apps/web/content/docs/about/0.hello-world.mdx` |

### Rules

- Append `?utm_source=...&utm_medium=...&utm_campaign=organic` to the URL.
- If the URL already has query parameters, use `&` instead of `?`.
- Place UTM parameters **before** any `#fragment` (e.g., `?utm_source=app&utm_medium=settings&utm_campaign=organic#section`).
- Do not add UTMs to internal same-site navigation (relative links), API endpoints, OG meta tags, CI config URLs, or links to third-party sites.
- Blog-to-blog cross-links (`char.com/blog/...` → `char.com/blog/...`) do not get UTMs since they are internal navigation.

### How this connects to PostHog

PostHog automatically captures UTM parameters from the landing page URL as properties on the user's first pageview event. This means:

- `download_clicked` events can be segmented by the UTM properties of the session that led to them.
- Stage 1 (Acquisition) and Stage 2 (Install conversion) attribution improves because you can see which source drove the visit.
- The `utm_source` / `utm_medium` breakdown directly answers "where do our installs come from?"

## User journey funnel

The user lifecycle is divided into 8 stages. Each stage lists the PostHog events that measure it, how identity linking works at that point, and known gaps.
Expand Down
6 changes: 5 additions & 1 deletion apps/web/content/handbook/how-we-work/8.analytics-funnel.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@ We track the user lifecycle as an 8-stage funnel. Each stage has key events that
[8. Paying]
```

## UTM parameters

All owned outbound links (GitHub README, desktop app, blog CTAs, onboarding assets) carry `utm_source`, `utm_medium`, and `utm_campaign=organic` so we can attribute visits and installs by channel. See the [UTM convention reference](/docs/developers/analytics#utm-parameters-on-owned-links) for the full tagging guide.

## 1. Acquisition (website visits)

Standard PostHog pageview and session tracking.
Standard PostHog pageview and session tracking. UTM parameters on inbound links are automatically captured by PostHog as session properties.

## 2. Converting visits to app installs

Expand Down
6 changes: 3 additions & 3 deletions crates/db-user/assets/onboarding-raw.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ <h1>Links</h1>
<ul>
<li>
<p>Discord: <a target="_blank" rel="noopener noreferrer nofollow"
href="https://hyprnote.com/discord">https://hyprnote.com/discord</a></p>
href="https://hyprnote.com/discord?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://hyprnote.com/discord</a></p>
</li>
<li>
<p>Official Docs: <a target="_blank" rel="noopener noreferrer nofollow"
href="https://docs.hyprnote.com">https://docs.hyprnote.com</a></p>
href="https://docs.hyprnote.com?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://docs.hyprnote.com</a></p>
</li>
</ul>
</ul>
4 changes: 2 additions & 2 deletions crates/db-user/assets/thank-you.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ We are currently in Beta, so there might be some glitches or errors. We're worki
You will be able to try out Meeting Transcription after STT download is complete (the recording button will <u>**turn RED**</u> when it's ready!), and Meeting Summarization after LLM download is complete.
<br/>

**In the meantime...** why don't you check out [docs](https://docs.hyprnote.com/using-hyprnote/getting-started) or [blog](https://hyprnote.com/blog) for a better understanding of the service. We also have @[Onboarding Video](note:df1d8c52-6d9d-4471-aff1-5dbd35899cbe) for you to get started.
**In the meantime...** why don't you check out [docs](https://docs.hyprnote.com/using-hyprnote/getting-started?utm_source=app&utm_medium=onboarding&utm_campaign=organic) or [blog](https://hyprnote.com/blog?utm_source=app&utm_medium=onboarding&utm_campaign=organic) for a better understanding of the service. We also have @[Onboarding Video](note:df1d8c52-6d9d-4471-aff1-5dbd35899cbe) for you to get started.
<br/>

Also, please [join our Discord](https://hyprnote.com/discord)! We really want to hear from you.
Also, please [join our Discord](https://hyprnote.com/discord?utm_source=app&utm_medium=onboarding&utm_campaign=organic)! We really want to hear from you.

<img alt="welcome" src="https://raw.githubusercontent.com/fastrepl/hyprnote/refs/heads/main/crates/db-user/assets/welcome2.jpg"/>
Loading