The engine that posts
Neurocommenting
The page that runs the engine — every control on it, what it does once the engine reads it, and the order to touch them in.
In this guide
01What this page is
Neurocommenting is the module that actually posts. Everything else feeds it: accounts come from Account Manager, targets from the two parsers, a face from Profile Templates. This page is where the engine is started, and where the behaviour of every comment it writes is set.
It is one page with seven regions and a jump-nav across the top in this order. Nothing here is a separate screen — the dialogs are the only things that open on top.
Start is not a switch that stays on. The engine caps a single session at ten hours by default: at the top of the round where that is reached it stops itself cleanly, exactly as if you had pressed Stop, and it does not come back on its own — not on the next round, and not when the service restarts. Nothing in the panel says this, so the honest expectation is that a long run ends by itself and you press Start again.
02Map of the page
- 01ControlThe run state and uptime, the Start/Stop button, the Warmup switch, Delay settings, and the engine log.
- 02PoolTwo columns of accounts — available and in the pool — the three assignment buttons, the limit controls, and the per-account list of which channels each account owns.
- 03StatsWhat the pool has produced: successful, failed and total.
- 04CommentsEvery comment that went out, filterable, with the full text and the post it answered behind each row.
- 05ChannelsThe monitored channel list — what the engine watches — plus the presets that save a list and reload it later.
- 06BlacklistAccount-and-channel pairs the engine has taken out of circulation on its own, grouped by reason, with Prune unresolvable and Clear blacklist above them.
- 07PersonaThe prompt presets, which one is active, and the sensitive-content filter.
03Control
Four things sit here: the run state with its uptime, the button that starts and stops the engine, one switch, and the delay window every comment waits out. The engine log is underneath, collapsed.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
StartControl
- What it does
- Builds your account pool, connects every active account, and begins polling the monitored channels. A round runs every poll interval — 60 seconds by default — and each round re-reads the account pool and the channel list from the database.
- Before it starts
- A preflight dialog opens if accounts, channels or an active persona are missing, listing which of the three failed and offering Start anyway. A check whose data has not loaded yet counts as passing, so a slow page never blocks the button.
- What can refuse it
- The active persona is assembled into a system prompt at start time. A persona that cannot be assembled fails the start outright, rather than failing quietly at the first comment.
- Session cap
- Ten hours by default. The check runs at the top of a round, never mid-send, and the stop is the clean one — the running flag is cleared and the pool disconnected, so the engine stays stopped until someone presses Start again.
- Restarting for a change
- Almost never needed. Accounts, the channel list, the delay window and the Warmup switch are all re-read every round. The persona is the exception — it is read once at start and cached.
StopControl
- What it does
- Ends the session and disconnects the pool. Comments still waiting out their delay are cancelled.
- What happens to a cancelled comment
- It is not lost. The post goes back on the pending queue carrying its original catch time, and the rate-limit slot it was holding is released — so a later session picks it up in its real place in the order rather than as something that just happened.
- Never gated
- Stop works whatever the subscription says. Only Start is gated.
WarmupControl, beside Start
- What it does
- Ramps an account’s hourly and daily comment caps up gradually instead of letting a fresh account post at the full rate from its first hour.
- Default
- Off. Without it every account posts at the full configured rate immediately.
- The ramp
- Fourteen days, counted from when the account was added, moving linearly from 1 comment an hour and 3 a day up to the engine’s configured ceiling. Never below 1, never above the ceiling, and an account already older than fourteen days simply sits at the ceiling.
- Not the same warmup
- Three separate things carry this name. This switch is the rate ramp. The Accounts page’s Auto-Warmup is a per-account 72-hour lockout with its own 23-day cap schedule. Active Warmup is a whole module that has accounts read and react. All three are off by default and switched on separately.
- Takes effect
- Next poll round. No restart.
Delay before commentingControl → Delay settings
- What it does
- The window a comment waits in before it is written. Once a post is caught and an account reserved, the engine picks a delay uniformly at random between Min and Max and sleeps that long.
- Default
- 480 to 1500 seconds — 8 to 25 minutes.
- Presets
- Three buttons fill both fields: Min (60-180s), Recommended (480-1500s), Max (1800-3600s). They only fill the fields — Save is what applies them.
- Validation
- Both numbers must be above zero, and Min must be below Max. Save stays disabled and the form says so while they are not.
- What the wait costs
- Nothing. The model is not called and Telegram is not touched until the delay is over, so a comment abandoned mid-wait costs nothing at all.
- At the edges
- Twenty-five minutes is long enough for conditions to change. Right before sending, the account is re-checked — cooldown, quiet hours, a manual pause, a floodwait from another post landing first — and if it is no longer usable the post goes back on the queue with its original timestamp instead of being sent into the changed condition.
- Takes effect
- Next poll round. No restart.
Engine logsControl
- What it does
- Streams the engine’s own log lines live while the card is open, with a dot showing whether the stream is connected.
- Scope
- Your engine only. Every line is tagged with its owner before it reaches the stream.
- Clearing
- The Clear button empties the view. Pressing Start empties it too, so a new run never reads as a continuation of the last one.
- Only while open
- The connection opens when you expand the card and closes when you collapse it. Lines emitted while it was shut are not replayed.
The uptime counter beside the state runs from the moment the session started. The bar under it is scaled to twelve hours — longer than the ten-hour session cap — so on the default configuration it fills to about five-sixths and the session ends there.
04The commenting pool
The pool is the subset of your accounts that neurocommenting may use. It is not the same thing as your account list: an account can be healthy, connected and completely idle simply because it was never put in here.
Two columns — Available accounts on the left, In commenting pool on the right — an arrow on each row to move one across, and checkboxes with a bulk arrow to move many. Underneath sits the assignment layer, which decides which pooled account handles which channel.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
Add to poolPool → Available accounts
- What it does
- Moves the account into the commenting pool and claims it for this module.
- One module at a time
- An account may be driven by one behavioural module only. One already held by NeuroDialogs, Mass Reactions or Active Warmup is refused and named in the message, and the rest of the batch still goes through — a refusal never fails the whole request.
- Also refused
- An account currently reserved by a running discovery search, and one still inside the Accounts page’s 72-hour resting window. Both come back as a reason rather than an error, and both clear on their own.
- Removing releases it
- Taking an account out of the pool frees it for another module immediately.
- Unhealthy accounts
- An account that goes banned or dead-session while pooled is pulled out automatically and reported, rather than sitting there posting into nothing.
Auto-assign channelsPool
- What it does
- Deals the whole monitored-channel list round-robin across the accounts currently in the pool, replacing any assignment that existed before.
- How it divides
- Evenly, with the remainder spread one extra to the first accounts in the list — 62 channels across 30 accounts gives two accounts three each and the rest two.
- Why assign at all
- An assigned account is the predictable path: when a post appears on a channel, its assigned account is used directly, with no scan of the pool. Everything else is fallback.
- Refused when
- The pool is empty, or no channels are configured. Both say which.
Shuffle channelsPool
- What it does
- Re-points the channels that are already assigned so every account ends up with a completely different set from the one it had, keeping the number each account holds the same.
- Not the same as auto-assign
- Auto-assign deals the full monitored list from scratch. Shuffle only touches what is already assigned, and guarantees no account keeps any of its previous channels.
- When it refuses
- When no such rearrangement exists: one account holding more than half of all assigned channels, fewer than two accounts with assignments, or nothing assigned yet. The reason comes back verbatim.
Clear assignmentsPool
- What it does
- Drops every channel-to-account assignment.
- What happens then
- Posting does not stop. Every channel falls back to picking from the pool by least-recently-used, so the work still spreads — it just stops being predictable per channel.
Set limitPool, right of the assignment buttons
- What it does
- Applies one comment limit to every account currently in the pool, in a single call.
- What the limit is
- A lifetime cap, not a daily one. The counter never falls on its own — an account that reaches its limit is paused automatically, marked limit reached, and stays that way.
- Default
- None. An account has no limit at all until one is set, here or on a single account.
- How it applies
- Only on Enter or the tick button, never on losing focus — it touches every pooled account at once, so an incidental click should not fire it.
- Clearing it
- The Clear limits button beside it removes the cap from every pooled account. An account paused for hitting a limit it is now clear of resumes by itself; one you paused by hand is left alone.
Reset countsPool
- What it does
- Sets the selected accounts’ comment counters back to zero and resumes any of them paused for hitting their limit. Asks first.
- Why it exists
- Because the limit is a lifetime cap. Resuming a capped account on its own buys exactly one more comment before it hits the same ceiling again, since the count never went down. Clearing the counter is what makes a recurring limit workable.
- Selection, not the pool
- It acts on whatever is ticked in either column. An account pulled out of the pool for hitting its limit sits in Available accounts, and this reaches it there without re-adding it first.
- What survives
- Comment history. The rows are not deleted — a floor timestamp moves instead — so cost tracking and statistics are unaffected.
PausePool → assignment list
- What it does
- Takes this one account out of posting until you resume it. It is excluded starting from the next poll round.
- Why it is not a status
- Nothing automated can move an account into or out of a manual pause — not floodwait handling, not the health checker clearing an account back to active, not cooldown expiry. That is the difference between this and parking an account in the Accounts page’s Danger zone.
- Resume
- Only ever un-pauses. It refuses on an account that is not paused, so a banned or disabled account cannot be revived by pressing it.
Under the buttons, one row per account that holds channels: how many comments it landed and how many failed, whether it is paused, and the channels it owns behind a fold.
Assignment is a preference, not a rule. If the assigned account is in cooldown, in quiet hours, paused, at its cap or blocked from that channel, the post is not skipped — it falls back to the rest of the pool, ordered least-recently-used, with accounts that have already succeeded on that channel first and accounts that failed to resolve it last. Only when the pool itself is empty does the fallback widen to every active account.
05Persona
The persona is the whole instruction the model gets. There is no separate tone, length or language setting — a preset is a name, an optional description, and one prompt you write yourself.
Presets come in two groups. System holds six built-ins, which you can read and copy but not edit; My Prompts holds yours. Clicking any card makes it active immediately, and the active persona is the one every comment is written with.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
A preset cardPersona
- What clicking does
- Makes that preset active, straight away. There is no save step and no confirmation.
- The six built-ins
- Positive comment, Intimate, Emotional response, Question to author, Brief review, Analytical approach. Each is a short prompt naming a style, asking for a length, and telling the model to answer with the literal token SKIP when the post does not suit it.
- Editing a built-in
- Not possible. Open it to read it, or duplicate it into My Prompts and edit the copy.
- Deleting
- Your own presets only, and never the active one — the delete entry is disabled while a preset is active.
- When it is read
- At engine start, then cached. Editing the active preset while the engine is running does not change what is being posted until it is restarted.
PromptPersona → Create / Edit dialog
- What it does
- The system prompt, verbatim. Whatever you write here is what the model is told; the post itself arrives separately as the message to answer.
- Required
- Yes, along with the name. Description is optional.
- Tokens
- Four are substituted before the call: {post_text}, {channel_title}, {account_username}, {account_first_name}. Substitution is plain text replacement, so stray braces elsewhere in the prompt cannot break it.
- An unknown token
- Is left exactly where it is. It is neither an error nor blanked out.
- Say when to skip
- Worth doing explicitly. All six built-ins end with an instruction to reply with the literal token SKIP when the post does not suit the persona; a prompt without one comments on everything it is given.
- If the model refuses
- A reply that opens with a recognisable refusal — in English, Russian or Ukrainian — is caught and treated as a skip rather than posted. A safety net for prompts with no skip instruction, not a substitute for one.
Sensitive content filterPersona
- What it does
- Appends a rule to the end of every prompt, above whatever the persona says: do not comment on posts about death, murder or violent crime, war or mobilisation, terrorism, disasters, mourning, or partisan politics and elections. Such a post is skipped instead.
- Default
- On.
- Turning it off
- Asks for confirmation first — the only switch on this page that does. Turning it back on does not.
- In the numbers
- A comment skipped this way is recorded under its own reason rather than folded in with ordinary skips, so it stays visible as a distinct outcome.
- Loud at start
- While it is off, the engine writes a warning into the log every time it starts.
The prompt is not the only thing shaping a comment. Accounts sharing one persona each get a small, fixed style nudge appended to their prompt — be a little more direct, keep it warm, plain and no fluff — so ten accounts on one preset do not all sound like the same writer. It is fixed per account, not random per comment.
06The channels it watches
The monitored list is what the engine polls. It is re-read at the top of every round, so a channel added here is being watched a minute later without anything being restarted.
Edits here save as you make them. There is no Save changes step — removing a row is written immediately, and the count above the table is the current list. Every monitored channel is commented on for real; there is no per-channel switch and no rehearsal mode.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
Add channel(s)Channels
- What it does
- Takes a paste of channels, one per line, and appends the new ones to the monitored list.
- What a line may look like
- An @username, a t.me link with or without the https, or a bare username. The link prefix and the @ are stripped before the name is checked.
- What counts as valid
- Five to thirty-two characters, letters, digits and underscores, not starting with a digit. A line that does not match is reported back as invalid rather than failing the whole paste.
- Duplicates
- Dropped, case-insensitively, both against the existing list and against the rest of the same paste. The result says how many were added, how many were duplicates and how many were invalid.
- No limit
- There is no cap on lines. This only appends to a list — nothing touches Telegram until the engine next polls.
Clear allChannels
- What it does
- Empties the monitored list. Asks first.
- What it does not touch
- Channel assignments, the blacklist and comment history all stay. So does every preset — this is the way to empty the list before loading a different one.
- Effect on a running engine
- It stops finding posts on the next round. It does not stop the engine, and comments already waiting out their delay still go out.
Save PresetChannels
- What it does
- Snapshots the current channel list under a name so it can be reloaded later.
- A snapshot, not a link
- Editing the list afterwards does not change the preset, and loading a preset replaces the list rather than merging into it.
- What a preset carries
- The channel names only. The live-posting flags are not part of it and are left as they are when a preset is loaded.
The line under the table — that resolved title and baseline ID are tracked by the engine and not exposed — is accurate. The engine resolves each channel once, caches the result and reuses it for every later post, which is why a restart does not re-resolve hundreds of channels. None of that cache is readable from this page.
07What the engine took out of circulation
When a post fails in a way that says something durable about one account on one channel, the engine writes it down. The blacklist is that record, grouped by reason, with a count on each group and the individual account-and-channel pairs behind the fold.
| Reason | What produced it |
|---|---|
| Sending forbidden | Telegram refused the send for this account on this channel — banned in the channel, or writing not allowed. |
| No access | The channel is private to this account, or it needs rights the account does not have. |
| Username not found | The account could not resolve the name. Often about the account rather than the channel: a fresh, low-history account can fail to resolve a channel that other accounts reach fine. |
| Kicked from discussion group | The comment goes into the channel’s linked discussion group, and this account is not a member. The engine tries to join and re-send once; this is recorded only if that also fails, or if there is no discussion group at all. |
| Other | Anything that did not classify — the catch-all. |
The record is not passive. A failure of the first, second or fourth kind moves that channel off the account it was assigned to and onto one with a clean record there, handing the freed account one of the recipient’s channels in exchange so nobody’s workload changes size. A resolve failure is softer: the account is sorted to the back of the queue for that channel rather than moved off it.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
Prune unresolvable channelsBlacklist, in the header
- What it does
- Stops monitoring the channels that are very probably gone — renamed or deleted — rather than merely hard to reach right now.
- The test it applies
- Both conditions together: at least one recorded username-not-found failure, and never once successfully baselined by any account.
- Why it is worth pressing
- A dead channel otherwise sits in the poll list forever, spending a resolve attempt on every eligible account, every round, for nothing.
- What it leaves
- The blacklist history. Only the monitored list is trimmed — clear the blacklist separately if you want the rows gone too.
Clear blacklistBlacklist, in the header
- What it does
- Deletes every recorded failure, across all reasons.
- What it changes
- The ranking. With the record gone, accounts sorted to the back of a channel for having failed there return to normal order, and the channel stops looking unresolvable to the prune button.
- What it does not change
- Whether an account can actually post there. Telegram’s answer is unchanged, so a genuinely banned account fails again and the entry comes back on the next attempt.
An entry here is a record of what happened, not the thing keeping an account out. The exclusion itself is a separate 24-hour block on that one account for that one channel, held elsewhere and not shown on this page — it expires on its own, and deleting the blacklist entry does not lift it early. Clearing the blacklist tidies the history and the ranking; it does not give an account back a channel it is currently blocked from.
08Reading the numbers
Two regions report what happened. Statistics is four tiles of totals; Comments is the row-by-row history behind them.
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
Total AttemptsStats
- Counts
- Successful plus unsuccessful — every real send that was attempted.
SuccessfulStats
- Counts
- Comments that reached Telegram.
UnsuccessfulStats
- Counts
- Real post attempts that failed. Nothing else — a comment the model declined to write, or a post nobody was free to take, is not counted here.
- Not the same as the pool’s failed
- The per-account failed number in the Pool section is broader: it also counts generation errors and posts skipped because no account was available. The two numbers are supposed to differ.
Success RateStats
- Counts
- Successful over total attempts, to one decimal. Zero attempts reads as 0.0%.
These four are meant to read as “since you last pressed Start”, and they do — the totals are all-time on the server, and the panel subtracts whatever they were at the moment Start was clicked. That subtraction lives in the browser tab and nowhere else, so reloading the page, or opening it in a second tab, loses it: the tiles then quietly show the all-time totals instead, with nothing on screen saying which of the two you are looking at.
Comments below holds every event, newest first, fifty to a page. A row opens into the post it answered, the comment itself, and, for anything that did not post, the reason and the error.
| Kind | What it means |
|---|---|
| generated | A comment was written. Whether it then reached Telegram is on the row itself — a send that failed is logged as post failed as well. |
| skipped | The model declined to write one: the persona’s own skip instruction, or the sensitive-content rule. |
| error | Generation failed before there was anything to send. |
| rate limited | The post was caught but no account was free to take it. Logged before any account is chosen, so this row has no account attached. |
| post failed | A real send was attempted and Telegram refused it. |
IllustrationNot the live panel — nothing here is connected: no state, no saving, no requests. Click a control to read what it does.
Kind · Channel · From · ToComments
- What they do
- Narrow what the table shows.
- Where the work happens
- Only one kind on its own is filtered by the server. Several kinds at once, a channel, and both dates are applied in the browser — to the fifty rows of the current page, not to your whole history.
- What that means in practice
- A channel filter can come back empty while that channel has plenty of comments: they are simply on another page. The line under the table is honest about it — it says how many of the fetched rows are showing.
Export CSVComments
- What it does
- Downloads what is on screen — the current page, after the filters above. The filename carries the page number.
- Not the whole history
- Exporting everything means paging through and exporting each page.
ClearComments
- What it does
- Permanently deletes the entire comment and event history. Asks first, and cannot be undone.
- What it takes with it
- The Statistics tiles, which are counted from these rows, and the per-account numbers in the Pool. Reset counts is the gentler tool — it moves a floor timestamp instead of deleting anything.
09First run
The shortest path from an empty page to comments going out. Steps one to four can be done in any order; the engine will not do anything useful until all four are done.
Put accounts in the pool. They have to exist and be healthy in Account Manager first, and they cannot be held by another module — an account NeuroDialogs or Active Warmup is driving is refused here by name.
Add the channels you want watched. A paste of @usernames or t.me links is the normal way in; the parser takes both.
Press Auto-assign channels. Without assignments everything still works, but each post is decided by a scan instead of going straight to a known account.
Pick a persona. Six built-ins are there to read; duplicate the closest one and edit the copy rather than starting from an empty box, and keep its skip instruction.
Leave the delay window alone unless you have a reason. The default 8-to-25 minutes is the recommended preset already.
Press Start. The preflight dialog will tell you if accounts, channels or a persona are missing before anything runs.
Then watch two things. The engine log, expanded, shows the round-by-round decisions in real time; the Comments table shows what came out of them. A run that produces skipped rows and no comments is a persona problem, not an engine problem.
Remember the session cap: ten hours by default, then the engine stops itself and stays stopped. If comments dry up overnight, check the run state before changing anything else — the most likely answer is that the session ended on its own and nobody pressed Start again.