A self-hosted Bluesky bot that auto-translates your posts into multiple languages
DDaraBot (따라봇) — ddara (따라, "follow along") + bot (로봇)
A bot that follows your posts and expands them into multiple languages.
No separate bot account needed. DDaraBot uses your own app password to post translated replies from your account — your followers see the translations as if you wrote them yourself.
Your post: "오늘 날씨가 좋네요! #ddara"
↓ Detected via Jetstream WebSocket
↓ Translated via Genkit LLM
Reply (en): "The weather is nice today! 🌐 Translated by #DDaraBot"
Reply (ja): "今日はいい天気ですね! 🌐 Translated by #DDaraBot"
Reply (zh): "今天天气真好! 🌐 Translated by #DDaraBot"
- Detects your posts containing
#ddarain real-time via Jetstream - Translates into configured target languages using Genkit
- Posts translated replies from your account with
#DDaraBottag
All providers are supported through Genkit's unified API:
| Provider | Model Example |
|---|---|
| OpenAI | openai/gpt-4o-mini |
| Anthropic | anthropic/claude-sonnet-4-20250514 |
| Google AI | googleai/gemini-2.5-flash |
| Ollama | ollama/llama3 |
| Vertex AI | vertexai/gemini-2.5-flash |
- A Bluesky app password
- An LLM API key (depending on your chosen provider)
No build required. Just create a config file and run:
# 1. Download the example config
mkdir -p data
curl -o data/config.toml https://raw.githubusercontent.com/huketo/ddarabot/main/config.example.toml
# 2. Edit data/config.toml with your Bluesky handle, app password, and LLM API key
# 3. Run
docker run -d --restart unless-stopped \
-v ./data:/app/data \
huketo/ddarabot:latest# docker-compose.yml
services:
ddarabot:
image: huketo/ddarabot:latest
restart: unless-stopped
volumes:
- ./data:/app/data
environment:
- TZ=Asia/Seoul# Place config.toml in ./data/, then:
docker compose up -dRequires Go 1.24+.
git clone https://github.com/huketo/ddarabot.git
cd ddarabot
make build
cp config.example.toml config.toml
# Edit config.toml
./bin/ddarabot --config config.tomlSee config.example.toml for the full reference.
[bluesky]
handle = "my-handle.bsky.social"
app_password = "xxxx-xxxx-xxxx-xxxx"
[translation]
source_language = "ko"
target_languages = ["en", "ja", "zh"]
trigger_hashtag = "ddara"
[llm]
model = "googleai/gemini-2.5-flash"
[llm.googleai]
api_key = "your-api-key"Your DID is automatically resolved from
bluesky.handleat startup — no need to look it up manually.
Sensitive values can be injected via environment variables:
| Variable | Overrides |
|---|---|
DDARA_BLUESKY_APP_PASSWORD |
bluesky.app_password |
OPENAI_API_KEY |
llm.openai.api_key |
ANTHROPIC_API_KEY |
llm.anthropic.api_key |
GOOGLE_API_KEY |
llm.googleai.api_key |
ddarabot --config config.toml # Run the bot
ddarabot --config config.toml --dry-run # Translate without posting (test mode)
ddarabot validate --config config.toml # Validate config + test LLM connection
ddarabot version # Print versionmake build # Build binary
make test # Run tests
make lint # Check gofmt + go vet
make fmt # Auto-format code
make release # Cross-compile for all platforms
make docker-build # Build Docker image locally
make docker-deploy # Deploy with docker compose
make clean # Remove build artifacts