Tumblr DMs is a self-hosted Beeper bridge for Tumblr direct messages. It runs locally, signs in with your Tumblr web session, and brings Tumblr DM conversations into Beeper.
This is not an official Tumblr API integration. Tumblr web changes may require bridge updates.
- Tumblr login through Beeper Desktop.
- Existing Tumblr DM history backfill.
- Live incoming message sync.
- Text send and receive.
- Basic media send and receive.
- Replies in existing Tumblr conversations from Beeper.
- Read receipts, contact names, and avatars.
- Backfill that preserves unread state.
- Starting brand-new Tumblr chats from Beeper may depend on deeper Desktop support.
- Windows release binaries are not currently published.
Install and log in to bbctl:
bbctl loginCreate a runtime directory:
export BRIDGE_DIR="$HOME/.local/share/tumblr-dms"
mkdir -p "$BRIDGE_DIR"
chmod 700 "$BRIDGE_DIR"
cd "$BRIDGE_DIR"Register the bridge with Beeper:
bbctl config --type bridgev2 -o config.yaml sh-tumblrdms
bbctl register -g -o registration.yaml sh-tumblrdms
chmod 600 config.yaml registration.yamlDownload the bridge binary:
curl -L -o tumblr-dms \
https://github.com/beeper/tumblr-dms/releases/latest/download/tumblr-dms-<os-arch>
chmod +x tumblr-dmsUse one of:
darwin-arm64linux-amd64linux-arm64
Start the bridge:
touch bridge.log
chmod 600 bridge.log
./tumblr-dms -c config.yaml -r registration.yaml >> bridge.log 2>&1 &Check that it is running:
bbctl whoami | grep tumblrdmsBefore Tumblr login, the bridge should show as running. After login, it should show a connected remote.
Open Beeper Desktop, go to Settings -> Bridges -> Self-hosted Bridges, find
sh-tumblrdms, and add an account. Complete the Tumblr login flow when Beeper
opens it.
If you are using an AI coding assistant, it can do most of the setup for you. The only step you need to do yourself is the Tumblr login inside Beeper Desktop.
Suggested opening:
This connects your Tumblr DMs to Beeper. Once it is running, your Tumblr conversations show up in Beeper like your other chats, and replies you send from Beeper go back through Tumblr.
What the assistant should do:
-
Confirm Beeper Desktop is installed.
-
Confirm
bbctlis installed and logged in. If not, install it from beeper/bridge-manager and runbbctl login. -
Detect the user's OS and CPU:
- macOS Apple Silicon:
darwin-arm64 - Linux x86_64:
linux-amd64 - Linux ARM64:
linux-arm64
- macOS Apple Silicon:
-
Create the runtime directory:
export BRIDGE_DIR="$HOME/.local/share/tumblr-dms" mkdir -p "$BRIDGE_DIR" chmod 700 "$BRIDGE_DIR" cd "$BRIDGE_DIR"
-
Register the bridge with Beeper:
bbctl config --type bridgev2 -o config.yaml sh-tumblrdms bbctl register -g -o registration.yaml sh-tumblrdms chmod 600 config.yaml registration.yaml
-
Download the matching binary:
curl -L -o tumblr-dms \ https://github.com/beeper/tumblr-dms/releases/latest/download/tumblr-dms-<os-arch> chmod +x tumblr-dms
-
Start the bridge:
touch bridge.log chmod 600 bridge.log ./tumblr-dms -c config.yaml -r registration.yaml >> bridge.log 2>&1 &
-
Confirm Beeper can see it:
bbctl whoami | grep tumblrdms
What the user should do:
- Open Beeper Desktop.
- Go to Settings -> Bridges.
- Find
sh-tumblrdmsunder Self-hosted Bridges. - Add an account.
- Complete the Tumblr login flow when Beeper opens it.
After login, the assistant can run this again:
bbctl whoami | grep tumblrdmsThe bridge should show a connected remote.
What the assistant should not do without asking:
- Delete or reset the bridge.
- Delete local runtime files.
- Share logs, configs, registrations, databases, cookies, tokens, or browser captures.
- Push commits or rewrite git history.
The runtime directory contains local state for the bridge:
config.yamlregistration.yamlsh-tumblrdms.dbbridge.log
Do not share these files publicly. They may contain account or connection details.
If the bridge does not appear in Beeper, check that it is running:
bbctl whoami | grep tumblrdmsIf login fails, re-run the account login from Beeper Desktop.
If messages are not syncing, confirm the bridge shows a connected remote and
check bridge.log for recent errors.
If the bridge was deleted and re-added, start from a clean runtime directory. Mixing old local state with a new Beeper registration can cause stale room or delivery issues.
Requirements:
- Go 1.25 or newer.
- libolm development headers.
On macOS:
brew install libolmOn Debian/Ubuntu:
sudo apt-get install libolm-dev libolm3Build:
go build ./...
./build.shThe ld: warning: ignoring duplicate libraries: '-lc++', '-lolm' linker
warning on macOS is harmless.
Use Docker instead of the native start command above. Never run the native
binary and Docker container at the same time against the same runtime
directory. The Docker image uses the same Beeper registration, so you can
reuse the BRIDGE_DIR, config.yaml, and registration.yaml after stopping
the native process. If you are starting with Docker instead, create and
register them once before starting the container:
export BRIDGE_DIR="$HOME/.local/share/tumblr-dms"
mkdir -p "$BRIDGE_DIR"
chmod 700 "$BRIDGE_DIR"
bbctl config --type bridgev2 -o "$BRIDGE_DIR/config.yaml" sh-tumblrdms
bbctl register -g -o "$BRIDGE_DIR/registration.yaml" sh-tumblrdms
chmod 600 "$BRIDGE_DIR/config.yaml" "$BRIDGE_DIR/registration.yaml"Build the container from a source checkout, not from BRIDGE_DIR:
git clone https://github.com/beeper/tumblr-dms.git
cd tumblr-dms
docker build -t tumblr-dms .Run it as a named service that restarts after Docker or the host restarts:
docker run -d \
--name tumblr-dms \
--restart unless-stopped \
--env UID="$(id -u)" \
--env GID="$(id -g)" \
-v "$BRIDGE_DIR:/data" \
tumblr-dms
docker logs -f tumblr-dmsThe container refuses to invent a local registration because that would not
register the bridge with Beeper. Like other mautrix bridge images, it runs as
UID/GID 1337 by default and prepares the dedicated /data runtime directory
for that account. Set UID and GID when the bind mount uses a different
numeric owner.
cmd/tumblr-dms/main.go Bridge binary entrypoint
pkg/connector/ Beeper bridge connector
pkg/msgconv/ Message conversion
pkg/tumblr/ Tumblr web client and models
pkg/tumblrid/ Identifier helpers
GitHub Actions builds release binaries when a v* tag is pushed:
tumblr-dms-linux-amd64tumblr-dms-linux-arm64tumblr-dms-darwin-arm64sha256sums.txt
Tumblr DMs is licensed under GNU AGPLv3 or later, with the Beeper and Element
exceptions in LICENSE.exceptions.