A terminal aesthetic Matrix client with vim navigation built in
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A keyboard-driven, terminal-aesthetic Matrix client.
Quark is a Matrix chat client that looks like a terminal but renders in a real GUI window. You drive it with vim-style keys and a : command bar, while still getting inline images, animated GIFs, custom emoji, and stickers — things a true TUI can't render reliably.檢視完整 README ↗A keyboard-driven, terminal-aesthetic Matrix client.
Quark is a Matrix chat client that looks like a terminal but renders in a real GUI window. You drive it with vim-style keys and a : command bar, while still getting inline images, animated GIFs, custom emoji, and stickers — things a true TUI can't render reliably.
Why a GUI and not a real TUI? Custom emoji (
<img data-mx-emoticon>) and stickers need to render as images inline with text. Terminal image protocols (Sixel/Kitty) can't do that dependably across terminals, so the CLI look is achieved purely with CSS (monospace fonts, dark background, prompt-style input) inside a lightweight Tauri webview.
im.ponies) packs from rooms and your account data, compatible with Cinny, FluffyChat, Nheko, and SchildiChat. Type :shortcode: for inline autocomplete with image previews.m.image.m.video playback, blurhash placeholders, disk-backed LRU cache.:directory opens a searchable public-room browser with j/k navigation.:theme or Settings.quarkrc.Currently password login only. OIDC (via MAS) and SSO are planned. Other in-progress items — theme filesystem hot-reload, key backup (SSSS), emoji/sticker pack management UI, and mobile (iOS/Android) builds — are tracked in DESIGN.md.
┌─────────────────────────────────────┐
│ Web Frontend (TypeScript) │
│ Monospace / terminal-styled UI │
│ Renders HTML, images, emoji │
├─────────────────────────────────────┤
│ Tauri v2 IPC Bridge │
├─────────────────────────────────────┤
│ Rust Backend (Core) │
│ matrix-sdk · Vodozemac E2EE │
│ Matrix /sync · Media cache │
└─────────────────────────────────────┘
matrix-sdk 0.9 (the same SDK behind Element X), handling protocol, sync, E2EE, and media. Bundled by Tauri v2 — roughly 10× smaller binary and far less RAM than Electron.See DESIGN.md for the authoritative spec and CLAUDE.md for the contributor-oriented architecture overview.
packageManager: [email protected])A Nix flake is provided — direnv allow (or nix develop) drops you into a shell with everything installed.
The flake also builds Quark as a package (Linux and macOS):
nix run github:mcplummet/quark # try it without installing
nix profile install github:mcplummet/quark
Or consume it declaratively from a NixOS, nix-darwin or home-manager flake:
{
inputs.quark = {
url = "github:mcplummet/quark";
inputs.nixpkgs.follows = "nixpkgs"; # optional, builds against your nixpkgs
};
# then either add the package directly…
environment.systemPackages = [ inputs.quark.packages.${pkgs.system}.default ];
# …or use the overlay and refer to pkgs.quark
nixpkgs.overlays = [ inputs.quark.overlays.default ];
}
On macOS the build produces a Quark.app; nix-darwin copies it into
/Applications/Nix Apps, and $out/bin/quark launches the same binary from a
shell. Both are read-only, so the in-app updater turns itself off — upgrade with
nix flake update instead.
pnpm install
pnpm tauri dev # full app: Rust backend + frontend, hot-reload
pnpm dev # frontend only, mock IPC, no Rust process (port 1450)
pnpm build # tsc + vite build → dist/
pnpm test # Vitest (single run)
pnpm test:watch # Vitest (watch mode)
pnpm tauri build # release bundle (.deb / .AppImage / .rpm / .msi / .dmg / …)
Backend-only work, from src-tauri/:
cargo build
cargo test
Config lives in ~/.config/quark/:
| File | Purpose |
|---|---|
config.toml | General settings (theme, sync, media, GIF, emoji) |
quarkrc | Vim-style keybindings & options (vimrc-inspired) |
themes/ | Your custom theme .toml files |
config.toml:
[general]
theme = "phosphor"
notifications = true
confirm_redact = true
[sync]
timeline_limit = 50
[media]
auto_load_images = true
cache_size_mb = 500
[gif]
provider = "klipy" # klipy | giphy
api_key = "" # bring your own
rating = "pg" # g | pg | pg-13 | r
quarkrc (keybindings use vimrc syntax; sourced on startup and on :source):
" remap navigation, vim-style
nmap gg jump-top
nmap G jump-bottom
nmap dd redact
" leader bindings (leader defaults to space)
let mapleader = " "
nmap <leader>e emoji-picker
nmap <leader>g gif-search
set scrolloff=5
set gif_provider=klipy
Full keybinding command list, scoped maps (tmap/rmap/pmap), autocmd, and the complete theme schema are documented in DESIGN.md.
All bindings are rebindable in quarkrc.
| Context | Key | Action |
|---|---|---|
| Global | i | Enter insert mode |
| Global | Esc | Return to normal mode |
| Global | : | Open command bar |
| Room list | j / k | Move down / up |
| Room list | Enter | Open room |
| Room list | / | Search / filter rooms |
| Timeline | j / k | Scroll down / up |
| Timeline | g / G | Jump to top / bottom |
| Timeline | r | Reply to selected message |
| Timeline | e | React |
| Timeline | t | Open / enter thread |
| Timeline | dd | Redact own message |
| Insert | Ctrl-e | Emoji / sticker picker |
| Insert | Ctrl-g | GIF search |
| Insert | Tab | Autocomplete :shortcode: |
Common commands: :join, :leave, :invite, :verify, :theme, :gif, :directory, :roomsettings, :debug, :version.
Eleven built-in themes ship in themes/:
phosphor (green CRT) · amber (amber CRT) · dracula · nord · solarized-dark · solarized-light · catppuccin-mocha · catppuccin-latte · gruvbox-dark · high-contrast · pesterchum
Switch with :theme <name> or via Settings. (Filesystem hot-reload on save is not yet wired up — switching applies immediately, but editing a theme file currently needs a :theme re-select.)
quark/
├── src/ # TypeScript frontend
│ ├── main.ts # bootstrap, login, sync startup
│ ├── app/ # actions (IPC dispatch), state, keyboard, sync
│ ├── ipc/ # Tauri invoke wrappers, shared types, mock layer
│ ├── ui/ # DOM components (Timeline, Input, RoomList, pickers…)
│ ├── vim/ # mode state machine, keymaps, : command parser
│ ├── theme/ # CSS custom-property loader
│ └── style/ # monospace terminal base CSS
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri builder, managed state, plugins
│ ├── commands.rs # #[tauri::command] IPC handlers
│ ├── matrix/ # client, timeline, rooms, crypto, emoji, media…
│ ├── gif/ # Giphy / Klipy clients
│ ├── config/ # TOML theme + quarkrc parsers
│ ├── media_cache.rs
│ └── notifications.rs
├── themes/ # built-in theme TOMLs
├── flatpak/ # flatpak manifest + desktop/metainfo
├── DESIGN.md # authoritative spec
└── CLAUDE.md # architecture notes for contributors
Multi-platform bundles are produced by GitHub Actions on tagged (v*) releases: Linux (.deb / .AppImage / .rpm), Flatpak, Windows (.exe / .msi), macOS (.dmg), and Android (.apk). A Flatpak manifest lives under flatpak/ (app ID tel.quark.app).
Mobile (iOS and Android, via Tauri v2) is experimental and in progress — see the mobile sections of DESIGN.md.
package.json, src-tauri/Cargo.toml, src-tauri/tauri.conf.json, the version badge in this README, the quark entry in Cargo.lock, the iOS Info.plist, and src-tauri/gen/apple/project.yml (.claude/skills/version-bump/bump.sh does all seven in lockstep). Features bump minor; fixes bump patch.pnpm test and cargo test (from src-tauri/) before opening a pull request.Copyright (C) 2026 mcplummet.
Quark is licensed under the GNU Affero General Public License v3.0. See LICENSE.