No description
  • Tcl 95.8%
  • JavaScript 1.1%
  • Makefile 0.8%
  • Shell 0.8%
  • C 0.5%
  • Other 1%
Find a file
2026-10-10 07:38:29 +00:00
bin Browser clean up 2026-10-04 13:33:10 +00:00
doc Verify calls through OMEMO, as Conversations does 2026-10-10 06:08:21 +00:00
docker Build in Docker targeting older glibc 2026-06-05 10:28:45 -07:00
embed Gate the emit callback so none runs after tacky_destroy returns 2026-10-09 19:28:12 +00:00
flatpak Fix path references for the gui/ move 2026-09-04 00:21:24 -07:00
gui Verify calls through OMEMO, as Conversations does 2026-10-10 06:08:21 +00:00
lib Bound reactions to messages we don't have 2026-10-10 07:27:12 +00:00
patches Bump zippy: deps built -fPIC, the sqlcipher Tcl 9 patch moves into zippy 2026-10-03 06:57:03 +00:00
tests Bound reactions to messages we don't have 2026-10-10 07:27:12 +00:00
wasm Update README 2026-10-07 10:43:25 +00:00
zippy@77086cdaa7 Bump zippy: tclemnotify sleeps its slice for a timer weeks away 2026-10-10 07:38:29 +00:00
.dockerignore Build in Docker targeting older glibc 2026-06-05 10:28:45 -07:00
.gitignore Let an embedded host choose the log file 2026-08-16 13:17:02 -07:00
.gitmodules Point zippy and rtc-webrtc at their new codeberg home (pounceandmiss) 2026-10-08 10:54:12 +00:00
LICENSE Add LICENSE 2026-03-30 21:47:47 +04:00
Makefile Point zippy and rtc-webrtc at their new codeberg home (pounceandmiss) 2026-10-08 10:54:12 +00:00
README.md Update README 2026-10-07 10:43:25 +00:00
test_all.tcl Browser clean up 2026-10-04 13:33:10 +00:00
test_gui.tcl Merge the upstream macOS support, connect timeout and reply fixes 2026-09-07 14:32:56 +00:00

Tacky

A desktop XMPP chat client built with Tcl/Tk. Beta.

Screenshots

Main window Call

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:

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.