Skip to content

Integrations

The Signal Bot integrates with multiple external services to provide enhanced functionality. This page provides an overview of all integrations and their configuration.

ServicePurposeCommandsStatus Check
PeerTubeVideo hosting!save./deploy.sh test-api
DiscourseForum posting!fpost, !flatest, !fsearchCheck logs
OutlineWiki docs!ol, !outlineCheck logs
AuthentikSSO accounts!createuser, !accountinviteCheck logs
Local AISelf-hosted AI!lai, !uai./deploy.sh test-api
OpenAIAI assistant!ai, !summarizeCheck logs
MinIOFile storage!archive, !files./deploy.sh test-minio
ShlinkURL shortening(auto)./deploy.sh test-shlink
GitLab WikiWiki content push!wikiaddCheck logs
GiteaGit repos(auto 3D file archiving)Check logs
WikipediaGeneral knowledge!ask (via unified search)Public API
Google Knowledge GraphEntity facts!ask (via unified search)Optional API key

Purpose: Upload and host videos from Signal

Commands:

  • !save - Upload video with AI-generated metadata
Terminal window
PEERTUBE_URL=http://peertube:9000 # Internal Docker URL
PEERTUBE_PUBLIC_URL=https://videos.irregularchat.com
PEERTUBE_ACCESS_TOKEN=<long-lived-token>
PEERTUBE_CHANNEL_ID=1
  1. Log into PeerTube as an admin
  2. Go to Settings > Application tokens
  3. Create a token with upload permissions
  4. Set expiry to far future (e.g., 2030)
  1. User replies to video with !save
  2. Bot downloads video from Signal
  3. AI analyzes frames + audio transcript for metadata
  4. Video uploaded to PeerTube with generated title/description
  5. Bot returns watch link (SSO login required)
Terminal window
# Test connectivity
./deploy.sh test-api
# Check PeerTube is reachable
docker exec signal-bot-selfhosted-signal-bot-1 curl -s http://peertube:9000/api/v1/config

Purpose: Post content to community forum

Commands:

  • !fpost - Create forum post
  • !flatest - Show latest posts
  • !fsearch <query> - Search forum
  • !categories - List categories

Auto-features:

  • News articles auto-posted with AI summaries
  • Breakout room summaries posted to forum
Terminal window
DISCOURSE_URL=https://forum.irregularchat.com
DISCOURSE_API_KEY=<api-key>
DISCOURSE_USERNAME=bot.username
DISCOURSE_QA_CATEGORY=5 # Category ID for Q&A/news posts
  1. Go to Admin > API > API Keys
  2. Create a key for the bot user
  3. Set appropriate permissions (create topics, post)
Terminal window
# Via API
curl -H "Api-Key: <key>" -H "Api-Username: <user>" \
"https://forum.irregularchat.com/categories.json" | jq '.category_list.categories[] | {id, name}'
# Or check URL: /c/category-name/5 (5 is the ID)

Purpose: Create and search team documentation

Commands:

  • !ol <query> - Search docs
  • !ol ask <question> - AI Q&A from docs
  • !ol note <text> - Quick note
  • !ol ai <content> - Create doc with AI structure
  • !ol -n 5 - Capture last 5 messages to doc
Terminal window
OUTLINE_URL=https://outline.irregularchat.com
OUTLINE_API_KEY=<api-key>
OUTLINE_DEFAULT_COLLECTION=<collection-uuid>
  1. Log into Outline
  2. Go to Settings > API
  3. Create a new API key

When a breakout room ends:

  1. AI generates summary with decisions/action items
  2. Summary posted to Outline
  3. Link shared in original channel

Purpose: Create SSO accounts for new members

Commands:

  • !createuser @user email - Create account
  • !accountinvite [hours] - Create invite link
Terminal window
AUTHENTIK_BASE_URL=https://sso.irregularchat.com
AUTHENTIK_API_TOKEN=<api-token>
AUTHENTIK_INVITE_FLOW_ID=<flow-uuid>
AUTHENTIK_INVITE_FLOW_SLUG=invite-enrollment-flow
  1. Go to Admin > System > Tokens
  2. Create a new token with appropriate permissions
  3. Token needs: user creation, flow access
Terminal window
curl -s -H "Authorization: Bearer <token>" \
"https://sso.irregularchat.com/api/v3/flows/instances/" \
| jq '.results[] | "\(.pk) - \(.slug) - \(.name)"'

Look for invite-enrollment-flow or similar enrollment flow.


Purpose: Self-hosted AI for unrestricted queries

Commands:

  • !lai <question> - Community AI model
  • !uai <question> - Uncensored model
Terminal window
LOCAL_AI_URL=https://ai.irregularchat.com
LOCAL_AI_API_KEY=<api-key>
LOCAL_AI_MODEL=irregularbot
CommandModelBehavior
!laiirregularbotModerate filtering
!uaiuncensoredNo refusals
Terminal window
./deploy.sh test-api

Purpose: AI assistant, summarization, embeddings

Commands:

  • !ask <question> - Unified agentic search (router, gap detection, synthesis)
  • !ai <question> - GPT-4o-mini questions
  • !summarize <url> - Summarize content
  • !tldr <url> - Quick summary
  • !wikiask <question> - Wiki Q&A (uses embeddings)

Auto-features:

  • Unified search routing, gap detection, and answer synthesis
  • News article summarization
  • Video metadata generation
  • Breakout room summaries
Terminal window
OPENAI_API_KEY=sk-...
  • 20 requests per hour per user
  • Group chats only (security)

Purpose: File storage and archiving

Commands:

  • !archive - Archive a file
  • !files <query> - Search archive
  • !get <file> - Get file link

Auto-features:

  • Auto-scan and archive attachments
  • Meme storage
Terminal window
MINIO_ENDPOINT=http://minio-irregularchat:9000 # Internal
MINIO_ACCESS_KEY=<access-key>
MINIO_SECRET_KEY=<secret-key>
MINIO_BUCKET=irregularchat
MINIO_REGION=us-east-1
MINIO_PUBLIC_URL=https://s3.irregular.chat # Public for presigned URLs

MinIO requires TWO S3 clients:

  1. Internal Client (MINIO_ENDPOINT): For API operations
  2. Presign Client (MINIO_PUBLIC_URL): For generating presigned URLs

This ensures signature verification works correctly.

Terminal window
./deploy.sh test-minio

Purpose: Shorten long presigned URLs

Auto-feature: Automatically shortens MinIO presigned URLs for cleaner display

Terminal window
SHLINK_API_URL=http://shlink-api:8080
SHLINK_API_KEY=<api-key>
SHLINK_PUBLIC_URL=https://irregular.chat
  1. MinIO generates presigned URL (long, contains signature)
  2. Shlink creates short URL pointing to presigned URL
  3. Short URL expires when presigned URL expires
Terminal window
./deploy.sh test-shlink

Purpose: Archive 3D printing files to git

Auto-feature: When 3D file links (Thingiverse, Cults3D, Printables) are shared, files are archived to Gitea

Terminal window
GITEA_API_URL=https://git.irregularchat.com/api/v1
GITEA_TOKEN=<api-token>
GITEA_DEFAULT_OWNER=irregulars
GITEA_DEFAULT_REPO=3d-files
  • Thingiverse
  • Cults3D
  • Printables
  • MyMiniFactory

Purpose: Push AI-extracted content from Signal chats to the community wiki

Commands:

  • !wikiadd - Reply to a message to extract and add wiki-worthy content
  • !wikiadd -n <count> - Analyze last N messages for facts and resources
  • !wa -n <count> - Alias for !wikiadd -n
Terminal window
GITLAB_WIKI_URL=http://gitlab:8929/irregulars/IrregularChatWiki.git # Internal Docker URL
GITLAB_WIKI_TOKEN=<personal-access-token> # write_repository scope
WIKI_WORKDIR_PATH=/app/wiki-workdir # Git clone directory
WIKI_GIT_USER=IrregularBot # Commit author name
WIKI_GIT_EMAIL=bot@irregularchat.com # Commit author email
  1. GitLab bot user with Maintainer access on the wiki project (required to push to protected main branch)
  2. Personal access token with write_repository scope
  3. Docker volume for wiki-workdir (persists git clone across container restarts)
  4. Docker network — bot and GitLab must share a network (e.g., postgres-network) so the bot can reach gitlab:8929
  1. User runs !wikiadd (reply or -n count)
  2. Bot extracts messages from Signal chat history
  3. OpenAI analyzes messages for factual, educational content
  4. Bot searches existing wiki pages by title AND content snippets
  5. AI decides: append to existing page or create a new page
  6. Bot clones/pulls the wiki repo into wiki-workdir
  7. Changes are committed and pushed to GitLab
  8. Astro Starlight rebuilds the site (irregularpedia.org)
  • Git credentials are embedded in the remote URL at runtime, never logged
  • All error messages are sanitized to prevent token leakage
  • File paths are validated against path-traversal attacks
  • YAML frontmatter and Markdown content are sanitized against injection
  • A mutex lock prevents concurrent wiki operations
Terminal window
# Check wiki-workdir permissions (must be writable by node user, UID 1000)
docker exec signal-bot-selfhosted-signal-bot-1 ls -la /app/wiki-workdir
# Test GitLab connectivity from inside container
docker exec signal-bot-selfhosted-signal-bot-1 git ls-remote http://gitlab:8929/irregulars/IrregularChatWiki.git
# Check bot user access level (must be 40 = Maintainer)
# Via GitLab rails console on the GitLab container
  • src/src/utils/wiki-content-manager.ts — Core module (clone, analyze, commit, push)
  • src/src/bot/command-handler.tshandleWikiAdd() method

Purpose: General knowledge search for the !ask unified search command

Used by: !ask (unified search) — selected by the AI router for general knowledge, concepts, people, organizations, and history questions.

  1. AI router determines the question needs general knowledge
  2. Wikipedia MediaWiki Action API is queried with the question
  3. Top articles are fetched with summaries (extracts)
  4. Results are included in the unified search context for synthesis

No API key or authentication required. Uses the public MediaWiki Action API.

Rate limit: 200 requests/second (well above bot usage)

src/src/utils/wikipedia-client.ts


Purpose: Quick structured facts about well-known entities (people, organizations, places, concepts)

Used by: !ask (unified search) — selected by the AI router for entity disambiguation and quick facts.

  1. AI router determines the question involves a well-known entity
  2. Google Knowledge Graph Search API returns structured data
  3. Entity descriptions and detailed summaries are extracted
  4. Results are included in the unified search context
Terminal window
GOOGLE_KG_API_KEY=<your-api-key> # Optional — if not set, Knowledge Graph is silently skipped
  1. Go to Google Cloud Console
  2. Enable the “Knowledge Graph Search API”
  3. Create an API key (no OAuth required)
  4. Free tier: 100,000 queries/day

src/src/utils/knowledge-graph-client.ts


For 3D file metadata extraction:

Terminal window
THINGIVERSE_ACCESS_TOKEN=<token>
Terminal window
CULTS3D_API_KEY=<api-key>

For !research command:

Terminal window
RESEARCHTOOLS_API_URL=<url>

Terminal window
# PeerTube + Local AI
./deploy.sh test-api
# MinIO S3
./deploy.sh test-minio
# Shlink
./deploy.sh test-shlink
# Check logs for other integrations
./deploy.sh logs -t 100 | grep -E "(Authentik|Outline|Discourse)"
Terminal window
./deploy.sh shell
# Inside container:
env | grep -E "(PEERTUBE|DISCOURSE|OUTLINE|AUTHENTIK)"