- Install Docker Desktop for Windows.
- Start Docker Desktop.
- Confirm the daemon is running.
- Open a terminal and verify:
docker --version
docker compose version- Open the repository folder.
- Copy
.env.exampleto.env. - Fill in at minimum:
OPENAI_API_KEYDATABASE_URLSIGNAL_API_BASE_URLSIGNAL_BOT_NUMBERSIGNAL_WEBHOOK_SECRETADMIN_API_TOKENADMIN_API_TOKENS(optional, comma-separated)- If you are not running the worker, set
INGESTION_WORKER_ENABLED=falseto use background tasks. - To enable group auto-replies, set
ENABLE_GROUP_AUTO_REPLY=true(optionallyGROUP_AUTO_REPLY_REQUIRE_QUESTION=true).
Run:
make bootstrapExpected outcome:
- Postgres container starts
- signal-cli-rest-api container starts
- Alembic migrations run
Run:
make devExpected ports:
8000for the FastAPI app8080for signal-cli-rest-api5432for Postgres- ingestion worker runs as a background container
- Obtain a fresh phone number for the bot account.
- Start the compose stack.
- Use the registration endpoint exposed by your installed
signal-cli-rest-apiversion forSIGNAL_BOT_NUMBER. - Receive the Signal verification code by SMS or voice on that phone number.
- Use the verification endpoint to complete account setup.
- Confirm the bot account now exists on the laptop-hosted Signal stack.
Note:
signal-cli-rest-apiis unofficial.- Register and verify endpoints can vary by image release.
- Keep the container image current.
- This repo assumes the laptop-hosted bot is the primary and only active Signal device for that account.
- Add the newly registered bot account to a group.
- Send a test message in that group.
- Call:
curl http://localhost:8000/health- Call:
curl -H "Authorization: Bearer <ADMIN_API_TOKEN>" http://localhost:8000/admin/groupsExpected outcome:
- the group appears in admin output
- the message is stored
- the group is ready to be marked
authorized,ingest_only, orignored - the laptop-hosted Signal account is confirmed to be receiving inbound traffic as the primary bot device
Authorize a group:
curl -X POST -H "Authorization: Bearer <ADMIN_API_TOKEN>" http://localhost:8000/admin/groups/<GROUP_ID>/authorizeSet ingest-only:
curl -X POST -H "Authorization: Bearer <ADMIN_API_TOKEN>" http://localhost:8000/admin/groups/<GROUP_ID>/ingest-onlyIgnore a group:
curl -X POST -H "Authorization: Bearer <ADMIN_API_TOKEN>" http://localhost:8000/admin/groups/<GROUP_ID>/ignore- Use a person who has posted recently in an
authorizedgroup. - Send a DM to the bot account.
- The bot should answer privately.
- The DM must not be embedded into shared group retrieval memory.
- Use a person only seen in an
ingest_onlygroup or never seen in an authorized group. - Send a DM to the bot account.
- The bot should refuse politely.
Run:
make ingest-demoThis creates:
- one authorized group
- one ingest-only group
- one allowed user
- one denied user
Run:
make testExpected outcome:
- all unit, integration, and e2e tests pass