- TypeScript 95.7%
- Rust 2.8%
- JavaScript 0.6%
- CSS 0.3%
- Kotlin 0.2%
- Other 0.3%
<!-- Please read https://github.com/SableClient/Sable/blob/dev/CONTRIBUTING.md before submitting your pull request --> ### Description This is a 2 line fix for the previous thing for this message specifically that i saw and then reproduced and checked for everything i can think of <img width="1355" height="23" alt="image" src="https://github.com/user-attachments/assets/6f97c3d7-c00d-499e-885c-32e1ba1f7549" /> and apparently export-diagnostics missing a settingslink(??) <!-- Please include a summary of the change. Please also include relevant motivation and context. List any dependencies that are required for this change. --> Fixes # #### Type of change - [x] 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: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings ### 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). <!-- Write any explanation required here, but do not generate the explanation using AI!! You must prove you understand what the code in this PR does. --> Written w the assistance of the confusion of why i removed these lines from the previous pr forgetting why i added them :> |
||
|---|---|---|
| .changeset | ||
| .github | ||
| .vscode | ||
| contrib | ||
| docs | ||
| infra | ||
| public | ||
| scripts | ||
| src | ||
| src-tauri | ||
| tests/e2e | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| .npmrc | ||
| altstore-source.json | ||
| build.config.ts | ||
| Caddyfile | ||
| CHANGELOG.md | ||
| CODE_OF_CONDUCT.md | ||
| config.json | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| flake.lock | ||
| flake.nix | ||
| index.html | ||
| knip.json | ||
| knope.toml | ||
| LICENSE | ||
| mise.tauri.toml | ||
| mise.toml | ||
| nfpm.yaml | ||
| oxfmt.config.ts | ||
| oxlint.config.ts | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| rust-toolchain.toml | ||
| TRADEMARKS.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
| vitest.config.ts | ||
Sable
A Matrix client built to enhance the user experience with quality-of-life features, cosmetics, utilities, and sheer usability. See the changelog.
Soon to be replaced desktop apps can be downloaded here. They auto-update by pulling the website.
Join our matrix space here to discuss features, issues, or meowing.
Forked from Cinny.
Getting started
The stable web app is available at app.sable.moe and tracks the latest GitHub release. Nightly builds are available at dev.sable.moe and from the nightly GitHub release.
You can also download our desktop app for Windows and Linux from releases. Release artifacts include build attestations, and desktop installations update automatically.
iOS (AltStore / SideStore)
Sable iOS builds are distributed as unsigned IPAs through AltStore and SideStore. Each release publishes both the IPA and an altstore-source.json manifest — stable builds to the latest GitHub release, nightly builds to the nightly GitHub release.
Stable Source
Nightly Source
Setup & install
- Set up AltStore Classic or SideStore on your device.
- Add the Sable source (tap a button above), or add it manually:
- AltStore (stable):
altstore://source?url=https://github.com/SableClient/Sable/releases/latest/download/altstore-source.json - SideStore (stable):
sidestore://source?url=https://github.com/SableClient/Sable/releases/latest/download/altstore-source.json - AltStore (nightly):
altstore://source?url=https://github.com/SableClient/Sable/releases/download/nightly/altstore-source.json - SideStore (nightly):
sidestore://source?url=https://github.com/SableClient/Sable/releases/download/nightly/altstore-source.json
- AltStore (stable):
- Install Sable from the source. The IPA is unsigned; AltStore/SideStore re-sign it with your personal development certificate at install time, so apps refresh every 7 days (the standard free-account limitation).
iOS builds are produced by the ios job in tauri-build.yml and track the same dev/v* triggers as desktop builds.
Self-hosting
You have a few options for self hosting, you can:
- Run the prebuilt docker container.
- Deploy on a site like GitLab Pages. Jae has a guide here.
- Build it yourself.
Docker
Prebuilt images are published to ghcr.io/sableclient/sable.
latesttracks the currentdevbranch image.X.Y.Ztags are versioned releases.X.Ytags float within a release line.- Pushes to
devalso publish a short commit SHA tag.
Run the latest image with:
docker run --rm -p 8080:8080 ghcr.io/sableclient/sable:latest
Then open http://localhost:8080.
If you want to override the bundled config.json, mount your own
file at /app/config.json:
services:
sable:
image: ghcr.io/sableclient/sable:latest
ports:
- '8080:8080'
volumes:
- ./config.json:/app/config.json:ro
Build it yourself
To build and serve Sable yourself with nginx, clone this repo and build it:
pnpm i # Installs all dependencies
pnpm run build # Compiles the app into the dist/ directory
After that, you can copy the dist/ directory to your server and serve it.
- In the
config.json, you can modify the default homeservers, feature rooms/spaces, toggle the account switcher, and toggle experimental simplified slilding sync support.
Optional default client settings
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 want to override) to override them. The default settings for any new logins will match these. Existing keys in local storage or users who chose to sync settings with their account data will still have their settings set.
For example:
{
"settingsDefaults": {
"hour24Clock": true,
"pageZoom": 110,
"messageLayout": 2,
"rightSwipeAction": "members",
"captionPosition": "below",
"renderUserCards": "both",
"jumboEmojiSize": "large"
}
}
Invalid or unknown keys are ignored.
- To deploy on subdirectory, you need to rebuild the app youself after updating the
basepath inbuild.config.ts.- For example, if you want to deploy on
https://sable.moe/app, then setbase: '/app'.
- For example, if you want to deploy on
Local development
Tip
The easiest way to get started is with mise, it manages node, pnpm, rust, and other tooling.
mise install # Install all required tools
mise run setup # Install dependencies (pnpm install)
mise run dev # Start the Vite dev server
Run mise tasks to list all available tasks (build, test, lint, etc.).
To build the app:
mise run build
Desktop & Mobile (Tauri)
Sable uses Tauri for native desktop and mobile builds.
mise run tauri:setup # Install Rust toolchain + system packages
mise run tauri:setup:macos # Install Xcode (macOS only)
mise run tauri:setup:windows # Install VS Build Tools + WebView2 (Windows only)
mise run tauri wry dev # Dev server with system webview (WebKit/WebView2)
mise run tauri cef build # Production build with Chromium Embedded Framework
mise run tauri --help # Any other args pass through to the Tauri CLI
When the first argument is wry or cef and the second is dev or build, the wrapper injects --features <runtime>,updater --no-default-features. Everything else is forwarded to tauri as-is.
Deployment and infrastructure
Deployment workflows and infrastructure details live in
infra/README.md.