Skip to content

Rebrand app as Charm#45

Merged
Just-Insane merged 4 commits into
integrationfrom
codex/charm-branding
Jun 13, 2026
Merged

Rebrand app as Charm#45
Just-Insane merged 4 commits into
integrationfrom
codex/charm-branding

Conversation

@Just-Insane

@Just-Insane Just-Insane commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

Description

Rebrands the fork-local app identity from Sable to Charm while keeping attribution to Sable and Cinny intact.

Changes included:

  • Adds centralized app branding constants for the visible app name, attribution, source links, and Charm URL.
  • Updates web metadata, PWA manifest, auth/welcome/about copy, Sentry app tag, Tauri product identity, Android labels, deep-link scheme, and push app IDs.
  • Regenerates web, desktop, iOS, and Android icon assets with a new Charm talisman/chat mark.
  • Updates repo metadata and docs to lead with Charm, including README, package metadata, Tauri package metadata, privacy/security docs, GitHub templates/prompts, and Cloudflare worker defaults.
  • Removes Sable homeserver/community defaults from config.json while keeping Sable-compatible theme catalog/package namespaces where they are still functional dependencies.
  • Adds docs/BRANDING.md documenting the Charm identity, required fork attribution, and compatibility names that intentionally still use Sable prefixes.

Pre-PR research: searched existing PRs for Charm, branding, app.sable.moe, and cloudhub; no active overlap found. GitHub issues are disabled for this repository.

Cloudflare follow-up: code and OpenTofu examples now use charm.cloudhub.social. The live charm.cloudhub.social DNS/custom-domain change was handled outside this PR; the old sable subdomain remains untouched for now.

Changeset line: chore: rebrand app as Charm

Fixes N/A

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings

Validation:

  • pnpm fmt:check
  • pnpm lint (0 errors; existing unrelated warnings remain)
  • pnpm typecheck
  • pnpm test:run
  • pnpm knip
  • pnpm build

AI disclosure:

  • Partially AI assisted (clarify which code was AI assisted and briefly explain what it does).
  • Fully AI generated (explain what all the generated code does in moderate detail).

Codex assisted with the mechanical rebrand, generated replacement icon assets, updated app metadata/configuration, and ran the validation commands listed above.

@Just-Insane Just-Insane marked this pull request as ready for review June 13, 2026 21:22
@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown

OpenTofu plan for production

Plan: 3 to add, 1 to change, 3 to destroy. Changes to Outputs.
OpenTofu used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
!~  update in-place (current -> planned)
-/+ destroy and then create replacement

OpenTofu will perform the following actions:

  # cloudflare_worker.site will be updated in-place
!~  resource "cloudflare_worker" "site" {
        id             = "b271262a5f9c4e20bb638ca6c85016ce"
!~      name           = "sable" -> "charm"
!~      references     = {
!~          dispatch_namespace_outbounds = [] -> (known after apply)
!~          domains                      = [
-               {
-                   hostname  = "dev.cloudhub.social" -> null
-                   id        = "51d812a56d1e0c6d75401e9c098e2cf25b851640" -> null
-                   zone_id   = "b5291fcda7577f07953290966ae83d20" -> null
-                   zone_name = "cloudhub.social" -> null
                },
            ] -> (known after apply)
!~          durable_objects              = [] -> (known after apply)
!~          queues                       = [] -> (known after apply)
!~          workers                      = [] -> (known after apply)
        } -> (known after apply)
        tags           = []
!~      updated_on     = "2026-06-13T21:21:41Z" -> (known after apply)
#        (6 unchanged attributes hidden)
    }

  # cloudflare_worker_version.site must be replaced
-/+ resource "cloudflare_worker_version" "site" {
!~      annotations         = {
+           workers_message      = (known after apply)
+           workers_tag          = (known after apply)
!~          workers_triggered_by = "create_version_api" -> (known after apply)
        } -> (known after apply)
!~      assets              = { # forces replacement
!~          asset_manifest_sha256 = "941cb815465ce7006f178976d52f9a1c238e6ea836d07c672c7c50f69b55d529" -> "f5089b6e402f634aa045cbcf30ed7295584789a804ce51733582a2bf67f97690" # forces replacement
!~          directory             = "/home/runner/work/Sable/Sable/dist" -> "/github/workspace/dist"
#            (1 unchanged attribute hidden)
        }
+       compatibility_flags = (known after apply)
!~      created_on          = "2026-03-21T22:32:49Z" -> (known after apply)
!~      id                  = "************************************" -> (known after apply)
+       limits              = (known after apply)
+       main_script_base64  = (known after apply)
!~      number              = 9 -> (known after apply)
!~      source              = "terraform" -> (known after apply)
+       startup_time_ms     = (known after apply)
#        (4 unchanged attributes hidden)
    }

  # cloudflare_workers_custom_domain.site must be replaced
-/+ resource "cloudflare_workers_custom_domain" "site" {
!~      id          = "****************************************" -> (known after apply)
!~      service     = "sable" -> "charm" # forces replacement
!~      zone_name   = "cloudhub.social" -> (known after apply)
#        (4 unchanged attributes hidden)
    }

  # cloudflare_workers_deployment.site must be replaced
-/+ resource "cloudflare_workers_deployment" "site" {
!~      annotations  = { # forces replacement
!~          workers_message      = "92fe2adb7b5c3a5201dcc3ad3e9bb4b3f9d0430b" -> "Rebrand app as Charm"
!~          workers_triggered_by = "deployment" -> (known after apply)
        }
+       author_email = (known after apply)
!~      created_on   = "2026-03-21T22:32:49Z" -> (known after apply)
!~      id           = "************************************" -> (known after apply)
!~      script_name  = "sable" -> "charm" # forces replacement
!~      source       = "terraform" -> (known after apply)
!~      versions     = [ # forces replacement
!~          {
!~              version_id = "************************************" -> (known after apply)
#                (1 unchanged attribute hidden)
            },
        ]
#        (2 unchanged attributes hidden)
    }

Plan: 3 to add, 1 to change, 3 to destroy.

Changes to Outputs:
!~  worker_name   = "sable" -> "charm"

Warning: Attribute Deprecated

  with cloudflare_workers_custom_domain.site,
  on main.tf line 41, in resource "cloudflare_workers_custom_domain" "site":
  41:   environment = "production"

This attribute is deprecated.

(and one more similar warning elsewhere)

📝 Plan generated in Cloudflare Infra #200

Comment on lines 1 to 8
import { SSO_CALLBACK_PATH } from '$pages/paths';
import { APP_SUPPORT_URL } from '$app/config/brand';
import { type as osType } from '@tauri-apps/plugin-os';

const TAURI_SSO_PROTOCOL = 'sable:';
const TAURI_SSO_PROTOCOL = 'charm:';
const TAURI_SSO_HOST = 'login';

const getAppBaseUrl = (): string => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The SSOCallback.tsx component uses a hardcoded sable:// protocol for the SSO redirect, but the Tauri app is configured for charm://, breaking the desktop login flow.
Severity: CRITICAL

Suggested Fix

In SSOCallback.tsx, replace the hardcoded sable:// protocol with charm:// for the deep-link redirect to match the protocol defined in SSOTauri.ts and registered in tauri.conf.json. Additionally, update the user-facing text in SSOCallback.tsx that incorrectly refers to "Sable".

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: src/app/pages/auth/SSOTauri.ts#L1-L8

Potential issue: The Single Sign-On (SSO) flow for the Tauri desktop application is
broken due to a protocol mismatch. The `SSOTauri.ts` file correctly builds a redirect
URL using the `charm://` protocol. However, after successful authentication with the
identity provider, the `SSOCallback.tsx` component attempts to redirect back to the
application using a hardcoded `sable://` protocol. The application's configuration in
`tauri.conf.json` only registers a handler for the `charm://` scheme. Consequently, the
operating system cannot open the `sable://` deep-link, preventing the login token from
being delivered to the app and causing the SSO login to fail for all desktop users.

Also affects:

  • src-tauri/tauri.conf.json:43~53

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

✅ Worker preview upload completed, but Wrangler did not return a resolvable aliased preview URL.

Alias: pr-45
Commit: 33bd144
Updated: Sat, 13 Jun 2026 21:29:19 GMT

@Just-Insane Just-Insane merged commit e9655e2 into integration Jun 13, 2026
15 checks passed
@Just-Insane Just-Insane deleted the codex/charm-branding branch June 13, 2026 21:31

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 43808a4eec

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

import { type as osType } from '@tauri-apps/plugin-os';

const TAURI_SSO_PROTOCOL = 'sable:';
const TAURI_SSO_PROTOCOL = 'charm:';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the hosted SSO callback scheme in sync

For production desktop Tauri SSO, buildTauriSsoRedirectUrl() now sends the homeserver to the hosted Charm callback, but SSOCallback.tsx still opens sable://login...; with this change the app now registers and parses only the charm: scheme, so the hosted callback will not deliver the login token back to the desktop app and SSO login/register cannot complete in that flow.

Useful? React with 👍 / 👎.

Comment thread config.json
"unifiedPushAppID": "moe.sable.up"
"pushNotifyUrl": "https://sygnal.cloudhub.social/_matrix/push/v1/notify",
"vapidPublicKey": "BEBdK6VUiqYxcOauFCM1ZB38llgiODAs6pR5EEcC7YBoUh2YvrULagwo5t-Ms0Is0lEmKDhpdUoMiy_i7ArI3oE",
"webPushAppID": "social.cloudhub.charm.web",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Migrate existing web push registrations

For users who already enabled web push before this rebrand, the homeserver pusher is still registered under the old moe.sable.app.sygnal app ID, but the disable path now only deletes clientConfig.pushNotificationDetails.webPushAppID from the current config (disablePushNotifications() builds the kind: null request from that value). Those users can continue receiving notifications after turning Charm notifications off, or keep a stale pusher alongside the new one, unless this change also removes/migrates the old app ID.

Useful? React with 👍 / 👎.

Comment thread src/app/config/brand.ts
export const APP_DESCRIPTION = 'A personal Matrix client with a little magic.';
export const APP_ATTRIBUTION =
'Independently maintained by Evie Gauthier. Based on Sable, an AGPLv3 Matrix client forked from Cinny.';
export const APP_SOURCE_URL = 'https://github.com/Just-Insane/Sable';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Route in-app bug reports to the fork

This centralizes the fork source URL, but the app's bug-report modal still hard-codes SableClient/Sable (checked src/app/features/bug-report/BugReportModal.tsx), so reports opened from the About page still go to upstream Sable and include Sable platform text instead of Charm's repo. Please route that modal through the new brand repo constant as well.

Useful? React with 👍 / 👎.

Comment thread tsconfig.json
"$plugins/*": ["./src/app/plugins/*"],
"$components/*": ["./src/app/components/*"],
"$features/*": ["./src/app/features/*"],
"$app/*": ["./src/app/*"],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add the new alias to Vitest too

The new $app/* imports work for Vite and tsc, but Vitest has its own alias table and this change did not add $app there (checked vitest.config.ts). Any test that imports the rebranded About/Auth/Welcome/SSO modules now fails to resolve $app/config/brand, so the test runner config needs the same alias.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant