Tacit is a fork of Tammy Messenger with one clear goal: a modern, appealing Matrix experience.
Quietly powerful. Smooth by default. Built for focus.
Tacit is based on Trixnity Messenger, with an updated visual style, and cleaner interaction patterns.
- A modern, polished desktop-first Matrix experience.
- Faster, clearer room navigation with a contemporary chat layout.
- Matrix power under the hood, with UX tuned for daily use.
- A fork that focuses on delight, flow, and visual consistency.
- Target platform: Desktop / Web
- Other platforms: Android/iOS are currently not actively tested in Tacit.
- Releases: Unsigned desktop builds for macOS (Apple Silicon), Linux and Windows, see Download / Install. Changes are listed in CHANGELOG.tacit.md.
- Maturity: Alpha — expect rough edges, breaking changes, and frequent iteration.
Download the latest release for your system:
| System | Download |
|---|---|
| macOS (Apple Silicon) | tacit-macos-arm64.dmg |
| Windows (x64) | tacit-windows-x64.zip |
| Linux (x64) | tacit-linux-x64.zip |
All releases and their notes are on GitLab; the files themselves are hosted on GitHub Releases.
The builds are not signed, so macOS and Windows warn you on the first start:
-
macOS: drag Tacit to Applications and open it. When macOS blocks it, click Done, then open System Settings > Privacy & Security, scroll to Security and click Open Anyway (the button only shows for about an hour after the attempt). Right-click > Open no longer works. If macOS says the app is "damaged", run
xattr -cr /Applications/Tacit.app.macOS asks again for every new version you download in a browser. Downloads made with
curlare not flagged, so they open without the prompt:curl -LO https://github.com/dfuchss/tacit/releases/latest/download/tacit-macos-arm64.dmg open tacit-macos-arm64.dmg
-
Windows: unzip and run
Tacit.exe. If SmartScreen warns you, click More info > Run anyway. -
Linux: unzip and run
./Tacit/bin/Tacit.
The desktop app checks GitHub for a new release about once a day (turn this off under Settings >
About the app, which also has Check now). A new version is downloaded, checked against the release's
SHA256SUMS and prepared in Tacit's data folder; your installed copy is not touched yet. Restart to update (in the
banner, the settings or the tray menu) quits Tacit completely, swaps in the new version, keeps your sessions and
settings, and starts it again; nothing is installed before you choose it. If the swap fails, the previous version is restored.
Tacit offers Open release page instead of updating itself when it runs from the mounted disk image
(/Volumes/...), when macOS runs it from a temporary translocated copy (open it once from Applications), or when
the install folder or its parent folder is not writable (e.g. C:\Program Files); update by hand in those cases.
For testing, TACIT_UPDATE_API_URL points the check at another release JSON, TACIT_UPDATE_CURRENT_VERSION
pretends to be an older version, and TACIT_UPDATE_FORCE=1 checks right after start and accepts the latest release even
when it is not newer.
The web version is available as a Docker image: ghcr.io/dfuchss/tacit (tags: dev for the latest development state,
<version> for releases such as 26.9.2-tacit.1).
A matrix space is translated to the idea of guilds in Tacit. Guilds only contain rooms. All DMs and group chats are outside of guilds. Guilds can be used to organize rooms, e.g. by topic, project, or team.
Tacit versions follow v<upstream>-tacit.<n>, e.g. v26.9.2-tacit.1. The numeric appVersion stays unchanged.
- Move the
[Unreleased]entries inCHANGELOG.tacit.mdto a new## 26.9.2-tacit.1section and commit. git tag v26.9.2-tacit.1- Push the tag to gitlab.com first, then to github.com. The GitHub push triggers
.github/workflows/release.yml, which builds the packages, creates the GitHub Release and then the GitLab Release:git push gitlab.com v26.9.2-tacit.1 && git push github.com v26.9.2-tacit.1 - The same tag also triggers the Docker image build.
The workflow needs the repository secret GITLAB_TOKEN on github.com: a gitlab.com project access token with the api
scope and the Developer role or higher.
You can find the build artifacts in build/compose/binaries/main-release/... after running the build commands below.
TAMMY_BUILD_FLAVOR=PROD ./gradlew createReleaseDistributable(builds app)TAMMY_BUILD_FLAVOR=PROD ./gradlew packageReleaseWebZip(builds web zip version)
set TAMMY_BUILD_FLAVOR=PROD(sets environment variable for the current command prompt)gradlew createReleaseDistributable(builds app)gradlew packageReleaseWebZip(builds web zip version)
The original Tammy README content follows below for reference.
If you run the messenger from the IDE or command line, the
./gradlew run
To try Tacit against the seeded demo data of the screenshots (logged in as tacit, throwaway homeserver in Docker; the URL and credentials are printed on start): ./gradlew runDemo
In Android Studio or IntelliJ, choose the Android configuration and run on an emulated or your physical device.
./gradlew wasmJsBrowserDevelopmentRun
- Create a git commit
bump versionwith the following changes:appPublishedVersion(e. g.26.4.0) set to the version that is going to be published.appVersionmust be the same asappPublishedVersion.- Updated
CHANGELOG.mdcontaining a section about the new version. - Cancel triggered pipeline.
- Create a version-tag of the form
v26.4.0.- The version must be the same as
appPublishedVersion. - This will trigger a pipeline creating all distributions, uploading them into package registry and linking them in a newly created GitLab release.
- The version must be the same as
- Create a git commit with
[skip-ci]in the commit message and the following changes:appPublishedVersionstays at the version, that has been published (e. g.26.4.0).appVersionincreased to the next version (e. g.26.4.1) as this is used forDEVbuilds.
When running locally, you must set TAMMY_BUILD_FLAVOR to PROD (e.g. by prepending TAMMY_BUILD_FLAVOR=PROD to each
command).
Install fastlane by installing ruby and running:
bundle updateCreate new screenshots for the App.
When using a Mac, you may do first (this needs Android SDK command line tools to be installed):
# macOS
export PATH="$PATH:$HOME/Library/Android/sdk/emulator:$HOME/Library/Android/sdk/tools:$HOME/Library/Android/sdk/cmdline-tools/latest/bin/"
# linux
export PATH="$PATH:$HOME/Android/Sdk/emulator:$HOME/Library/Android/sdk/tools:$HOME/Android/Sdk/cmdline-tools/latest/bin/"After that you can start the emulators:
./fastlane/run_screenshot_emulators.shAnd create screenshots:
TAMMY_BUILD_FLAVOR=PROD bundle exec fastlane android screenshotsAfter that you can stop the first script and delete the emulators:
./fastlane/delete_screenshot_emulators.shFor iOS you have to manually add the following files under Build Phases -> Copy Bundle Resources (otherwise fastlane will crash in the CI...):
- lognity.json
- Tammy.icon
- main.swift
- all the files in
iosApp/Screenshots - Since the CI will crash if those files are mentioned in the .xcproject file, do NOT commit those changes!
Then, run fastlane ios screenshots
This does not include default GitLab environment variables that are used.
- AZURE_ARTIFACT_SIGNING_METADATA_FILE_BASE64
- AZURE_TENANT_ID
- AZURE_CLIENT_ID
- AZURE_CLIENT_SECRET
- ANDROID_RELEASE_STORE_FILE_BASE64
- ANDROID_RELEASE_STORE_PASSWORD
- ANDROID_RELEASE_KEY_ALIAS
- ANDROID_RELEASE_KEY_PASSWORD
- APPLE_KEYCHAIN_FILE_BASE64
- APPLE_KEYCHAIN_PASSWORD
- APPLE_TEAM_ID
- APPLE_ID
- APPLE_NOTARIZATION_PASSWORD
- SSH_PASSWORD_APP: Web app deployment
- SSH_PASSWORD_WEBSITE: Website deployment








