Rebrand app as Charm#45
Conversation
|
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 |
| 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 => { |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
💡 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:'; |
There was a problem hiding this comment.
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 👍 / 👎.
| "unifiedPushAppID": "moe.sable.up" | ||
| "pushNotifyUrl": "https://sygnal.cloudhub.social/_matrix/push/v1/notify", | ||
| "vapidPublicKey": "BEBdK6VUiqYxcOauFCM1ZB38llgiODAs6pR5EEcC7YBoUh2YvrULagwo5t-Ms0Is0lEmKDhpdUoMiy_i7ArI3oE", | ||
| "webPushAppID": "social.cloudhub.charm.web", |
There was a problem hiding this comment.
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 👍 / 👎.
| 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'; |
There was a problem hiding this comment.
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 👍 / 👎.
| "$plugins/*": ["./src/app/plugins/*"], | ||
| "$components/*": ["./src/app/components/*"], | ||
| "$features/*": ["./src/app/features/*"], | ||
| "$app/*": ["./src/app/*"], |
There was a problem hiding this comment.
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 👍 / 👎.
Description
Rebrands the fork-local app identity from Sable to Charm while keeping attribution to Sable and Cinny intact.
Changes included:
config.jsonwhile keeping Sable-compatible theme catalog/package namespaces where they are still functional dependencies.docs/BRANDING.mddocumenting 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, andcloudhub; no active overlap found. GitHub issues are disabled for this repository.Cloudflare follow-up: code and OpenTofu examples now use
charm.cloudhub.social. The livecharm.cloudhub.socialDNS/custom-domain change was handled outside this PR; the oldsablesubdomain remains untouched for now.Changeset line: chore: rebrand app as Charm
Fixes N/A
Type of change
Checklist:
Validation:
pnpm fmt:checkpnpm lint(0 errors; existing unrelated warnings remain)pnpm typecheckpnpm test:runpnpm knippnpm buildAI disclosure:
Codex assisted with the mechanical rebrand, generated replacement icon assets, updated app metadata/configuration, and ran the validation commands listed above.