Charm is a personal Matrix client distribution maintained by the CloudHub Social Team for the CloudHub domain. It is based on Sable, an AGPLv3 Matrix client forked from Cinny.
The hosted web app lives at charm.cloudhub.social.
Charm is maintained by CloudHub Social and is not an official Sable or Cinny release. When describing this distribution, use:
Maintained by the CloudHub Social Team. Based on Sable, an AGPLv3 Matrix client forked from Cinny.
You can self-host Charm by building the web app and serving the dist/ directory
from any static web server.
pnpm i
pnpm run buildThe runtime configuration is loaded from config.json. You can
use it to change default homeservers, featured rooms and spaces, the account
switcher, push notification settings, and experimental feature toggles.
If you want to enable the GIF picker, follow docs/gif-picker-setup.md
to deploy the proxy worker and configure a real Klipy API key.
While the default settings are recommended for most users, you can optionally
add a top-level "settingsDefaults" object whose keys match
client settings. Only fields you include are
overridden. Existing local settings and Matrix account-data synced settings keep
their current values.
{
"settingsDefaults": {
"hour24Clock": true,
"pageZoom": 110,
"messageLayout": 2,
"rightSwipeAction": "members",
"captionPosition": "below",
"renderUserCards": "both",
"jumboEmojiSize": "large"
}
}Invalid or unknown keys are ignored.
To deploy under a subdirectory, update the base path in
build.config.ts and rebuild the app.
Tip
Use the Node version defined in .node-version. A version
manager such as fnm keeps this reproducible.
fnm use --corepack-enabled
corepack install
pnpm i
pnpm run devTo build the app:
pnpm run buildDeployment workflows and Cloudflare infrastructure details live in
infra/README.md.
Some internal names intentionally still use Sable namespaces:
sable_*localStorage keys preserve existing diagnostics and settings choices.moe.sable.*Matrix account-data/event namespaces preserve synced settings compatibility..sable.csstheme filenames and@sable-thememetadata remain compatible with the Sable theme ecosystem.- Dependencies published under
@sableclient/*and SableClient GitHub URLs stay pinned until Charm-specific forks exist.