From beec1021062c394cb7a86e0187d3598470ccc5fe Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 00:32:56 +0000 Subject: [PATCH 1/8] fix: rename Hyprnote to Char across codebase Addresses #4104 - Updates user-visible references from 'Hyprnote' to 'Char' across 225 files including: - README.md, AGENTS.md, CONTRIBUTING.md, LICENSE - Web/marketing content and documentation - Desktop app UI text (settings, onboarding, toasts) - CI workflow artifact names - Flatpak metadata user-visible fields - API descriptions and openapi docs - Blog articles and changelog entries - Scripts and configuration files Preserved: - Domain URLs (hyprnote.com still active) - App bundle identifiers (com.hyprnote.*) - URL schemes (hyprnote://) - Provider IDs (technical identifiers matching backend) - Rust adapter types (AdapterKind::Hyprnote) - User testimonials/quotes - Generated files, lock files, migration files Co-Authored-By: john@hyprnote.com --- .github/workflows/desktop_cd.yaml | 36 +++++++++---------- .github/workflows/desktop_publish.yaml | 30 ++++++++-------- LICENSE | 4 +-- README.md | 10 +++--- Taskfile.yaml | 4 +-- apps/api/AGENTS.md | 2 +- apps/api/fly.toml | 2 +- apps/api/src/main.rs | 6 ++-- apps/api/src/openapi.rs | 2 +- apps/bot/fly.toml | 4 +-- .../flatpak/com.hyprnote.Hyprnote.desktop | 6 ++-- .../com.hyprnote.Hyprnote.metainfo.xml | 16 ++++----- .../desktop/flatpak/com.hyprnote.Hyprnote.yml | 14 ++++---- apps/desktop/src-tauri/src/lib.rs | 4 +-- .../desktop/src-tauri/tauri.conf.staging.json | 2 +- apps/desktop/src/billing.tsx | 2 +- .../src/components/chat/body/empty.tsx | 8 ++--- apps/desktop/src/components/chat/header.tsx | 2 +- .../components/devtool/seed/shared/event.ts | 6 ++-- .../components/main/body/changelog/index.tsx | 2 +- .../components/main/body/sessions/index.tsx | 2 +- .../note-input/enhanced/config-error.tsx | 2 +- .../src/components/main/body/shared.tsx | 2 +- .../main/sidebar/toast/registry.tsx | 6 ++-- .../src/components/onboarding/final.tsx | 2 +- .../src/components/onboarding/login.tsx | 2 +- .../components/settings/ai/llm/configure.tsx | 4 +-- .../src/components/settings/ai/llm/select.tsx | 2 +- .../src/components/settings/ai/llm/shared.tsx | 4 +-- .../components/settings/ai/stt/configure.tsx | 10 +++--- .../src/components/settings/ai/stt/shared.tsx | 4 +-- .../components/settings/general/account.tsx | 4 +-- .../src/components/settings/general/index.tsx | 4 +-- .../src/components/settings/integrations.tsx | 6 ++-- apps/desktop/src/hooks/useResearchMCP.ts | 2 +- apps/desktop/src/hooks/useSupportMCP.ts | 2 +- apps/desktop/src/main.tsx | 2 +- .../tinybase/persister/chat/changes.test.ts | 2 +- .../persister/factories/json-file.test.ts | 2 +- .../persister/factories/markdown-dir.test.ts | 2 +- .../factories/multi-table-dir.test.ts | 2 +- .../tinybase/persister/human/changes.test.ts | 2 +- .../persister/human/persister.test.ts | 2 +- .../persister/organization/changes.test.ts | 2 +- .../persister/organization/persister.test.ts | 2 +- .../persister/prompts/changes.test.ts | 2 +- .../persister/session/load/meta.test.ts | 12 +++---- .../tinybase/persister/shared/paths.test.ts | 36 +++++++++---------- .../store/tinybase/persister/testing/mocks.ts | 2 +- apps/desktop/src/utils/index.ts | 2 +- apps/k6/package.json | 2 +- apps/meetingsucks/src/pages/index.astro | 8 ++--- apps/pro/src/mcp.ts | 2 +- apps/pro/src/middleware/keygen.ts | 2 +- apps/slack-internal/fly.toml | 2 +- apps/slack-internal/manifest.json | 6 ++-- apps/stripe/fly.toml | 4 +-- .../scripts/stripe-backfill-entitlements.ts | 2 +- apps/web/AGENTS.md | 2 +- apps/web/content-collections.ts | 12 +++---- apps/web/content/AGENTS.md | 2 +- ...-ai-meeting-assistant-for-taking-notes.mdx | 2 +- .../bot-free-ai-meeting-assistants.mdx | 2 +- ...ilding-editorial-workflow-github-slack.mdx | 2 +- apps/web/content/articles/choosing-a-cms.mdx | 4 +-- .../developer-documentation-tools.mdx | 2 +- apps/web/content/articles/devin-ai-review.mdx | 12 +++---- apps/web/content/articles/dont-use-a-cms.mdx | 2 +- .../articles/fireflies-ai-alternatives.mdx | 2 +- .../articles/hyprnote-publishing-stack.mdx | 2 +- .../articles/mac-productivity-apps.mdx | 2 +- ...-source-meeting-transcription-software.mdx | 2 +- .../articles/plaud-ai-alternatives.mdx | 2 +- .../articles/using-ide-for-writing.mdx | 2 +- .../articles/why-our-cms-is-github.mdx | 2 +- .../web/content/changelog/1.0.0-nightly.7.mdx | 2 +- .../content/docs/about/1.what-is-hyprnote.mdx | 4 +-- .../docs/developers/11.distribution.mdx | 12 +++---- .../content/docs/developers/14.bug-report.mdx | 16 ++++----- .../docs/developers/16.local-models.mdx | 4 +-- .../content/docs/developers/18.release.mdx | 14 ++++---- apps/web/content/docs/developers/4.hooks.mdx | 18 +++++----- apps/web/content/docs/faq/0.general.mdx | 2 +- .../docs/faq/10.ai-models-and-privacy.mdx | 16 ++++----- .../content/docs/faq/11.troubleshooting.mdx | 2 +- apps/web/content/docs/faq/7.settings.mdx | 2 +- .../docs/getting-started/0.installation.mdx | 2 +- .../docs/getting-started/2.uninstall.mdx | 2 +- apps/web/content/docs/guides/0.data.mdx | 6 ++-- apps/web/content/docs/pro/0.activation.mdx | 2 +- .../docs/pro/1.better-transcription.mdx | 8 ++--- apps/web/content/docs/pro/2.cloud.mdx | 4 +-- .../handbook/onboarding/2.staging-builds.mdx | 4 +-- .../content/handbook/onboarding/5.cursor.mdx | 2 +- .../handbook/onboarding/6.gitbutler.mdx | 2 +- .../handbook/onboarding/7.claude-code.mdx | 2 +- .../content/handbook/onboarding/8.warp.mdx | 2 +- .../handbook/onboarding/9.node-and-pnpm.mdx | 2 +- .../content/hooks/afterListeningStopped.mdx | 2 +- .../content/hooks/beforeListeningStarted.mdx | 2 +- apps/web/public/llms.txt | 16 ++++----- apps/web/src/components/footer.tsx | 2 +- apps/web/src/components/header.tsx | 6 ++-- apps/web/src/components/mdx-jobs.tsx | 10 +++--- apps/web/src/components/mdx/link.tsx | 4 +-- apps/web/src/functions/github-content.ts | 4 +-- apps/web/src/functions/github-stars.ts | 2 +- apps/web/src/lib/team.ts | 12 +++---- apps/web/src/router.tsx | 2 +- apps/web/src/routes/_view/app/account.tsx | 2 +- apps/web/src/routes/_view/app/checkout.tsx | 2 +- apps/web/src/routes/_view/app/integration.tsx | 2 +- apps/web/src/routes/_view/callback/auth.tsx | 2 +- .../src/routes/_view/callback/integration.tsx | 2 +- .../src/routes/_view/company-handbook/$.tsx | 4 +-- .../_view/company-handbook/-structure.ts | 2 +- .../routes/_view/company-handbook/index.tsx | 2 +- apps/web/src/routes/_view/download/index.tsx | 4 +-- apps/web/src/routes/_view/free.tsx | 24 ++++++------- apps/web/src/routes/_view/jobs/$slug.tsx | 2 +- apps/web/src/routes/_view/jobs/index.tsx | 2 +- apps/web/src/routes/_view/opensource.tsx | 4 +-- apps/web/src/routes/_view/press-kit/index.tsx | 6 ++-- apps/web/src/routes/_view/privacy.tsx | 14 ++++---- apps/web/src/routes/_view/why-hyprnote.tsx | 2 +- apps/web/src/routes/admin/README.md | 6 ++-- apps/web/src/routes/auth.tsx | 2 +- apps/web/src/routes/bluesky.tsx | 2 +- apps/web/src/routes/contact.tsx | 2 +- apps/web/src/routes/founders.tsx | 2 +- apps/web/src/routes/reddit.tsx | 2 +- apps/web/src/utils/download.ts | 12 +++---- crates/aec/src/lib.rs | 12 +++---- crates/am/src/model.rs | 6 ++-- .../assets/research_chat.md.jinja | 2 +- .../src/mcp/prompts/research_chat.rs | 2 +- crates/api-research/src/mcp/server.rs | 6 ++-- crates/api-support/src/github.rs | 2 +- crates/api-support/src/mcp/prompts.rs | 2 +- crates/api-support/src/mcp/server.rs | 6 ++-- crates/audio-device/src/linux.rs | 4 +-- crates/audio/src/speaker/linux.rs | 4 +-- crates/buffer/src/lib.rs | 22 ++++++------ crates/db-parser/src/v0/mod.rs | 2 +- crates/db-user/assets/onboarding-raw.html | 2 +- crates/db-user/assets/thank-you.md | 2 +- crates/detect/src/app/macos.rs | 2 +- crates/detect/src/list/linux.rs | 2 +- crates/detect/src/list/mod.rs | 2 +- crates/detect/src/mic/linux.rs | 4 +-- crates/device-monitor/src/linux.rs | 4 +-- crates/eval/Cargo.toml | 2 +- crates/eval/src/cache.rs | 2 +- crates/file/src/lib.rs | 2 +- crates/gguf/src/lib.rs | 2 +- crates/host/src/lib.rs | 2 +- crates/llm-types/src/parser.rs | 4 +-- .../examples/test_notification.rs | 2 +- .../examples/test_notification_with_event.rs | 8 ++--- crates/owhisper-client/src/lib.rs | 2 +- crates/owhisper-interface/src/openapi.rs | 2 +- .../assets/chat.system.jinja | 2 +- .../template-app/assets/chat.system.md.jinja | 2 +- crates/template-app/src/chat.rs | 4 +-- .../assets/support_chat.md.jinja | 4 +-- crates/transcribe-whisper-local/src/lib.rs | 2 +- crates/turso/src/lib.rs | 2 +- crates/whisper-local-model/src/lib.rs | 14 ++++---- e2e/blackbox/package.json | 2 +- e2e/blackbox/wdio.blackbox.conf.ts | 2 +- e2e/cua/pyproject.toml | 4 +-- .../components/calendar-checkbox-row.tsx | 2 +- .../calendar/components/calendar-day.tsx | 2 +- extensions/calendar/components/day-event.tsx | 2 +- extensions/calendar/components/day-more.tsx | 2 +- .../calendar/components/day-session.tsx | 2 +- extensions/calendar/ui.tsx | 4 +-- extensions/shared/API.md | 2 +- extensions/shared/build.ts | 2 +- extensions/shared/runtime.ts | 2 +- .../shared/templates/hypr-extension.d.ts.njk | 6 ++-- extensions/shared/types/hypr-extension.d.ts | 6 ++-- packages/agent-support/src/modal/sandbox.ts | 4 +-- .../agent-support/src/modal/understand.ts | 2 +- packages/agent-support/src/prompt.promptl | 2 +- .../src/tools/understand-hyprnote-repo.ts | 12 +++---- packages/tiptap/src/shared/clipboard.ts | 4 +-- plugins/auth/src/lib.rs | 2 +- plugins/detect/src/policy.rs | 4 +-- plugins/fs-db/src/version/known.rs | 18 +++++----- plugins/fs-db/src/version/mod.rs | 4 +-- plugins/git/src/operations/local.rs | 2 +- plugins/hooks/src/event.rs | 12 +++---- plugins/importer/src/lib.rs | 4 +-- plugins/importer/src/sources/mod.rs | 2 +- plugins/importer/src/types.rs | 26 +++++++------- .../listener/src/actors/listener/adapters.rs | 6 ++-- plugins/listener/src/actors/recorder.rs | 2 +- .../listener/src/actors/session/supervisor.rs | 2 +- plugins/listener2/src/batch.rs | 4 +-- plugins/listener2/src/commands.rs | 2 +- .../local-llm/assets/onboarding-enhanced.md | 4 +-- plugins/local-llm/src/commands.rs | 2 +- plugins/local-llm/src/model.rs | 6 ++-- plugins/misc/src/lib.rs | 14 ++++---- plugins/pdf/src/typst/content.rs | 2 +- plugins/settings/src/global/path.rs | 2 +- plugins/sidecar2/src/ext.rs | 2 +- plugins/tracing/src/utils.rs | 2 +- plugins/tray/src/menu_items/tray_open.rs | 2 +- plugins/tray/src/menu_items/tray_version.rs | 6 ++-- plugins/webhook/docs/webhook-openapi.json | 10 +++--- plugins/windows/src/events.rs | 6 ++-- plugins/windows/src/window/v1.rs | 2 +- scripts/download_releases.sh | 6 ++-- scripts/info.sh | 20 +++++------ scripts/package.json | 4 +-- scripts/pyproject.toml | 4 +-- scripts/s3/cp.sh | 6 ++-- scripts/s3/delete.sh | 4 +-- scripts/s3/download.sh | 6 ++-- scripts/s3/upload.sh | 6 ++-- scripts/swap.sh | 8 ++--- scripts/yabai.sh | 10 +++--- .../003-auth-custom-access-token-hook.sql | 6 ++-- 225 files changed, 556 insertions(+), 556 deletions(-) diff --git a/.github/workflows/desktop_cd.yaml b/.github/workflows/desktop_cd.yaml index 7fb54d2975..5978fbc220 100644 --- a/.github/workflows/desktop_cd.yaml +++ b/.github/workflows/desktop_cd.yaml @@ -175,7 +175,7 @@ jobs: - if: ${{ inputs.channel == 'staging' }} uses: actions/upload-artifact@v4 with: - name: hyprnote-staging-macos-${{ matrix.artifact_name }} + name: char-staging-macos-${{ matrix.artifact_name }} path: apps/desktop/src-tauri/target/${{ matrix.target }}/release/bundle/dmg/*.dmg retention-days: 3 - if: ${{ inputs.channel == 'staging' }} @@ -270,13 +270,13 @@ jobs: - if: ${{ inputs.channel == 'staging' }} uses: actions/upload-artifact@v4 with: - name: hyprnote-staging-linux-${{ matrix.arch }}-appimage + name: char-staging-linux-${{ matrix.arch }}-appimage path: apps/desktop/src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage retention-days: 3 - if: ${{ inputs.channel == 'staging' }} uses: actions/upload-artifact@v4 with: - name: hyprnote-staging-linux-${{ matrix.arch }}-deb + name: char-staging-linux-${{ matrix.arch }}-deb path: apps/desktop/src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb retention-days: 3 @@ -325,7 +325,7 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: dmg-aarch64 - output: hyprnote-macos-aarch64.dmg + output: char-macos-aarch64.dmg key: ${{ secrets.CN_API_KEY }} - if: ${{ needs.build-macos.result == 'success' }} uses: ./.github/actions/cn_download @@ -334,7 +334,7 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: dmg-x86_64 - output: hyprnote-macos-x86_64.dmg + output: char-macos-x86_64.dmg key: ${{ secrets.CN_API_KEY }} - if: ${{ needs.build-linux.result == 'success' }} uses: ./.github/actions/cn_download @@ -343,7 +343,7 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: appimage-x86_64 - output: hyprnote-linux-x86_64.AppImage + output: char-linux-x86_64.AppImage key: ${{ secrets.CN_API_KEY }} - if: ${{ needs.build-linux.result == 'success' }} uses: ./.github/actions/cn_download @@ -352,7 +352,7 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: debian-x86_64 - output: hyprnote-linux-x86_64.deb + output: char-linux-x86_64.deb key: ${{ secrets.CN_API_KEY }} - if: ${{ needs.build-linux.result == 'success' }} uses: ./.github/actions/cn_download @@ -361,7 +361,7 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: appimage-aarch64 - output: hyprnote-linux-aarch64.AppImage + output: char-linux-aarch64.AppImage key: ${{ secrets.CN_API_KEY }} - if: ${{ needs.build-linux.result == 'success' }} uses: ./.github/actions/cn_download @@ -370,29 +370,29 @@ jobs: version: ${{ needs.compute-version.outputs.version }} channel: ${{ env.RELEASE_CHANNEL }} platform: debian-aarch64 - output: hyprnote-linux-aarch64.deb + output: char-linux-aarch64.deb key: ${{ secrets.CN_API_KEY }} - id: checksums uses: ./.github/actions/generate_checksums with: files: | - ${{ needs.build-macos.result == 'success' && 'hyprnote-macos-aarch64.dmg' || '' }} - ${{ needs.build-macos.result == 'success' && 'hyprnote-macos-x86_64.dmg' || '' }} - ${{ needs.build-linux.result == 'success' && 'hyprnote-linux-x86_64.AppImage' || '' }} - ${{ needs.build-linux.result == 'success' && 'hyprnote-linux-x86_64.deb' || '' }} - ${{ needs.build-linux.result == 'success' && 'hyprnote-linux-aarch64.AppImage' || '' }} - ${{ needs.build-linux.result == 'success' && 'hyprnote-linux-aarch64.deb' || '' }} + ${{ needs.build-macos.result == 'success' && 'char-macos-aarch64.dmg' || '' }} + ${{ needs.build-macos.result == 'success' && 'char-macos-x86_64.dmg' || '' }} + ${{ needs.build-linux.result == 'success' && 'char-linux-x86_64.AppImage' || '' }} + ${{ needs.build-linux.result == 'success' && 'char-linux-x86_64.deb' || '' }} + ${{ needs.build-linux.result == 'success' && 'char-linux-aarch64.AppImage' || '' }} + ${{ needs.build-linux.result == 'success' && 'char-linux-aarch64.deb' || '' }} - id: artifacts run: | ARTIFACTS="" if [[ "${{ needs.build-macos.result }}" == "success" ]]; then - ARTIFACTS="hyprnote-macos-aarch64.dmg,hyprnote-macos-x86_64.dmg" + ARTIFACTS="char-macos-aarch64.dmg,char-macos-x86_64.dmg" fi if [[ "${{ needs.build-linux.result }}" == "success" ]]; then if [[ -n "$ARTIFACTS" ]]; then - ARTIFACTS="$ARTIFACTS,hyprnote-linux-x86_64.AppImage,hyprnote-linux-x86_64.deb,hyprnote-linux-aarch64.AppImage,hyprnote-linux-aarch64.deb" + ARTIFACTS="$ARTIFACTS,char-linux-x86_64.AppImage,char-linux-x86_64.deb,char-linux-aarch64.AppImage,char-linux-aarch64.deb" else - ARTIFACTS="hyprnote-linux-x86_64.AppImage,hyprnote-linux-x86_64.deb,hyprnote-linux-aarch64.AppImage,hyprnote-linux-aarch64.deb" + ARTIFACTS="char-linux-x86_64.AppImage,char-linux-x86_64.deb,char-linux-aarch64.AppImage,char-linux-aarch64.deb" fi fi if [[ -z "$ARTIFACTS" ]]; then diff --git a/.github/workflows/desktop_publish.yaml b/.github/workflows/desktop_publish.yaml index a014d9dff9..21b8f70272 100644 --- a/.github/workflows/desktop_publish.yaml +++ b/.github/workflows/desktop_publish.yaml @@ -55,7 +55,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: dmg-aarch64 - output: hyprnote-macos-aarch64.dmg + output: char-macos-aarch64.dmg key: ${{ secrets.CN_API_KEY }} - id: download-macos-x86_64 continue-on-error: true @@ -65,7 +65,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: dmg-x86_64 - output: hyprnote-macos-x86_64.dmg + output: char-macos-x86_64.dmg key: ${{ secrets.CN_API_KEY }} - id: download-linux-appimage continue-on-error: true @@ -75,7 +75,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: appimage-x86_64 - output: hyprnote-linux-x86_64.AppImage + output: char-linux-x86_64.AppImage key: ${{ secrets.CN_API_KEY }} - id: download-linux-deb continue-on-error: true @@ -85,7 +85,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: debian-x86_64 - output: hyprnote-linux-x86_64.deb + output: char-linux-x86_64.deb key: ${{ secrets.CN_API_KEY }} - id: download-linux-appimage-aarch64 continue-on-error: true @@ -95,7 +95,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: appimage-aarch64 - output: hyprnote-linux-aarch64.AppImage + output: char-linux-aarch64.AppImage key: ${{ secrets.CN_API_KEY }} - id: download-linux-deb-aarch64 continue-on-error: true @@ -105,7 +105,7 @@ jobs: version: ${{ needs.parse.outputs.version }} channel: ${{ needs.parse.outputs.channel }} platform: debian-aarch64 - output: hyprnote-linux-aarch64.deb + output: char-linux-aarch64.deb key: ${{ secrets.CN_API_KEY }} - id: check-downloads run: | @@ -127,23 +127,23 @@ jobs: uses: ./.github/actions/generate_checksums with: files: | - ${{ steps.check-downloads.outputs.macos == 'true' && 'hyprnote-macos-aarch64.dmg' || '' }} - ${{ steps.check-downloads.outputs.macos == 'true' && 'hyprnote-macos-x86_64.dmg' || '' }} - ${{ steps.check-downloads.outputs.linux == 'true' && 'hyprnote-linux-x86_64.AppImage' || '' }} - ${{ steps.check-downloads.outputs.linux == 'true' && 'hyprnote-linux-x86_64.deb' || '' }} - ${{ steps.check-downloads.outputs.linux == 'true' && 'hyprnote-linux-aarch64.AppImage' || '' }} - ${{ steps.check-downloads.outputs.linux == 'true' && 'hyprnote-linux-aarch64.deb' || '' }} + ${{ steps.check-downloads.outputs.macos == 'true' && 'char-macos-aarch64.dmg' || '' }} + ${{ steps.check-downloads.outputs.macos == 'true' && 'char-macos-x86_64.dmg' || '' }} + ${{ steps.check-downloads.outputs.linux == 'true' && 'char-linux-x86_64.AppImage' || '' }} + ${{ steps.check-downloads.outputs.linux == 'true' && 'char-linux-x86_64.deb' || '' }} + ${{ steps.check-downloads.outputs.linux == 'true' && 'char-linux-aarch64.AppImage' || '' }} + ${{ steps.check-downloads.outputs.linux == 'true' && 'char-linux-aarch64.deb' || '' }} - id: artifacts run: | ARTIFACTS="" if [[ "${{ steps.check-downloads.outputs.macos }}" == "true" ]]; then - ARTIFACTS="hyprnote-macos-aarch64.dmg,hyprnote-macos-x86_64.dmg" + ARTIFACTS="char-macos-aarch64.dmg,char-macos-x86_64.dmg" fi if [[ "${{ steps.check-downloads.outputs.linux }}" == "true" ]]; then if [[ -n "$ARTIFACTS" ]]; then - ARTIFACTS="$ARTIFACTS,hyprnote-linux-x86_64.AppImage,hyprnote-linux-x86_64.deb,hyprnote-linux-aarch64.AppImage,hyprnote-linux-aarch64.deb" + ARTIFACTS="$ARTIFACTS,char-linux-x86_64.AppImage,char-linux-x86_64.deb,char-linux-aarch64.AppImage,char-linux-aarch64.deb" else - ARTIFACTS="hyprnote-linux-x86_64.AppImage,hyprnote-linux-x86_64.deb,hyprnote-linux-aarch64.AppImage,hyprnote-linux-aarch64.deb" + ARTIFACTS="char-linux-x86_64.AppImage,char-linux-x86_64.deb,char-linux-aarch64.AppImage,char-linux-aarch64.deb" fi fi if [[ -z "$ARTIFACTS" ]]; then diff --git a/LICENSE b/LICENSE index 1aa764fbbf..bc9d4c5050 100644 --- a/LICENSE +++ b/LICENSE @@ -631,7 +631,7 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Hyprnote Copyright (C) 2023-present Fastrepl, Inc. + Char Copyright (C) 2023-present Fastrepl, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -651,7 +651,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Hyprnote Copyright (C) 2023-present Fastrepl, Inc. + Char Copyright (C) 2023-present Fastrepl, Inc. This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/README.md b/README.md index 0a9039c213..0e1c3ac099 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

Char - The AI notepad for private meetings

- Ask DeepWiki + Ask DeepWiki Discord X

@@ -23,12 +23,12 @@ You can also use it for taking notes for lectures or organizing your thoughts. ## Installation ```bash -brew install --cask fastrepl/hyprnote/hyprnote@nightly +brew install --cask fastrepl/char/char@nightly ``` - [macOS](https://hyprnote.com/download) (public beta) -- [Windows](https://github.com/fastrepl/hyprnote/issues/66) (q1 2026) -- [Linux](https://github.com/fastrepl/hyprnote/issues/67) (q1 2026) +- [Windows](https://github.com/fastrepl/char/issues/66) (q1 2026) +- [Linux](https://github.com/fastrepl/char/issues/67) (q1 2026) ## Highlights @@ -72,7 +72,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://hyprnote.com/templates) and add your own [here](https://github.com/fastrepl/hyprnote/tree/main/apps/web/content/templates). +Check out our [template gallery](https://hyprnote.com/templates) and add your own [here](https://github.com/fastrepl/char/tree/main/apps/web/content/templates). ### AI Chat diff --git a/Taskfile.yaml b/Taskfile.yaml index 2af7426b60..5e79f4a05e 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -13,7 +13,7 @@ tasks: - stripe listen --print-secret | tr -d '\r\n' | (echo -n 'STRIPE_WEBHOOK_SECRET="'; cat; echo '"') > .env.stripe - stripe listen --skip-verify --forward-to http://localhost:8788/webhook/stripe bacon: bacon {{.CLI_ARGS}} - stat: btop -f hyprnote -u 500 --preset 1 + stat: btop -f char -u 500 --preset 1 clean-plugins: cmds: @@ -54,7 +54,7 @@ tasks: db: env: - DB: /Users/yujonglee/Library/Application Support/hyprnote/db.sqlite + DB: /Users/yujonglee/Library/Application Support/char/db.sqlite cmds: - | sqlite3 -json "$DB" 'SELECT store FROM main LIMIT 1;' | diff --git a/apps/api/AGENTS.md b/apps/api/AGENTS.md index 0f6fe28c2c..d0e31dcd4a 100644 --- a/apps/api/AGENTS.md +++ b/apps/api/AGENTS.md @@ -1,5 +1,5 @@ ```bash -# REPO="SOMEWHERE" ($HOME/repos/hyprnote inside Devin) +# REPO="SOMEWHERE" ($HOME/repos/char inside Devin) infisical export \ --env=dev \ --secret-overriding=false \ diff --git a/apps/api/fly.toml b/apps/api/fly.toml index ab4530fc40..bf01aa769b 100644 --- a/apps/api/fly.toml +++ b/apps/api/fly.toml @@ -1,4 +1,4 @@ -app = 'hyprnote-ai' +app = 'char-ai' primary_region = 'sjc' kill_signal = 'SIGTERM' kill_timeout = 30 diff --git a/apps/api/src/main.rs b/apps/api/src/main.rs index 679f6f7b12..a7e469abae 100644 --- a/apps/api/src/main.rs +++ b/apps/api/src/main.rs @@ -39,7 +39,7 @@ async fn app() -> Router { let llm_config = hypr_llm_proxy::LlmProxyConfig::new(&env.llm).with_analytics(analytics.clone()); let stt_config = hypr_transcribe_proxy::SttProxyConfig::new(&env.stt, &env.supabase) - .with_hyprnote_routing(hypr_transcribe_proxy::HyprnoteRoutingConfig::default()) + .with_hyprnote_routing(hypr_transcribe_proxy::CharRoutingConfig::default()) .with_analytics(analytics); let stt_rate_limit = rate_limit::RateLimitState::builder() @@ -275,7 +275,7 @@ fn main() -> std::io::Result<()> { let _guard = sentry::init(sentry::ClientOptions { dsn: env.sentry_dsn.as_ref().and_then(|s| s.parse().ok()), - release: option_env!("APP_VERSION").map(|v| format!("hyprnote-api@{}", v).into()), + release: option_env!("APP_VERSION").map(|v| format!("char-api@{}", v).into()), environment: Some( if cfg!(debug_assertions) { "development" @@ -295,7 +295,7 @@ fn main() -> std::io::Result<()> { }); sentry::configure_scope(|scope| { - scope.set_tag("service", "hyprnote-api"); + scope.set_tag("service", "char-api"); }); tracing_subscriber::registry() diff --git a/apps/api/src/openapi.rs b/apps/api/src/openapi.rs index d63ea4fb98..52d0bea2dd 100644 --- a/apps/api/src/openapi.rs +++ b/apps/api/src/openapi.rs @@ -9,7 +9,7 @@ use utoipa::{Modify, OpenApi}; #[derive(OpenApi)] #[openapi( info( - title = "Hyprnote AI API", + title = "Char AI API", version = "1.0.0", description = "AI services API for speech-to-text transcription, LLM chat completions, and subscription management" ), diff --git a/apps/bot/fly.toml b/apps/bot/fly.toml index 72261d9c9c..ab42763c75 100644 --- a/apps/bot/fly.toml +++ b/apps/bot/fly.toml @@ -1,9 +1,9 @@ -# fly.toml app configuration file generated for hyprnote-bot on 2025-11-30T18:55:28+09:00 +# fly.toml app configuration file generated for char-bot on 2025-11-30T18:55:28+09:00 # # See https://fly.io/docs/reference/configuration/ for information about how to use this file. # -app = 'hyprnote-bot' +app = 'char-bot' primary_region = 'sjc' [build] diff --git a/apps/desktop/flatpak/com.hyprnote.Hyprnote.desktop b/apps/desktop/flatpak/com.hyprnote.Hyprnote.desktop index d1b88fe418..252a6df567 100644 --- a/apps/desktop/flatpak/com.hyprnote.Hyprnote.desktop +++ b/apps/desktop/flatpak/com.hyprnote.Hyprnote.desktop @@ -1,13 +1,13 @@ [Desktop Entry] -Name=Hyprnote +Name=Char GenericName=AI Meeting Notes Comment=The AI notepad for private meetings -Exec=hyprnote %U +Exec=char %U Icon=com.hyprnote.Hyprnote Terminal=false Type=Application Categories=Office;AudioVideo;Recorder; Keywords=notes;meeting;transcription;ai;audio;recording; StartupNotify=true -StartupWMClass=hyprnote +StartupWMClass=char MimeType=x-scheme-handler/hypr; diff --git a/apps/desktop/flatpak/com.hyprnote.Hyprnote.metainfo.xml b/apps/desktop/flatpak/com.hyprnote.Hyprnote.metainfo.xml index a543934dd5..78422e07c9 100644 --- a/apps/desktop/flatpak/com.hyprnote.Hyprnote.metainfo.xml +++ b/apps/desktop/flatpak/com.hyprnote.Hyprnote.metainfo.xml @@ -2,7 +2,7 @@ com.hyprnote.Hyprnote - Hyprnote + Char The AI notepad for private meetings CC0-1.0 @@ -10,13 +10,13 @@

- Hyprnote is an AI notetaking app specifically designed to take meeting notes. - With Hyprnote, you can transcribe all kinds of meetings whether it be online or offline. + Char is an AI notetaking app specifically designed to take meeting notes. + With Char, you can transcribe all kinds of meetings whether it be online or offline.

Features:

  • Listens to your meetings so you can only jot down important stuff
  • -
  • No bots joining your meetings - Hyprnote listens directly to sounds coming in and out of your computer
  • +
  • No bots joining your meetings - Char listens directly to sounds coming in and out of your computer
  • Crafts perfect summaries based on your memos, right after the meeting is over
  • Run completely offline by using LM Studio or Ollama
  • Bring your own LLM - use local models via Ollama or third-party APIs like Gemini, Claude, or Azure-hosted GPT
  • @@ -28,11 +28,11 @@ com.hyprnote.Hyprnote.desktop https://hyprnote.com - https://github.com/fastrepl/hyprnote/issues - https://github.com/fastrepl/hyprnote - https://github.com/fastrepl/hyprnote/blob/main/CONTRIBUTING.md + https://github.com/fastrepl/char/issues + https://github.com/fastrepl/char + https://github.com/fastrepl/char/blob/main/CONTRIBUTING.md - + Fastrepl diff --git a/apps/desktop/flatpak/com.hyprnote.Hyprnote.yml b/apps/desktop/flatpak/com.hyprnote.Hyprnote.yml index ddc088dbbe..80049d04fe 100644 --- a/apps/desktop/flatpak/com.hyprnote.Hyprnote.yml +++ b/apps/desktop/flatpak/com.hyprnote.Hyprnote.yml @@ -1,4 +1,4 @@ -# Flatpak manifest for Hyprnote +# Flatpak manifest for Char # https://docs.flathub.org/docs/for-app-authors/requirements # # To generate vendored dependencies: @@ -20,7 +20,7 @@ sdk-extensions: - org.freedesktop.Sdk.Extension.rust-stable - org.freedesktop.Sdk.Extension.node22 -command: hyprnote +command: char finish-args: # Display - Wayland and X11 fallback @@ -54,11 +54,11 @@ finish-args: build-options: append-path: /usr/lib/sdk/node22/bin:/usr/lib/sdk/rust-stable/bin env: - CARGO_HOME: /run/build/hyprnote/cargo + CARGO_HOME: /run/build/char/cargo npm_config_nodedir: /usr/lib/sdk/node22 modules: - - name: hyprnote + - name: char buildsystem: simple sources: @@ -77,8 +77,8 @@ modules: build-options: env: - XDG_CACHE_HOME: /run/build/hyprnote/cache - npm_config_cache: /run/build/hyprnote/npm-cache + XDG_CACHE_HOME: /run/build/char/cache + npm_config_cache: /run/build/char/npm-cache npm_config_offline: "true" build-commands: @@ -92,7 +92,7 @@ modules: - pnpm -F desktop tauri build --no-bundle --target x86_64-unknown-linux-gnu --config src-tauri/tauri.conf.flatpak.json # Install the binary - - install -Dm755 apps/desktop/src-tauri/target/x86_64-unknown-linux-gnu/release/hyprnote /app/bin/hyprnote + - install -Dm755 apps/desktop/src-tauri/target/x86_64-unknown-linux-gnu/release/char /app/bin/char # Install desktop file - install -Dm644 apps/desktop/flatpak/com.hyprnote.Hyprnote.desktop /app/share/applications/com.hyprnote.Hyprnote.desktop diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 75e7323982..2230070f8a 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -28,7 +28,7 @@ pub async fn main() { if let Some(dsn) = dsn { let release = - option_env!("APP_VERSION").map(|v| format!("hyprnote-desktop@{}", v).into()); + option_env!("APP_VERSION").map(|v| format!("char-desktop@{}", v).into()); let client = sentry::init(( dsn, @@ -41,7 +41,7 @@ pub async fn main() { )); sentry::configure_scope(|scope| { - scope.set_tag("service", "hyprnote-desktop"); + scope.set_tag("service", "char-desktop"); scope.set_user(Some(sentry::User { id: Some(hypr_host::fingerprint()), ..Default::default() diff --git a/apps/desktop/src-tauri/tauri.conf.staging.json b/apps/desktop/src-tauri/tauri.conf.staging.json index 3878805668..de679985f6 100644 --- a/apps/desktop/src-tauri/tauri.conf.staging.json +++ b/apps/desktop/src-tauri/tauri.conf.staging.json @@ -5,7 +5,7 @@ "identifier": "com.hyprnote.staging", "plugins": { "deep-link": { - "desktop": { "schemes": ["hyprnote-staging"] } + "desktop": { "schemes": ["char-staging"] } }, "updater": { "active": false diff --git a/apps/desktop/src/billing.tsx b/apps/desktop/src/billing.tsx index b88b096c11..5d99a9bb11 100644 --- a/apps/desktop/src/billing.tsx +++ b/apps/desktop/src/billing.tsx @@ -68,7 +68,7 @@ export function BillingProvider({ children }: { children: ReactNode }) { const tokenInfo = tokenInfoQuery.data ?? DEFAULT_TOKEN_INFO; const entitlements = tokenInfo.entitlements ?? []; const subscriptionStatus = tokenInfo.subscription_status ?? null; - const isPro = entitlements.includes("hyprnote_pro"); + const isPro = entitlements.includes("char_pro"); const isTrialing = subscriptionStatus === "trialing"; const trialDaysRemaining = useMemo(() => { diff --git a/apps/desktop/src/components/chat/body/empty.tsx b/apps/desktop/src/components/chat/body/empty.tsx index ef800fb29d..72efc20efc 100644 --- a/apps/desktop/src/components/chat/body/empty.tsx +++ b/apps/desktop/src/components/chat/body/empty.tsx @@ -27,9 +27,9 @@ export function ChatBodyEmpty({
    - Hyprnote + Char - Hyprnote AI + Char AI

    @@ -52,9 +52,9 @@ export function ChatBodyEmpty({

    - Hyprnote + Char - Hyprnote AI + Char AI

    diff --git a/apps/desktop/src/components/chat/header.tsx b/apps/desktop/src/components/chat/header.tsx index 4a0e152935..c9e7fbf7d2 100644 --- a/apps/desktop/src/components/chat/header.tsx +++ b/apps/desktop/src/components/chat/header.tsx @@ -123,7 +123,7 @@ function ChatGroups({ >

    - {currentChatTitle || "Ask Hyprnote anything"} + {currentChatTitle || "Ask Char anything"}

    { let note: string | undefined; if (meetingType === "online" || meetingType === "hybrid") { - meeting_link = `https://hyprnote.${provider.domain}/${meetingPath}`; + meeting_link = `https://char.${provider.domain}/${meetingPath}`; note = provider.generateInvite({ title, host, diff --git a/apps/desktop/src/components/main/body/changelog/index.tsx b/apps/desktop/src/components/main/body/changelog/index.tsx index 1dec261f30..e1d02a21e6 100644 --- a/apps/desktop/src/components/main/body/changelog/index.tsx +++ b/apps/desktop/src/components/main/body/changelog/index.tsx @@ -198,7 +198,7 @@ function ChangelogHeader({ async function fetchChangelogFromGitHub( version: string, ): Promise { - const url = `https://raw.githubusercontent.com/fastrepl/hyprnote/main/apps/web/content/changelog/${version}.mdx`; + const url = `https://raw.githubusercontent.com/fastrepl/char/main/apps/web/content/changelog/${version}.mdx`; try { const response = await fetch(url); if (!response.ok) { diff --git a/apps/desktop/src/components/main/body/sessions/index.tsx b/apps/desktop/src/components/main/body/sessions/index.tsx index 0b0eac1537..5a757a5c5c 100644 --- a/apps/desktop/src/components/main/body/sessions/index.tsx +++ b/apps/desktop/src/components/main/body/sessions/index.tsx @@ -328,7 +328,7 @@ function StatusBanner({ showTimeline ? "bottom-[76px]" : "bottom-6", ])} > - {skipReason || "Ask for consent when using Hyprnote"} + {skipReason || "Ask for consent when using Char"} )} , diff --git a/apps/desktop/src/components/main/body/sessions/note-input/enhanced/config-error.tsx b/apps/desktop/src/components/main/body/sessions/note-input/enhanced/config-error.tsx index 9d29b043a2..eb95ee4878 100644 --- a/apps/desktop/src/components/main/body/sessions/note-input/enhanced/config-error.tsx +++ b/apps/desktop/src/components/main/body/sessions/note-input/enhanced/config-error.tsx @@ -41,7 +41,7 @@ function getMessageForStatus(status: LLMConnectionStatus): string { } if (status.status === "error" && status.reason === "unauthenticated") { - return "You need to sign in to use Hyprnote's language model"; + return "You need to sign in to use Char's language model"; } if (status.status === "error" && status.reason === "missing_config") { diff --git a/apps/desktop/src/components/main/body/shared.tsx b/apps/desktop/src/components/main/body/shared.tsx index f89fe0eeb1..28a705ea81 100644 --- a/apps/desktop/src/components/main/body/shared.tsx +++ b/apps/desktop/src/components/main/body/shared.tsx @@ -307,7 +307,7 @@ export function TabItemBase({ >

    - Are you sure you want to close this tab? This will stop Hyprnote + Are you sure you want to close this tab? This will stop Char from listening.