diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fbc1de31f4..b49876f064 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -https://char.com/docs/developers +https://char.com/docs/developers?utm_source=github&utm_medium=contributing&utm_campaign=organic diff --git a/README.md b/README.md index 27f2d8e628..336979c763 100644 --- a/README.md +++ b/README.md @@ -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) @@ -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 diff --git a/apps/desktop/src/calendar/components/shared.tsx b/apps/desktop/src/calendar/components/shared.tsx index 9301ec8932..0e1687272d 100644 --- a/apps/desktop/src/calendar/components/shared.tsx +++ b/apps/desktop/src/calendar/components/shared.tsx @@ -22,7 +22,8 @@ const _PROVIDERS = [ badge: "", icon: , 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, }, { @@ -32,7 +33,8 @@ const _PROVIDERS = [ badge: "Internal Use Only", icon: , 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", }, { @@ -42,7 +44,8 @@ const _PROVIDERS = [ badge: "Coming soon", icon: , 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[]; diff --git a/apps/desktop/src/changelog/index.tsx b/apps/desktop/src/changelog/index.tsx index 873537e8ea..97dccf047c 100644 --- a/apps/desktop/src/changelog/index.tsx +++ b/apps/desktop/src/changelog/index.tsx @@ -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, ) } diff --git a/apps/desktop/src/settings/ai/llm/shared.tsx b/apps/desktop/src/settings/ai/llm/shared.tsx index e8414c877e..ce496c6d66 100644 --- a/apps/desktop/src/settings/ai/llm/shared.tsx +++ b/apps/desktop/src/settings/ai/llm/shared.tsx @@ -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", }, }, }, @@ -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", }, }, }, diff --git a/apps/desktop/src/settings/ai/stt/configure.tsx b/apps/desktop/src/settings/ai/stt/configure.tsx index 3dbc9c3a12..38f2f7fc3f 100644 --- a/apps/desktop/src/settings/ai/stt/configure.tsx +++ b/apps/desktop/src/settings/ai/stt/configure.tsx @@ -155,7 +155,7 @@ function HyprProviderCard({
{ - "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)." } diff --git a/apps/web/content/articles/best-ai-notetaker.mdx b/apps/web/content/articles/best-ai-notetaker.mdx index 6b48493448..b52fa80a3a 100644 --- a/apps/web/content/articles/best-ai-notetaker.mdx +++ b/apps/web/content/articles/best-ai-notetaker.mdx @@ -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. diff --git a/apps/web/content/articles/best-ai-notetakers-google-meet.mdx b/apps/web/content/articles/best-ai-notetakers-google-meet.mdx index e1f69d5ad5..6a4b189fd0 100644 --- a/apps/web/content/articles/best-ai-notetakers-google-meet.mdx +++ b/apps/web/content/articles/best-ai-notetakers-google-meet.mdx @@ -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. diff --git a/apps/web/content/articles/chatgpt-data-retention-policy.mdx b/apps/web/content/articles/chatgpt-data-retention-policy.mdx index c84729d91e..46ddceee8e 100644 --- a/apps/web/content/articles/chatgpt-data-retention-policy.mdx +++ b/apps/web/content/articles/chatgpt-data-retention-policy.mdx @@ -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. @@ -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. -  \ No newline at end of file +  diff --git a/apps/web/content/articles/mac-productivity-apps.mdx b/apps/web/content/articles/mac-productivity-apps.mdx index cf5fdc1750..2f1f25b308 100644 --- a/apps/web/content/articles/mac-productivity-apps.mdx +++ b/apps/web/content/articles/mac-productivity-apps.mdx @@ -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: diff --git a/apps/web/content/articles/markdown-note-taking-apps.mdx b/apps/web/content/articles/markdown-note-taking-apps.mdx index c232f9df71..e8dc43dd7b 100644 --- a/apps/web/content/articles/markdown-note-taking-apps.mdx +++ b/apps/web/content/articles/markdown-note-taking-apps.mdx @@ -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: diff --git a/apps/web/content/articles/meeting-minutes-software.mdx b/apps/web/content/articles/meeting-minutes-software.mdx index b58ee13031..60919ae93b 100644 --- a/apps/web/content/articles/meeting-minutes-software.mdx +++ b/apps/web/content/articles/meeting-minutes-software.mdx @@ -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. diff --git a/apps/web/content/articles/meeting-productivity-tools.mdx b/apps/web/content/articles/meeting-productivity-tools.mdx index cd5d3b8067..deb3abffd6 100644 --- a/apps/web/content/articles/meeting-productivity-tools.mdx +++ b/apps/web/content/articles/meeting-productivity-tools.mdx @@ -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. -[Char](https://char.com) (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.  +[Char](https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic) (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. diff --git a/apps/web/content/articles/mistral-api-key.mdx b/apps/web/content/articles/mistral-api-key.mdx index da39b10cc4..17fd1c08ee 100644 --- a/apps/web/content/articles/mistral-api-key.mdx +++ b/apps/web/content/articles/mistral-api-key.mdx @@ -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/). \ No newline at end of file +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). diff --git a/apps/web/content/docs/about/0.hello-world.mdx b/apps/web/content/docs/about/0.hello-world.mdx index 179438c096..309aa0130a 100644 --- a/apps/web/content/docs/about/0.hello-world.mdx +++ b/apps/web/content/docs/about/0.hello-world.mdx @@ -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 diff --git a/apps/web/content/docs/developers/12.analytics.mdx b/apps/web/content/docs/developers/12.analytics.mdx index aca6965cd8..d721dfd1d0 100644 --- a/apps/web/content/docs/developers/12.analytics.mdx +++ b/apps/web/content/docs/developers/12.analytics.mdx @@ -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. diff --git a/apps/web/content/handbook/how-we-work/8.analytics-funnel.mdx b/apps/web/content/handbook/how-we-work/8.analytics-funnel.mdx index d048eb1274..eff266beed 100644 --- a/apps/web/content/handbook/how-we-work/8.analytics-funnel.mdx +++ b/apps/web/content/handbook/how-we-work/8.analytics-funnel.mdx @@ -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 diff --git a/crates/db-user/assets/onboarding-raw.html b/crates/db-user/assets/onboarding-raw.html index c67fa436ff..15d0c385d2 100644 --- a/crates/db-user/assets/onboarding-raw.html +++ b/crates/db-user/assets/onboarding-raw.html @@ -17,10 +17,10 @@

Links

  • Discord: https://hyprnote.com/discord

    + href="https://hyprnote.com/discord?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://hyprnote.com/discord

  • Official Docs: https://docs.hyprnote.com

    + href="https://docs.hyprnote.com?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://docs.hyprnote.com

  • -
\ No newline at end of file + diff --git a/crates/db-user/assets/thank-you.md b/crates/db-user/assets/thank-you.md index 5f74f3deb2..ed6e122810 100644 --- a/crates/db-user/assets/thank-you.md +++ b/crates/db-user/assets/thank-you.md @@ -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 **turn RED** when it's ready!), and Meeting Summarization after LLM download is complete.
-**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.
-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. welcome