Rules
Rules are an add-on on a phrase or follow entry. They decide whether an item the bot has already fetched gets sent — they never change what the bot fetches or how often.
The six rule kinds
A rule is {kind, op, value}. op is min (“at least”) or max (“at most”) — min is the default when op is left out. Every kind except ca also floors its value to a whole number (ratio keeps 2 decimal places instead), and rejects anything above 1,000,000,000,000.
The six kinds
| Kind | Dashboard name | Tests | Bound |
|---|---|---|---|
followers | Followers | The account’s follower count. | Whole number, 0 – 1,000,000,000,000. |
following | Following | The account’s following count. | Whole number, 0 – 1,000,000,000,000. |
ratio | Follower/following ratio | Followers ÷ following (following floored to at least 1, so it can’t divide by zero). | 0 – 1,000,000,000,000, to 2 decimal places. Entered in steps of 0.5 in the dashboard. |
posts | Posts | The account’s post count. | Whole number, 0 – 1,000,000,000,000. |
age | Account age | Days since the account’s X join date. | Whole number, 0 – 1,000,000,000,000. |
ca | Contract address | Whether contract-address or chart-link discovery has found at least one candidate for the account. | No number — only the direction (required / forbidden). |
Each rule renders as one sentence, shown in the entry’s skip log and its admin status:
Sentence labels
| Kind | op: min (“at least”) | op: max (“at most”) |
|---|---|---|
followers | has at least N followers | has at most N followers |
following | follows at least N accounts | follows at most N accounts |
ratio | has at least N× more followers than following | has at most N× more followers than following |
posts | has at least N posts | has at most N posts |
age | account is at least N days old | account is at most N days old |
ca | has a contract address or chart link | has no contract address or chart link |
Limit
At most 8 rules per entry. One rule per kind+direction — a second
min(ormax) rule on the same kind is rejected. Aminbound above its ownmaxbound on the same kind is rejected, and acarule can’t require and forbid a contract address at the same time.
Unknown facts fail
Unknown fails closed
A rule the bot cannot check FAILS it — it never passes silently.
agefails, in either direction, when the account’s join date doesn’t parse.cafails, in either direction, when contract-address discovery has not finished by the moment the rule is judged — “required” fails because none was found yet, and “forbidden” fails too, because the bot can’t yet vouch for the account being clean.
Tolerance, not AND/OR
There is no AND/OR operator between rules. Every rule on an entry must hold, unless the entry’s own tolerance allows some to fail: the entry sends when the number of rules it violates is less than or equal to its tolerance. Default tolerance is 0 — every rule must hold.
The dashboard words this as a line under the rule list: “Send if it violates”, followed by a dropdown.
| Dropdown value | Meaning |
|---|---|
| none of the rules | Every rule must hold. (the default) |
N of the <total> rules | Up to N may fail; <total> − N must still hold. |
| all of the rules | Rules never block sending. |
Tolerance is clamped to the entry’s own rule count on save — a tolerance of 5 saved against a 3-rule entry is stored as 3.
The ca rule’s wait
A ca rule on a follow entry makes the announce wait — up to 8.0 seconds — for the account’s contract-address search to answer before deciding whether to send. The bot decides first; it never sends the card and deletes it afterward.
That wait only covers the search. The account’s bio and link-in-bio are scanned synchronously, before the wait starts, so only the network search needs the budget.
Note
A
carule on a phrase entry needs no wait at all. It is judged directly from the matching post’s own text and links, plus the author’s bio — data the bot already holds from the search that found the post. No extra request is made, and nothing is awaited.
What a rule actually gates
The send, not the fetch
Rules gate the SEND, never the fetch. The bot always fetches and evaluates the item first; a rule only decides whether to post it.
A skip is not a retry candidate. For a feed or phrase post, the watermark advances to that post’s id the moment the rule fails — the same post is never re-evaluated on a later tick. For a follow, the followed account’s id is already added to the entry’s seen list before its rules are even checked, for the same reason.
A skip is counted (the entry’s skipped_n) and its details are kept for status — who was skipped, when, and which rule labels were violated (up to 8). Nothing is sent to the group, and nothing about the skip reaches Telegram.
For a follow tracker, any rule other than ca is checked directly off the single Following row the poll already fetched — a skip there costs nothing beyond that one poll request. The graphic is never rendered and no search runs.
Note
A
feedentry never carries rules. Its editor has no Rules panel, and a rules list submitted for a feed is discarded before the entry saves — a feed watches one account with no per-item account fact left to gate.
Add a rule to a phrase or follow entry
- Open the entry’s editor (phrase or follow) and scroll to Rules.
- Click Add rule — the new rule starts on the first kind+direction combination not already used.
- Pick the kind and direction from the dropdown, e.g. “Has at least … followers”.
- Enter the number (skipped for a Contract address rule, which has none).
- Repeat, up to 8 rules total.
- Set “Send if it violates” to how many rules may fail and the item still sends — “none of the rules” by default.
- Save.