AI-powered Signal message summarizer in a single ~57MB container. Connects to Signal groups, stores messages in SQLite, and generates periodic AI summaries using local (Ollama sidecar) or cloud AI providers (OpenAI, Groq, Gemini, Claude).
- π³ Single Container: All-in-one deployment with embedded web UI
- π€ Multi-Provider AI: Local Ollama sidecar, OpenAI, Groq, Gemini, Claude support
- π Privacy-First: Automatic data anonymization before AI processing
- π± Signal Integration: WebSocket connection to signal-cli-rest-api
- π Modern UI: Responsive Next.js interface with filtering and export
- β‘ Production Ready: Health checks, multi-arch builds, security scanning
graph TB
subgraph "Signal Integration"
SC[Signal CLI REST API<br/>Port 8080]
end
subgraph "Summarizarr Container"
subgraph "Backend (Go)"
WS[WebSocket Client]
API[HTTP Server<br/>Port 8081]
DB[(SQLite Database)]
SCHED[AI Scheduler]
end
subgraph "Frontend"
UI[Embedded Next.js UI]
end
end
subgraph "AI Providers"
LOCAL[π Ollama<br/>Sidecar AI]
OPENAI[π OpenAI<br/>GPT-4]
GROQ[β‘ Groq<br/>Fast Inference]
GEMINI[π§ Gemini<br/>via Proxy]
CLAUDE[π€ Claude<br/>via Proxy]
end
SC -.->|WebSocket| WS
WS --> DB
SCHED --> DB
API --> DB
API --> UI
SCHED --> LOCAL
SCHED --> OPENAI
SCHED --> GROQ
SCHED --> GEMINI
SCHED --> CLAUDE
style LOCAL fill:#e1f5fe
style OPENAI fill:#fff3e0
style GROQ fill:#f3e5f5
style GEMINI fill:#e8f5e8
style CLAUDE fill:#fce4ec
# 1. Download configuration
curl -O https://raw.githubusercontent.com/enddzone/summarizarr/main/compose.yaml
curl -O https://raw.githubusercontent.com/enddzone/summarizarr/main/.env.example
cp .env.example .env
# 2. Configure Signal phone number
# Edit the .env file and set your Signal phone number:
# SIGNAL_PHONE_NUMBER=+1234567890
# 3. Configure AI
# Edit the .env file and update your OpenAI api key:
# OPENAI_API_KEY=sk-my-api-key
# 4. Start services
docker compose up -d
# 5. Access web UI: http://localhost:8081
docker run -d \
--name summarizarr \
-p 8081:8081 \
-e SIGNAL_PHONE_NUMBER="+1234567890" \
-e AI_PROVIDER=openai \
-e OPENAI_API_KEY=sk-openai-api-key \
-v summarizarr-data:/data \
ghcr.io/enddzone/summarizarr:latest
# 1. Start Ollama + pull model
docker run -d -p 11434:11434 --name ollama ollama/ollama
docker exec ollama ollama pull llama3.2:1b
# 2. Configure Summarizarr
AI_PROVIDER=local
OLLAMA_HOST=http://localhost:11434
# 3. With Docker Compose (recommended)
COMPOSE_PROFILES=local-ai docker compose up -d
# OpenAI
AI_PROVIDER=openai
OPENAI_API_KEY=sk-your-key-here
# Groq (fastest inference)
AI_PROVIDER=groq
GROQ_API_KEY=gsk-your-key-here
# Gemini (requires proxy)
AI_PROVIDER=gemini
GEMINI_API_KEY=your-key-here
GEMINI_BASE_URL=http://localhost:8000/hf/v1
# Claude (requires proxy)
AI_PROVIDER=claude
CLAUDE_API_KEY=sk-ant-your-key-here
CLAUDE_BASE_URL=http://localhost:8000/openai/v1
Variable | Default | Description |
---|---|---|
SIGNAL_PHONE_NUMBER |
- | Required Phone number for Signal |
AI_PROVIDER |
openai |
AI provider: local , openai , groq , gemini , claude |
SUMMARIZATION_INTERVAL |
12h |
Summary frequency (30m, 1h, 6h, 1d) |
DATABASE_PATH |
/app/data/summarizarr.db |
SQLite database location |
LOG_LEVEL |
INFO |
Logging verbosity |
See full configuration reference for all provider-specific options.
# Quick development setup
make dev-setup
make all # Start Signal + Go backend + Next.js frontend
# Service URLs
# Frontend (dev): http://localhost:3000 - Hot reload
# Backend API: http://localhost:8081 - Embedded frontend
# Signal CLI: http://localhost:8080 - WebSocket service
# Individual services
make signal # Signal container only
make backend # Go backend
make frontend # Next.js with hot reload
# Testing
make test-backend
make test-frontend
### SQLCipher (Local Dev & Tests)
Backend encryption features require SQLCipher when running locally:
- macOS: `brew install sqlcipher`
- Ubuntu/Debian: `sudo apt-get install sqlcipher libsqlcipher-dev pkg-config libssl-dev`
Tests: `make test` will automatically use SQLCipher if available (CGO + `-tags sqlite_crypt libsqlite3`). If SQLCipher isn't installed, backend tests run without encryption and encryption-specific tests may be skipped.
Build tags: we pass both `sqlite_crypt` and `libsqlite3`.
- `sqlite_crypt` enables SQLCipher-specific paths in our code and dependencies.
- `libsqlite3` ensures the mattn/go-sqlite3 driver links against system libsqlite3/sqlcipher on some platforms (notably Alpine/musl) for predictable linkage. This dual-tag approach was tested on macOS, Ubuntu CI, and Alpine-based Docker builds.
# Stop all
make stop
Method | Endpoint | Description |
---|---|---|
GET |
/ |
Web interface |
GET |
/health |
Health check |
GET |
/api/version |
Version info |
GET |
/api/summaries |
List summaries (with filters) |
GET |
/api/groups |
List Signal groups |
GET |
/api/export |
Export data (JSON/CSV) |
DELETE |
/api/summaries/{id} |
Delete summary |
- Automatic anonymization of names and phone numbers before AI processing
- Local data storage in SQLite database
- Database encryption with SQLCipher (AES-256)
- Non-root container execution
- Vulnerability scanning with Trivy
- No external data sent without anonymization
SQLCipher encryption is mandatory and automatically managed:
- Development: On first run, a 32-byte key is generated and stored at
./data/encryption.key
with0600
permissions. No env vars required. - Production: Provide the 32-byte key via a Docker secret mounted at
/run/secrets/encryption_key
.
Keys are 32-byte (64 hex characters) for AES-256. Never commit keys to version control or bake them into images.
Note: Databases must be encrypted from the first run. There is no supported migration from unencrypted databases.
# Latest version
docker pull ghcr.io/enddzone/summarizarr:latest
# Specific version
docker pull ghcr.io/enddzone/summarizarr:v1.0.0
# Health check
curl http://localhost:8081/health
# Version info
curl http://localhost:8081/api/version
# Container logs
docker logs summarizarr
- Fork the repository
- Create feature branch:
git checkout -b feature/name
- Commit changes:
git commit -m 'Add feature'
- Push branch:
git push origin feature/name
- Open Pull Request
MIT License - see LICENSE file for details.
- Signal CLI REST API - Signal integration
- Ollama - Local AI capabilities
- Next.js - Modern web framework
- Shadcn/ui - UI components