Skip to content

AI powered Signal group message summarizer. Never miss a precious conversation from a beloved signal chat group.

License

Notifications You must be signed in to change notification settings

enddzone/summarizarr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

51 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Summarizarr

CI Release License: MIT Container

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).

Features

  • 🐳 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

Architecture

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
Loading

Quick Start

Docker Compose (Recommended)

# 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

Single Container

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

AI Provider Setup

Local AI (Ollama Sidecar)

# 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

Cloud Providers

# 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

Configuration

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.

Development

# 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

API Endpoints

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

Privacy & Security

  • 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

Database Encryption

SQLCipher encryption is mandatory and automatically managed:

  • Development: On first run, a 32-byte key is generated and stored at ./data/encryption.key with 0600 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.

Production Deployment

Container Registry

# Latest version
docker pull ghcr.io/enddzone/summarizarr:latest

# Specific version
docker pull ghcr.io/enddzone/summarizarr:v1.0.0

Health Monitoring

# Health check
curl http://localhost:8081/health

# Version info
curl http://localhost:8081/api/version

# Container logs
docker logs summarizarr

Contributing

  1. Fork the repository
  2. Create feature branch: git checkout -b feature/name
  3. Commit changes: git commit -m 'Add feature'
  4. Push branch: git push origin feature/name
  5. Open Pull Request

License

MIT License - see LICENSE file for details.

Acknowledgments

About

AI powered Signal group message summarizer. Never miss a precious conversation from a beloved signal chat group.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 5