Ein persönlicher Auto-Antwort-Bot für Signal, der eingehende Nachrichten mit einer lokal laufenden KI (Ollama) beantwortet — 100 % kostenlos und datenschutzfreundlich (keine Nachricht verlässt deinen Computer).
- ⚡ Auto-Antworten auf Signal-Nachrichten — mit wählbarem Tonfall (Standard, Traurig, Fröhlich, Zurückhaltend, Lustig, Witzig, Finanzberater)
- 🤖 Lokale KI via Ollama (z. B.
qwen2.5:14b) — 0 € Kosten, Nachrichten bleiben auf deinem Rechner - 🧠 Chatverlauf pro Kontakt (letzte 100 Nachrichten als Kontext)
- ⏱️ Auto-Senden nach festen 3 s (per Checkbox im Panel ein-/ausschaltbar) mit sichtbarem Countdown
- 🛡️ Sicherheit: Test-Modus sendet niemals, Einzelinstanz-Schutz, Antwort-Sperre bei Nachrichten-Salven (2,5 s Debounce)
- 🖥️ Kontroll-Panel (Tkinter): Empfang starten/stoppen, Whitelist verwalten, Töne wählen, Gesundheits-Check, System-Tray
- 💬 Tipp-Indikator („… schreibt") während der Generierung
- 🔄 Persistenter Daemon (signal-cli JSON-RPC) — kein JVM-Neustart pro Befehl, Sync an eigene Geräte
Signal-Nachricht → signal-cli Daemon (WSL2, JSON-RPC :7583) → Kontroll-Panel (Python) → Ollama (lokal)
↑ ↓
Antwort wird angezeigt → Freigabe (oder Auto-Senden) → gesendet
| Datei | Zweck |
|---|---|
signal_bot_control.py |
Kontroll-Panel (Tkinter) — Hauptprogramm |
signal_daemon.py |
Persistenter signal-cli-Daemon (JSON-RPC :7583, Empfang/Notification) |
signal_popup.py |
Legacy: separates Freigabe-Popup (vom Panel nicht genutzt) |
signal_bridge.py |
Legacy: Polling-Bridge (vom Panel nicht genutzt) |
signal_cli_link.py |
Geräte-Kopplung (QR-Code) |
chat_history.py |
Chatverlauf pro Kontakt (JSON) |
signal_bot_popup_test.py |
Standalone-Test-Harness (echtes Ollama-Modell, sendet nie) |
Hinweis:
signal_popup.pyundsignal_bridge.pysind Legacy-Pfade aus der ersten Version und werden vom Panel nicht verwendet — nie parallel zum Panel betreiben.
- Windows mit WSL2 (Ubuntu) +
signal-cli(AsamK/signal-cli) - Ollama lokal (ollama.com) mit einem Modell, z. B.
ollama pull qwen2.5:14b - Python 3.10+ (Windows) mit
tkinterund den Paketenpystray+Pillow(Panel) sowieqrcode(nur für die Geräte-Kopplung) - Ein Signal-Konto als Linked Device (QR-Code via
signal_cli_link.py)
Hinweis:
signal-cliwird unter$HOME/.local/bin/signal-cliin WSL erwartet (Pfad inSIGNAL_CLIanpassbar).
# 1. Signal-Konto koppeln (QR-Code mit Signal-App scannen)
python signal_cli_link.py
# 2. Ollama-Modell installieren (einmalig)
ollama pull qwen2.5:14b
# 3. signal_bot_config.json anlegen und Whitelist eintragen (NUR diese
# Kontakte werden automatisch beantwortet! - Beispiel siehe Konfiguration)
# 4. Panel starten
python signal_bot_control.pyIm Panel: „Empfang starten" klicken → eingehende Nachrichten von Whitelist-Kontakten werden generiert und (optional automatisch) beantwortet.
Die Konfiguration liegt in signal_bot_config.json im Projektordner (wird einmalig angelegt; fehlt sie, startet das Panel mit leerer Whitelist):
{
"own_number": "+491234567890",
"poll_interval_seconds": 5,
"whitelist": ["+491234567890"],
"contact_names": {},
"auto_send_enabled": false,
"last_tone": "Standard"
}whitelist: Nur diese Nummern werden beantwortetcontact_names: Anzeigenamen (werden in den KI-Prompt eingebaut)auto_send_enabled: Antwort nach 3 s automatisch senden (Checkbox im Panel)last_tone: Zuletzt gewählter Tonfall (bleibt über Neustarts erhalten)own_number: Eigene Nummer (eigene Nachrichten von anderen Geräten werden ignoriert)poll_interval_seconds: vom Panel nicht mehr verwendet (Daemon-Push); nur noch von der Legacy-Bridge gelesen
Das Modell ist per Umgebungsvariable
SIGNAL_BOT_MODELüberschreibbar (Default:qwen2.5:14b). Alle Sende-Entscheidungen werden inlogs/approval.logprotokolliert.
- 🔒 Keine sensiblen Daten im Repository — Whitelist, Chatverläufe, Logs und Kopplungs-QR werden durch
.gitignoreausgeschlossen - 🏠 Alles läuft lokal — Nachrichten und Antworten verlassen deinen Rechner nicht
- 🧪 Test-Modus: Antworten werden generiert, aber niemals gesendet
- 🔄 Einzelinstanz-Schutz: Es kann nur eine Bot-Instanz gleichzeitig laufen
- 🔒 WSL-NAT: Der signal-cli-Daemon bindet nur innerhalb von WSL2 — vom LAN nicht erreichbar
MIT — frei verwendbar, anpassbar und weiterverbreitbar.
A personal auto-reply bot for Signal that answers incoming messages with a locally running AI (Ollama) — 100 % free and privacy-friendly (no message ever leaves your computer).
- ⚡ Auto-replies to Signal messages — with selectable tone (Standard, Sad, Cheerful, Reserved, Funny, Silly, Financial Advisor)
- 🤖 Local AI via Ollama (e.g.
qwen2.5:14b) — 0 € cost, messages stay on your machine - 🧠 Per-contact chat history (last 100 messages as context)
- ⏱️ Auto-send after a fixed 3 s (toggleable via checkbox in the panel) with visible countdown
- 🛡️ Safety: test mode never sends, single-instance protection, reply debounce for message bursts (2.5 s)
- 🖥️ Control panel (Tkinter): start/stop receiving, manage whitelist, pick tones, health check, system tray
- 💬 Typing indicator ("… is typing") while generating
- 🔄 Persistent daemon (signal-cli JSON-RPC) — no JVM restart per command, sync to own devices
Signal message → signal-cli daemon (WSL2, JSON-RPC :7583) → Control panel (Python) → Ollama (local)
↑ ↓
Reply is shown → approval (or auto-send) → sent
| File | Purpose |
|---|---|
signal_bot_control.py |
Control panel (Tkinter) — main program |
signal_daemon.py |
Persistent signal-cli daemon (JSON-RPC :7583, receive/notifications) |
signal_popup.py |
Legacy: standalone approval popup (not used by the panel) |
signal_bridge.py |
Legacy: polling bridge (not used by the panel) |
signal_cli_link.py |
Device linking (QR code) |
chat_history.py |
Per-contact chat history (JSON) |
signal_bot_popup_test.py |
Standalone test harness (real Ollama model, never sends) |
Note:
signal_popup.pyandsignal_bridge.pyare legacy paths from the first version and are not used by the panel — never run them in parallel with the panel.
- Windows with WSL2 (Ubuntu) +
signal-cli(AsamK/signal-cli) - Ollama locally (ollama.com) with a model, e.g.
ollama pull qwen2.5:14b - Python 3.10+ (Windows) with
tkinterand the packagespystray+Pillow(panel) andqrcode(device linking only) - A Signal account as a linked device (QR code via
signal_cli_link.py)
Note:
signal-cliis expected at$HOME/.local/bin/signal-cliinside WSL (path adjustable viaSIGNAL_CLI).
# 1. Link the Signal account (scan QR code with the Signal app)
python signal_cli_link.py
# 2. Install the Ollama model (once)
ollama pull qwen2.5:14b
# 3. Create signal_bot_config.json and add numbers to the whitelist (ONLY
# these contacts get auto-replies! - see example under Configuration)
# 4. Start the panel
python signal_bot_control.pyIn the panel click "Empfang starten" — incoming messages from whitelisted contacts are generated and (optionally) auto-replied.
Configuration lives in signal_bot_config.json in the project folder (created manually once; if missing, the panel starts with an empty whitelist):
{
"own_number": "+491234567890",
"poll_interval_seconds": 5,
"whitelist": ["+491234567890"],
"contact_names": {},
"auto_send_enabled": false,
"last_tone": "Standard"
}whitelist: only these numbers get repliescontact_names: display names (injected into the AI prompt)auto_send_enabled: send the reply automatically after 3 s (checkbox in the panel)last_tone: last selected tone (persists across restarts)own_number: your own number (own messages from other devices are ignored)poll_interval_seconds: no longer used by the panel (daemon push); only the legacy bridge reads it
The model can be overridden via the environment variable
SIGNAL_BOT_MODEL(default:qwen2.5:14b). All send decisions are logged tologs/approval.log.
- 🔒 No sensitive data in this repository — whitelist, chat logs, and linking QR codes are excluded via
.gitignore - 🏠 Everything runs locally — messages and replies never leave your machine
- 🧪 Test mode: replies are generated but never sent
- 🔄 Single-instance protection: only one bot instance can run at a time
- 🔒 WSL NAT: the signal-cli daemon binds only inside WSL2 — not reachable from the LAN
MIT — free to use, modify, and distribute.
Персональный бот автоответчик для Signal, отвечающий на входящие сообщения с помощью локальной ИИ-модели (Ollama) — 100 % бесплатно и конфиденциально (ни одно сообщение не покидает ваш компьютер).
- ⚡ Автоответы на сообщения Signal — с выбором тона (Стандартный, Грустный, Весёлый, Сдержанный, Смешной, Уморительный, Финансовый советник)
- 🤖 Локальный ИИ через Ollama (например,
qwen2.5:14b) — 0 €, сообщения остаются на вашем устройстве - 🧠 История переписки по контактам (последние 100 сообщений как контекст)
- ⏱️ Автоотправка через фиксированные 3 с (включается/выключается флажком в панели) с видимым отсчётом
- 🛡️ Безопасность: тестовый режим никогда не отправляет, защита от повторных запусков, задержка ответа при потоке сообщений (2,5 с)
- 🖥️ Панель управления (Tkinter): запуск/остановка приёма, управление белым списком, выбор тона, проверка состояния, системный трей
- 💬 Индикатор набора текста («…печатает») во время генерации
- 🔄 Постоянный демон (signal-cli JSON-RPC) — без перезапуска JVM на каждую команду, синхронизация с собственными устройствами
Сообщение Signal → демон signal-cli (WSL2, JSON-RPC :7583) → Панель управления (Python) → Ollama (локально)
↑ ↓
Ответ показывается → подтверждение (или автоотправка) → отправка
| Файл | Назначение |
|---|---|
signal_bot_control.py |
Панель управления (Tkinter) — главная программа |
signal_daemon.py |
Постоянный демон signal-cli (JSON-RPC :7583, приём/уведомления) |
signal_popup.py |
Legacy: отдельное окно подтверждения (панелью не используется) |
signal_bridge.py |
Legacy: polling-мост (панелью не используется) |
signal_cli_link.py |
Привязка устройства (QR-код) |
chat_history.py |
История переписки по контактам (JSON) |
signal_bot_popup_test.py |
Отдельный тестовый стенд (настоящая модель Ollama, никогда не отправляет) |
Примечание:
signal_popup.pyиsignal_bridge.py— legacy-пути первой версии, панель их не использует — никогда не запускайте их параллельно с панелью.
- Windows с WSL2 (Ubuntu) +
signal-cli(AsamK/signal-cli) - Ollama локально (ollama.com) с моделью, например:
ollama pull qwen2.5:14b - Python 3.10+ (Windows) с
tkinterи пакетамиpystray+Pillow(панель), а такжеqrcode(только для привязки устройства) - Аккаунт Signal как связанное устройство (QR-код через
signal_cli_link.py)
Примечание:
signal-cliожидается по пути$HOME/.local/bin/signal-cliвнутри WSL (путь настраивается черезSIGNAL_CLI).
# 1. Привяжите аккаунт Signal (отсканируйте QR-код приложением Signal)
python signal_cli_link.py
# 2. Установите модель Ollama (один раз)
ollama pull qwen2.5:14b
# 3. Создайте signal_bot_config.json и добавьте номера в белый список
# (только эти контакты получат автоответы! - пример см. в Конфигурации)
# 4. Запустите панель
python signal_bot_control.pyВ панели нажмите «Empfang starten» — входящие сообщения из белого списка будут генерироваться и (по желанию) отправляться автоматически.
Конфигурация хранится в signal_bot_config.json в папке проекта (создаётся вручную один раз; если файла нет, панель запускается с пустым белым списком):
{
"own_number": "+491234567890",
"poll_interval_seconds": 5,
"whitelist": ["+491234567890"],
"contact_names": {},
"auto_send_enabled": false,
"last_tone": "Standard"
}whitelist: только эти номера получают ответыcontact_names: отображаемые имена (встраиваются в промпт ИИ)auto_send_enabled: отправлять ответ автоматически через 3 с (флажок в панели)last_tone: последний выбранный тон (сохраняется между перезапусками)own_number: собственный номер (свои сообщения с других устройств игнорируются)poll_interval_seconds: больше не используется панелью (push демона); нужен только legacy-мосту
Модель можно переопределить через переменную окружения
SIGNAL_BOT_MODEL(по умолчанию:qwen2.5:14b). Все решения об отправке протоколируются вlogs/approval.log.
- 🔒 В этом репозитории нет конфиденциальных данных — белый список, истории переписки и QR-коды привязки исключены через
.gitignore - 🏠 Всё работает локально — сообщения и ответы не покидают ваш компьютер
- 🧪 Тестовый режим: ответы генерируются, но никогда не отправляются
- 🔄 Защита от повторных запусков: одновременно может работать только один экземпляр бота
- 🔒 WSL NAT: демон signal-cli привязывается только внутри WSL2 — из локальной сети недоступен
MIT — можно свободно использовать, изменять и распространять.