Community alert bots
A community that wants a feed of large transfers in a Discord channel can point a rule at a Discord webhook, with no server of its own. Telegram delivery is Early access, and it reaches one linked private chat only. A Telegram group or channel needs a small relay of its own today.
#Workflow
- In Discord, create a webhook in the target channel, and copy its URL.
- Write the rule in the rule tester. Start with a high threshold, because of the hourly cap.
- Sign in to the console with a Solana wallet, then save the rule with delivery
Discord webhookand the Discord URL. Set the cooldown. The default of 300 seconds limits the feed to 12 messages per hour, and matches in between are dropped. - Send a test delivery, and check that the message appears.
- Check the delivery log after a day. Lots of
failedrows mean something is wrong with the webhook.
#Rules
Tested with POST /rules/validate at 2026-11-04T19:21:20Z against the newest 1,948 stored rows, about 18 minutes of data. The rate can change quickly.
| Rule | Feed | Matches |
|---|---|---|
usd >= 5m and token in ["USDC","USDT"] | Large stablecoin moves on all indexed chains | 18 |
chain == "base" and usd >= 1m and kind == "token" | One chain community | 4 |
chain == "ethereum" and kind == "native" and usd >= 1m | Large native ETH | 7 |
A low threshold on Base spends the cooldown on small transfers, and it would drop larger ones that follow. chain == "base" and usd >= 250k matched 487 of the same rows.
#Real message
The server builds this Discord body. The event is a real transfer stored at 2026-11-04T19:19:59Z. The rule name is an example.
{
"content": "**Large stablecoin moves**: $20,093,930 USDC on Ethereum from 0xa73b…58af to 0x55fe…44b8\nhttps://farbeamlabs.com/tx/ethereum/0xa078c4223c7126a9cb7a0af4df133c1756f64e2284a2b04166fcc5e7cfc635ab",
"allowed_mentions": { "parse": [] }
}If an address has a label, the label replaces the short address. allowed_mentions blocks mentions, so a message cannot ping a role. The link opens the Farbeam transaction page. The message format is fixed. For a custom format, use json and your own relay.
#Relay for other platforms
For a chat platform without a direct format, run a small handler that verifies the signature and forwards the text. This pattern uses the JSON format and the verify function on the alerts page.
import express from "express";
import { verify } from "./verify.js";
const app = express();
const seen = new Set();
app.post("/hooks/farbeam", express.raw({ type: "application/json" }), async (req, res) => {
const ok = verify(req.body.toString(), req.get("x-farbeam-signature"), process.env.FARBEAM_SECRET);
if (!ok) return res.sendStatus(401);
res.sendStatus(200); // reply within 6 seconds, then do the work
const event = JSON.parse(req.body);
if (event.type !== "transfer.matched" || seen.has(event.data.uid)) return;
seen.add(event.data.uid);
await postToChat(`${event.data.token} $${Math.round(event.data.usd).toLocaleString("en-US")} on ${event.data.chain}`);
});import json, os
from flask import Flask, request, abort
from verify import verify
app = Flask(__name__)
seen = set()
@app.post("/hooks/farbeam")
def hook():
raw = request.get_data()
if not verify(raw, request.headers.get("x-farbeam-signature", ""), os.environ["FARBEAM_SECRET"]):
abort(401)
event = json.loads(raw)
if event["type"] == "transfer.matched" and event["data"]["uid"] not in seen:
seen.add(event["data"]["uid"])
post_to_chat(f"{event['data']['token']} ${event['data']['usd']:,.0f} on {event['data']['chain']}")
return "", 200postToChat and post_to_chat are yours to write. The code is a pattern, not a package.
#Text for your channel
Unlabeled does not mean anonymous, and a move does not imply a market view. Please tell your members that:
- A row is a public transfer. It is not a call or a recommendation.
- A large transfer to an exchange is not proof of a sale.
- The feed has gaps. It reads only part of Solana, and it can miss events.
#What this will not do
- It will not post more than one message per cooldown, or 120 messages per rule per UTC hour. Further matches are dropped.
- It cannot alert on a small token. Only curated tokens are indexed, so community meme tokens will not appear.
- It cannot give an instant notice. A poll runs every 12 to 30 seconds, and the worker runs every 3 seconds.
- If Discord returns errors 20 deliveries in a row, the rule turns off. Turn it back on in the console.