中文 | English
OctoTify is a message bus platform that bridges external systems (CI/CD, monitoring, custom apps) with multiple notification channels.
Version: 1.1.0
Supported Channels:
| Channel | Status | Description |
|---|---|---|
| Feishu | ✅ | Feishu custom bot |
| Telegram | ✅ | Telegram bot push |
| ✅ | SMTP email push | |
| DingTalk | ✅ | DingTalk group bot with HMAC-SHA256 signature |
| Gotify | ✅ | Self-hosted Gotify notification server |
| WeCom | 🚧 | WeCom group bot (coming soon) |
| Webhook | 🚧 | Custom webhook (coming soon) |
How it works:
- Create a Source in OctoTify — you get a unique push token
- Bind the Source to one or more Channels (Feishu group, Telegram bot, etc.)
- External systems push messages via
POST /api/push/{token} - OctoTify concurrently delivers messages to all bound channels
- Decoupled Push — External systems push to a single token, no need to be aware of downstream channels
- Flexible Routing — Bind/unbind channels anytime, one source → many destinations
- Independent Fault Tolerance — One channel failing doesn't affect others, each channel has an independent 30-second timeout
- Extensible by Design — Strategy pattern architecture, add new channels without modifying existing code
- Full Audit Trail — Every push attempt is recorded, including status and error details
Create docker-compose.yml:
services:
octotify:
image: loommii/octotify:latest
container_name: octotify
restart: unless-stopped
ports:
- "5233:5233"
volumes:
- octotify-data:/app/data
volumes:
octotify-data:Start:
docker compose up -dPersistence recommendation: Use named volume
octotify-datato persist the database and logs, preventing data loss when the container is removed.
After starting, visit http://localhost:5233.
docker run -d \
--name octotify \
-p 5233:5233 \
-v octotify-data:/app/data \
loommii/octotify:latestPrerequisites:
- Go 1.26+
- Node.js 20+
Backend:
cd backend
go run cmd/server/main.goFrontend:
cd frontend
pnpm install
pnpm dev:eleOr use the startup scripts in the run/ directory.
External systems push messages via the following endpoint:
POST /api/push/src019df95961e6743a85bb86bc1e42e181
Content-Type: application/json
{
"title": "CI Build",
"message": "Build #123 passed"
}Response:
{
"code": 0,
"msg": "Success",
"data": {
"total": 2,
"success": 2,
"failed": 0,
"results": [
{ "channel_id": 1, "channel_name": "Feishu", "message_id": 10, "success": true },
{ "channel_id": 2, "channel_name": "WeCom", "message_id": 11, "success": true }
]
}
}Except for JWT authentication failures which return HTTP 401, all business errors return HTTP 200, with the
codefield distinguishing error types.
External System ──POST /api/push/{token}──→ OctoTify
│
Validate Source Token
│
Query associated Channels
│
Concurrent push to each channel
(independent goroutine per channel, 30s timeout)
│
Record results → Return push summary
Backend uses Go + Gin, frontend uses Vue 3 + Vite, data storage uses SQLite, and the data access layer uses GORM Gen.
New Features
- Password step-up authentication for sensitive operations
UI Upgrade
- Complete frontend overhaul with brand new UI and interaction experience
Security Fixes
- Feishu webhook URL sanitized in logs to prevent credential leakage
- Gotify app_token migrated to
X-Gotify-Keyheader to avoid token exposure in URL logs - SMTP TLS certificate validation changed from hardcoded skip to user-configurable, eliminating MITM risk
Stability Improvements
- SQLite WAL mode + busy_timeout to resolve
SQLITE_BUSYerrors under high concurrency - Container runtime switched to non-root user (
USER app)
New Channels
- DingTalk channel with HMAC-SHA256 signature verification
- Gotify self-hosted push channel
Core Features
- Source management with unique push token generation
- Multi-channel push: Feishu, Telegram, Email
- Flexible routing: one source to multiple channels
- Push history and audit trail
Deployment
- Docker Compose one-click deployment
- SQLite database, ready to use out of the box
For detailed design docs, API specifications, and UML diagrams, see the docs directory:
| Document | Description |
|---|---|
| Architecture | Project architecture, domain models, database design |
| API Specification | API design rules, pagination, response format |
| Error Codes | Error code definitions by module |
| UML Diagrams | Use case, sequence, class, state, and activity diagrams |
New Channels:
- Add DingTalk group bot with HMAC-SHA256 signature verification
- Add Telegram bot push with optional HTTP proxy support
- Add Email SMTP sender supporting port 465 (implicit TLS), 587 (STARTTLS), and 25 (plaintext)
- Add Gotify self-hosted notification server with Markdown message format and priority support
Improvements:
- Frontend channel form auto-normalizes numeric fields on submit
- Added comprehensive E2E Playwright tests for all channels