EF Slack Webhook Setup — 5-minute guide
For: Billy
Why: When Ryan clicks any decision card on /tour/decide (sign / discuss / explore / send-summary), the platform POSTs to /api/tour/decide which both persists to .data/tour_decisions.json on the VM AND posts to Slack if a webhook URL is configured. Without the webhook, you'd cat the file on the VM to check — fine for fallback, but a real-time DM is the right experience during the reveal week.
Steps
1. Create the Slack webhook (in your Slack workspace)
Either:
- (a) Direct DM to yourself — create an "Incoming Webhook" app that posts to your own DM channel. Click the bell silent-mode if Ryan signal is the only thing you want loud.
- (b) Dedicated channel — create
#ef-reveal-signal(private channel, you + Mycelia + Praetor as members), webhook posts there. Cleaner separation; recommended if you'll do future client reveals + want a reusable pattern.
Go to: https://api.slack.com/messaging/webhooks → "Create your Slack app" (or use an existing app) → "Incoming Webhooks" → "Activate" → "Add New Webhook to Workspace" → pick the channel/DM → authorize.
You'll get a URL like:
https://hooks.slack.com/services/T0XXXXXXX/B0YYYYYYY/abc123def456ghi789jkl
2. Drop it onto the VM
The webhook URL goes into the EF platform's env file. Two ways:
Option A — via Faber (cleanest): Tell Faber on his next boot:
Add SLACK_WEBHOOK_URL=https://hooks.slack.com/services/... to /opt/ef/.env.local on the VM, then restart ef.service.
He'll handle it in ~5 min.
Option B — yourself via gcloud SSH:
gcloud compute ssh ef-vm --zone=YOUR_ZONE --command='echo "SLACK_WEBHOOK_URL=https://hooks.slack.com/services/..." | sudo tee -a /opt/ef/.env.local && sudo systemctl restart ef.service'
Substitute YOUR_ZONE (check gcloud compute instances list) and the webhook URL.
3. Test
After restart, click any decision card on /tour/decide while logged in as billy. You should see a Slack message land in your DM/channel within a second.
Expected format (Faber's per his #75):
🟢 [explore | sign | discuss | send-summary]
Time spent in tour: [duration]
Last station: [station-name]
[Optional: email address if send-summary]
4. Until then — the fallback
The decision persists to /opt/ef/.data/tour_decisions.json on the VM regardless. To check it manually during the reveal week:
gcloud compute ssh ef-vm --zone=YOUR_ZONE --command='sudo cat /opt/ef/.data/tour_decisions.json'
Or ask Faber to cat it on a boot. Or ask Mycelia to spin up a small monitor.
Recommended for the reveal week
Do option (b) — create the #ef-reveal-signal private channel. It also becomes the place Faber posts hosted-smoke results + Praetor posts contract-package status + Mycelia posts deck/comms updates. One channel, all signal, mutable when nothing's happening.
— Mycelia, 2026-05-25