{"id":49922657,"url":"https://github.com/kalinbogatzevski/talq-desktop","last_synced_at":"2026-06-13T22:01:33.176Z","repository":{"id":358317756,"uuid":"1240598813","full_name":"kalinbogatzevski/talq-desktop","owner":"kalinbogatzevski","description":"Native Qt desktop client for Nextcloud Talk — drawn with QPainter, not wrapped. Fast, low-idle, built to run all day.","archived":false,"fork":false,"pushed_at":"2026-06-10T10:37:02.000Z","size":48595,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-10T12:18:30.663Z","etag":null,"topics":["chat-client","cpp","desktop","nextcloud","nextcloud-talk","qt","qt6","webrtc"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kalinbogatzevski.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-16T10:30:08.000Z","updated_at":"2026-06-10T10:37:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kalinbogatzevski/talq-desktop","commit_stats":null,"previous_names":["kalinbogatzevski/talq-desktop"],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/kalinbogatzevski/talq-desktop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kalinbogatzevski%2Ftalq-desktop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kalinbogatzevski%2Ftalq-desktop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kalinbogatzevski%2Ftalq-desktop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kalinbogatzevski%2Ftalq-desktop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kalinbogatzevski","download_url":"https://codeload.github.com/kalinbogatzevski/talq-desktop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kalinbogatzevski%2Ftalq-desktop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34301732,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chat-client","cpp","desktop","nextcloud","nextcloud-talk","qt","qt6","webrtc"],"created_at":"2026-05-16T21:17:04.910Z","updated_at":"2026-06-13T22:01:33.169Z","avatar_url":"https://github.com/kalinbogatzevski.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"resources/logo.png\" alt=\"TalQ\" width=\"128\" height=\"128\" /\u003e\n\n# TalQ\n\n**A native desktop client for Nextcloud Talk — drawn, not wrapped.**\n\nYour team chat as a real desktop app: instant open, near-zero idle, built to be left running all day.\n\n\u003csub\u003eStable codename: **Slartibartfast** (the **0.50** milestone) — the *Hitchhiker's Guide* planetary coastline designer who won an award for the fjords of Norway and liked to sign his name in the crinkly bits, a maker who sweats the fine detail. The 0.50 release caps the line he names: acoustic **echo cancellation** (subtracting the room's own reflections from your mic), full-display **screen sharing on hybrid-GPU laptops**, native-resolution window sharing, and a long tail of call, chat and status polish. He carries the *Hitchhiker's Guide* thread forward — *Deep Thought* (0.42, the computer that found **42**) → *Magrathea* (0.44) → *Slartibartfast* — after **Botev** (0.48, Heroes' Day) and **Margaritka** (0.46, Children's Day), and the 150th-anniversary cycle of Bulgaria's 1876 April Uprising before that: *Aprilsko Vastanie* → *Panagyurishte* → *Koprivshtitsa* 🌌🇧🇬\u003c/sub\u003e\n\n\u003c/div\u003e\n\n\u003e ⚠️ **Status:** Chat is the solid, daily-driver core. **Audio/video\n\u003e calls, simulcast quality switching, and screen sharing now work end to\n\u003e end** and are verified in real two-party use (1:1 and MCU/conference)\n\u003e as of v0.38.0. Simulcast publishing (180p / 360p / 720p layers, with\n\u003e per-receiver substream selection) shipped in stable after end-to-end\n\u003e harness validation across all three substream levels. The remaining\n\u003e work is breadth of cross-network/NAT hardening and multi-party\n\u003e validation beyond two peers. Windows only for now.\n\n---\n\n## Why I built this\n\nI run an ISP. Nextcloud Talk is how my team actually talks to each other\nall day — support, on-call, the lot. The official Talk desktop app is an\nElectron shell around the web client, and it works: it's the reference,\nit's maintained by people who know the protocol far better than I do, and\nTalQ wouldn't exist without it to learn from.\n\nBut \"works\" and \"I want this open for nine hours a day\" are different\nbars. On the machines my staff actually use, a Chromium instance per chat\nwindow is real RAM and real latency. I wanted something that opened\ninstantly, idled at near-zero CPU, survived being left running for a week,\nand felt like a *desktop app* — native notifications, a tray that behaves,\na window that doesn't hitch when a message arrives.\n\nSo TalQ is a native Qt client. No web view. The conversation list and\nmessages are drawn directly with QPainter; the whole thing is built around\nthree words I kept coming back to — *calm, warm, fast*. It speaks the same\nNextcloud Talk HTTP API the official client does; it just renders it the\nway I wanted to look at it forty times a day.\n\nIt's an unofficial client. Nextcloud® is their trademark and their\nprotocol, and I'm grateful for both. This is just what happens when\nsomeone who ships software for a living has to live inside a tool:\neventually you rebuild the part that's between you and the work.\n\n## What it is\n\n- **Conversation list** — unread badges, mentions, favorites grouped on\n  top, plus sort (recent / unread / name) and filter (all / unread /\n  favorites / direct / groups).\n- **Messaging** — message bubbles, threads, replies with quoted context,\n  reactions, read receipts, date separators, in-conversation search.\n- **Files** — share from disk or Nextcloud, image previews, and a\n  per-conversation \"shared files\" view.\n- **Live updates** — long-poll for new messages; native notifications and\n  a tray that stays out of the way. If the server drops off the network, a\n  quiet \"Connecting…\" strip says so while you keep reading and scrolling\n  your cached conversations — nothing locks up.\n- **Calls** — one-to-one and group audio/video over WebRTC, screen\n  sharing with live thumbnail picker, optional noise suppression.\n  **Simulcast publishing** sends three layers (180p / 360p / 720p) so a\n  receiver on a weak network can drop down without dragging everyone\n  with them; a **manual Quality chip** on the call screen lets you\n  override the per-tile auto-select. *(Working end to end; multi-party\n  hardening — see Status.)*\n- **Mission Control** — a live telemetry panel on the call screen\n  (outbound bandwidth sparkline, codec / encoder / TX-RX resolution\n  cards, per-participant subsystem chips) and a matching strip on the\n  Settings dialog. One diagnostic surface, one design language.\n- **Four themes** — Ember, Warm, Vivid, Paper. Calm, warm, fast.\n- **Built to idle** — QPainter-on-QWidget rendering, no web engine; near-\n  zero CPU at rest.\n- **Self-tested** — `talq-call-test` is a headless harness that runs the\n  real publish + subscribe pipelines against the MCU and asserts\n  end-to-end correctness for simulcast, substream switching, screen\n  sharing, mute propagation, and more — so regressions surface without a\n  human in the loop.\n\n## Download\n\n**[⬇ Download the latest TalQ installer](https://github.com/kalinbogatzevski/talq-desktop/releases/latest)** — Windows 10/11, 64-bit.\n\nGrab the `TalQ-v\u003cversion\u003e-Setup.exe` asset from the latest release and run it,\nthen point TalQ at your Nextcloud server. The same installer performs in-place\nupgrades (it reuses your existing install location and shortcuts).\n\n### Code signing\n\nThe generic TalQ Windows builds (`TalQ-…-Setup.exe` and `talq.exe`) are\ncode-signed through **SignPath Foundation**'s free code-signing program for\nopen-source projects. Each signed binary is built — and its provenance\nverified against this public repository — by the\n[release CI workflow](.github/workflows/release.yml).\n\n\u003e This project uses free code signing provided by\n\u003e [SignPath.io](https://signpath.io/) and a free code-signing certificate by\n\u003e the [SignPath Foundation](https://signpath.org/).\n\nSee [CODE_SIGNING.md](CODE_SIGNING.md) for the full signing policy.\n\n## Requirements\n\n- **Windows 10/11, 64-bit.** TalQ currently uses Windows-specific media\n  and compositor paths; Linux/macOS are not supported yet.\n- A **Nextcloud server with the Talk app** enabled, and an account on it.\n\nPrebuilt installers are on the [Releases](https://github.com/kalinbogatzevski/talq-desktop/releases)\npage (see [Download](#download) above). To build from source, read on.\n\n## Build from source (Windows)\n\nTalQ builds with the **MinGW** toolchain (Qt's `mingw_64` kit) and links\n**GStreamer from MSYS2**. Both are required; calls won't compile without\nGStreamer. The toolchain is intentionally pinned (Qt 6.8.2 + MinGW 13.1 +\nGStreamer 1.28.x) — other versions may work but these are what's tested.\n\n### Prerequisites\n\n- **Python 3.10+** (for `aqtinstall`)\n- **Git** (Git Bash provides the shell the commands below assume)\n- **MSYS2** — provides the GStreamer runtime + dev packages\n- *(optional)* **Visual Studio 2022 Build Tools** with the C++ workload +\n  a Windows 11 SDK — only needed to build the single-**window** screen-share\n  helper (see step 5). Everything else, including whole-screen sharing,\n  builds without it.\n\n### 1. Install Qt 6.8.2 + build tools\n\n```bash\npip install aqtinstall\n\n# Qt 6.8.2 with MinGW + WebSockets + Multimedia\npython -m aqt install-qt windows desktop 6.8.2 win64_mingw --outputdir C:\\Qt -m qtwebsockets qtmultimedia\n\n# MinGW 13.1 compiler, CMake, Ninja\npython -m aqt install-tool windows desktop tools_mingw1310 --outputdir C:\\Qt\npython -m aqt install-tool windows desktop tools_cmake --outputdir C:\\Qt\npython -m aqt install-tool windows desktop tools_ninja --outputdir C:\\Qt\n```\n\nYou should now have `C:\\Qt\\6.8.2\\mingw_64\\`, `C:\\Qt\\Tools\\mingw1310_64\\`,\n`C:\\Qt\\Tools\\CMake_64\\`, `C:\\Qt\\Tools\\Ninja\\`.\n\n### 2. Install MSYS2 + GStreamer\n\nInstall **MSYS2** from \u003chttps://www.msys2.org\u003e (default location\n`C:\\msys64`). Then, in an **MSYS2 MinGW64** shell, install GStreamer and the\nplugin sets TalQ uses (WebRTC, the codec/parser elements, the Windows\ncapture/output backends):\n\n```bash\npacman -Syu     # update first (re-open the shell if it asks you to)\npacman -S --needed \\\n  mingw-w64-x86_64-gstreamer \\\n  mingw-w64-x86_64-gst-plugins-base \\\n  mingw-w64-x86_64-gst-plugins-good \\\n  mingw-w64-x86_64-gst-plugins-bad \\\n  mingw-w64-x86_64-gst-plugins-ugly \\\n  mingw-w64-x86_64-gst-plugins-rs \\\n  mingw-w64-x86_64-gst-libav\n```\n\nCMake looks for GStreamer under `C:/msys64/mingw64` by default (the\n`GSTREAMER_ROOT` cache variable). If your MSYS2 is elsewhere, pass\n`-DGSTREAMER_ROOT=/path/to/mingw64` at configure time.\n\n### 3. Clone\n\n```bash\ngit clone https://github.com/kalinbogatzevski/talq-desktop.git\ncd talq-desktop\n```\n\n\u003e Use a path without non-ASCII characters — Qt's tooling breaks on\n\u003e Cyrillic/OneDrive paths.\n\n### 4. Configure and build\n\n```bash\n# Git Bash — MinGW + CMake + Ninja on PATH\nexport PATH=\"/c/Qt/Tools/mingw1310_64/bin:/c/Qt/Tools/CMake_64/bin:/c/Qt/Tools/Ninja:/c/msys64/mingw64/bin:$PATH\"\ncmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \\\n  -DCMAKE_PREFIX_PATH=/c/Qt/6.8.2/mingw_64 -DCMAKE_CXX_COMPILER=g++ -Wno-dev\ncmake --build build --target talq\n```\n\n### 5. *(optional)* Build the window-capture helper\n\nSharing a **single application window** (rather than a whole monitor) uses\nWindows Graphics Capture, whose headers ship only with MSVC + the Windows 11\nSDK — not with the MinGW GStreamer TalQ otherwise uses. So it lives in a tiny,\nself-contained C-ABI DLL loaded at runtime. Whole-screen sharing works without\nit; if you skip this step, picking a window just reports that window capture\nis unavailable.\n\n```bash\n# From a shell where cmd is available (needs VS2022 Build Tools + Win11 SDK):\ncmd //c native/wgc/build.bat     # produces native/wgc/talq_wgc.dll\n```\n\n### 6. Deploy the runtime + run\n\nThe app needs the Qt and GStreamer DLLs (and GStreamer plugins) beside the\nexecutable. `scripts/deploy-dev.sh` copies them all into the build dir and\nlaunches:\n\n```bash\nbash scripts/deploy-dev.sh        # deploy Qt + GStreamer DLLs/plugins (+ talq_wgc.dll) and run\n# or, to deploy without launching:\nbash scripts/deploy-dev.sh --no-run\n```\n\nTo produce a packaged Windows installer (Inno Setup required, `ISCC` on\nPATH), see `scripts/build-release.sh`.\n\n## Usage\n\nLaunch TalQ, sign in through your Nextcloud server's browser login\n(Login Flow v2 — no embedded browser, no password stored), and your\nconversations appear. The funnel control in the search row sorts and\nfilters the list; Settings → Audio \u0026 Video selects devices and toggles\nnoise suppression.\n\n## Status\n\nTalQ is what I use every day, but it's honest about where it is:\n\n- **Solid:** chat, threads, reactions, file sharing, search,\n  notifications, the conversation list — the things I rely on for hours a\n  day.\n- **Solid in two-party use:** **audio/video calls, simulcast quality\n  switching, and screen sharing.** As of v0.38.0 the WebRTC pipeline is\n  verified working end to end in real 1:1 and MCU/conference use —\n  hardware H264, three-layer simulcast publishing with auto + manual\n  substream selection, screen sharing with live-thumbnail picker — with\n  crash barriers so a media failure can't take the app down. A headless\n  self-test suite (`talq-call-test`) asserts the entire publish +\n  subscribe path against the MCU on every release.\n- **Multi-party (3+ peers):** works, but hasn't been validated as\n  exhaustively as 1:1; field reports from larger meetings are the most\n  useful contribution right now.\n- **Windows only.** Linux/macOS would need the media/compositor paths\n  reworked.\n- **Help especially welcome here:** call reliability across the range of\n  NAT, firewall, and device configurations real users have is where\n  outside testing and bug reports move the needle most.\n\nI'd rather you know that going in than discover it on a customer call.\n\n## Architecture\n\n- **Qt 6.8.2 Widgets**, **C++20**, MinGW 13.1, CMake + Ninja.\n- The conversation list and message view are rendered with **QPainter on\n  QWidget** — no QML, no web engine. Earlier versions used QML; it was\n  replaced for rendering control and idle cost.\n- **GStreamer** WebRTC pipelines for calls.\n- Talks to Nextcloud over the **OCS v2 / Talk Chat / Login Flow v2** HTTP\n  APIs — no Nextcloud code is linked.\n\n## Contributing\n\nIssues and PRs welcome. The single highest-value area is **call\nreliability across real networks** — if you can reproduce a call failure\nwith details about your NAT/firewall/devices, that's gold. Please keep the\n*calm, warm, fast* design intent in mind for UI changes.\n\n## Privacy\n\nTalQ collects **no** telemetry, analytics, or crash reports. It talks only to\nthe Nextcloud server you configure (your data, your server) and checks GitHub\nfor new versions. Everything else stays on your machine. See\n[`PRIVACY.md`](PRIVACY.md).\n\n## License\n\nTalQ is licensed under the **Apache License 2.0** — see [`LICENSE`](LICENSE).\n\nIt links and bundles third-party components (Qt and GStreamer under LGPL,\nthe Twemoji emoji set under CC-BY 4.0, the Inter typeface under the SIL\nOFL) under their own terms; see [`NOTICE`](NOTICE) and\n[`THIRD-PARTY-NOTICES.md`](THIRD-PARTY-NOTICES.md).\n\n\"Nextcloud\" is a registered trademark of Nextcloud GmbH. TalQ is an\nindependent, unofficial client and is not affiliated with or endorsed by\nNextcloud GmbH.\n\n---\n\nBuilt by **Kalin Bogatzevski**. By day I work on the commercial side —\n**[ISPCQ](https://ispcq.com)**, the multi-tenant ISP/ERP platform. TalQ is\nthe same engineering DNA applied to a desktop client.\n\nOpen-sourced because the tool you live inside all day shouldn't be a black\nbox — and because good software is the best advertising I know.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkalinbogatzevski%2Ftalq-desktop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkalinbogatzevski%2Ftalq-desktop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkalinbogatzevski%2Ftalq-desktop/lists"}