- Tcl 95.8%
- JavaScript 1.1%
- Makefile 0.8%
- Shell 0.8%
- C 0.5%
- Other 1%
| bin | ||
| doc | ||
| docker | ||
| embed | ||
| flatpak | ||
| gui | ||
| lib | ||
| patches | ||
| tests | ||
| wasm | ||
| zippy@77086cdaa7 | ||
| .dockerignore | ||
| .gitignore | ||
| .gitmodules | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| test_all.tcl | ||
| test_gui.tcl | ||
Tacky
A desktop XMPP chat client built with Tcl/Tk. Beta.
Screenshots
Core ideas
- Portable backend aiming for a very high level api: libtacky doesn't just help you form and send stanzas, it aims to take care of all the business logic, local caching, settings, calls, etc. It is fully decoupled from gui, and offers a JSON api to be used from other languages.
- Lightweight, tries to be easily distributable - self-contained statically-linked executable with all dependencies including calls at ~15mb
Alternative frontends
Because the backend is fully decoupled from the GUI and reachable over JSON, the same libtacky backend can drive completely different frontends. Two experimental ones exist - not ready to use, but ready to poke:
- tacky_android - an Android port
- gacky - a GTK frontend
- wacky - a web client, over the wasm build
Key features support
- Modern calls compatible with Conversations and Dino
- Group calls in any room (XEP-0272 Muji), compatible with Dino and Movim
- OMEMO (only direct messages)
- Attachments
- Blocking (XEP-0191)
Running
Download the executable from the releases page for Windows or Linux, click and run.
You can have the backend run in a separate thread by calling tacky --backend threaded - this will use slightly more RAM, but won't affect features.
Building
Linux
make
will download and build all the dependencies for you, and package them all into a single executable with the client: ./dist/tacky.
make linux
will do the same in a debian docker
Windows
make win
on Linux will download and build all the dependencies for you, and package them all into a single cross-compiled executable with the client: ./dist/tacky.exe.
Run without building
If you have all the dependencies installed, call wish ./bin/tacky.tcl. You can get a wish with all dependencies easily: run make wish - result in build/linux/wish.
Flatpak
Setup:
flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub org.flatpak.Builder
Build, install and run (the runtime/SDK are pulled in on first build):
cd flatpak
flatpak run org.flatpak.Builder --user --install --install-deps-from=flathub --force-clean build-dir io.github.pounceandmiss.Tacky.yml
flatpak run io.github.pounceandmiss.Tacky
C library
The backend can also be built as a self-contained static library and linked straight into a native app, instead of shipped as an executable.
make lib # native -> dist/libtacky.a
make win-lib # MinGW/PE -> dist/libtacky-win.a
make android-lib # NDK arm64 -> dist/libtacky-android.a
One archive, with the whole Tcl runtime, the backend and every dependency
merged in. The ABI is embed/tacky.h - three functions and a callback - and
the API it carries is the backend's JSON contract: see
doc/DOC.md.
Browser
The same backend builds to WebAssembly (make wasm) and runs in a Web Worker,
speaking the same JSON protocol. See wasm/README.md.
Tests
make test # the suite, natively
make wasm-test # the same suite in headless Chromium
Networked integration tests run when a server is up. Needs docker:
tests/servers/with_prosody.sh make test
Architecture
GUI (gui/) <-> tacky bridge (lib/libtacky/) <-> Backend (lib/taco/) -> XMPP
The bridge supports three backend transport modes, all transparent to the GUI:
--backend MODE Backend mode: direct (default), thread, process
doc/HACKING.md covers the internals: building and testing from a
checkout, the j and xsearch stanza primitives, and backend module structure.
doc/DOC.md is the backend's JSON API.

