No description
Find a file
2026-01-25 15:06:28 -06:00
src refactor: moved db commands into DB bean 2026-01-25 14:45:57 -06:00
.env.example feat: created project 2026-01-21 11:30:15 -06:00
.envrc feat: created project 2026-01-21 11:30:15 -06:00
.gitignore feat: ignored db files 2026-01-21 16:21:17 -06:00
eslint.config.mjs lint: added more linting rules 2026-01-23 16:19:54 -06:00
flake.lock feat: created project 2026-01-21 11:30:15 -06:00
flake.nix feat: created project 2026-01-21 11:30:15 -06:00
jest.config.js test: added tests for scheduled things 2026-01-22 22:07:37 -06:00
LICENSE.txt feat: updated to agpl 2026-01-22 14:47:13 -06:00
package.json lint: added more linting rules 2026-01-23 16:19:54 -06:00
pnpm-lock.yaml lint: added more linting rules 2026-01-23 16:19:54 -06:00
pnpm-workspace.yaml feat: added basic command processing to bot 2026-01-21 16:18:26 -06:00
README.md chore: updated README 2026-01-22 18:45:56 -06:00
TODO.md chore: added TODO task 2026-01-25 15:06:28 -06:00
tsconfig.json feat: added basic command processing to bot 2026-01-21 16:18:26 -06:00

Signal Group Admin Bot

A Signal bot for managing group chats with a hierarchical space/room system. Supports public and private channels. Scheduled messages. And channels that refresh themselves after some amount of time.

Features

  • Spaces: Admin groups that serve as control centers for managing multiple groups
  • Channels: Group chats that are a part of a space
  • Room Discovery: Users can query rooms from DMs or from within any bound room
  • SQLite Database: Persistent storage for spaces, and rooms

Architecture

┌──────────────────┐
│  Direct Messages │
│   (DM Commands)  │
└────────┬─────────┘
         │ !new <name>
         ▼
┌──────────────────┐
│   Admin Space    │ ◄── Control center for room/user management
│  (Admin Cmds)    │
│                  │
│  • Manage rooms  │
│  • Vet users     │
└────────┬─────────┘
         │ !create / !bind
         ▼
┌──────────────────┐
│     Channel      │
└──────────────────┘

Room Information

Every room created by the bot includes:

  • Space ID: The admin space that manages this room
  • Room ID: The unique identifier for this room

Setup

Prerequisites

  • Node.js 18+
  • pnpm
  • signal-cli configured and linked to a Signal account

Environment Variables

Copy .env.example to .env and configure:

SIGNAL_NUMBER=+1234567890        # Your Signal number
SIGNAL_CLI_PATH=signal-cli       # Path to signal-cli binary
SIGNAL_CONFIG_DIR=~/.local/share/signal-cli  # signal-cli config directory
DATABASE_PATH=./data/bot.db      # SQLite database path
PORT=5000                        # HTTP server port

Installation

pnpm install
pnpm build
pnpm start

Development

pnpm dev

Security

  • Admin Room Trust: Anyone in an admin space is trusted to run commands
  • Bind Requirement: To bind an existing room, the bot must be a member of that room
  • Space Isolation: Each admin space can only manage its own bound rooms
  • Room Uniqueness: A room can only be bound to one admin space at a time

Workflow Example

  1. Create a Space: DM the bot with !new My Community
  2. Create Rooms: In the admin space, use !create General Chat
  3. Discover Rooms: Users can run !rooms in any bound room to get a DM with the room list
  4. Query Spaces: Users can DM the bot with !space <space-id> to see available rooms