Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×

[Script] Condition Tracker

1777831002

Edited 1778809738
MidNiteShadow7
Pro
API Scripter
Introducing Condition Tracker , a Roll20 API mod script for managing token conditions and custom effects within the Turn Tracker. View the Introduction video on YouTube The script offers: Guided GM workflows, including an interactive wizard and multi-target application, accessible via chat commands and auto-installed macros. Rich effect modelling for standard D&D conditions and custom types like Spell, Ability, Advantage, Disadvantage, and Other, with duplicate prevention and per-target tracking. Deep Turn Tracker integration with stable custom rows, source-based grouping for advantage/disadvantage, and various duration types (until removed, end-of-turn, numeric rounds). Comprehensive lifecycle management, featuring expiry-based removal, zero-HP cleanup prompts, proactive token-deletion pruning, and manual reconciliation for orphaned entries. A configurable marker system for applying and safely removing status markers from tokens. Internationalisation support for chat messages, wizard prompts, and help content across 24 locales. A robust, modular architecture designed for performance and extensibility. Where to install the mod from? v1.0.0 available via the Roll20 One-Click installer. Roll20 API GitHub master branch . v1.0.0 GitHub Pull Request . Download and install v1.0.0 manually from Dropbox . I hope GMs find this useful for speeding up gameplay and improving players' visibility into the battle conditions they are experiencing. Please let me know if you have any feedback.
1777833540
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Amazing work, as usual!
1777913794

Edited 1777914108
How do we get it to read different token marker sets, such as Keithcurtis's set?  Its really great by the way, very useful Also: I was in initiave and attempting to add an effect to multiple tokens.  I had multiple badguys who( the initiative tracker will hi-lite when it is their)  all have the same names...so when I was asked by the Condition-Tracker which token was causing the effect, there was no way to know which of my tokens was which...having said that, I dont think it matters as it is really just trying to figure out what to put into text, so as long as it says "girralon grapples Ted" it doesnt really matter to the script which girralon it was? BUT, if there were a way to see which token i was looking at when I hover over the button in the chat window...that would be something.
Hi James, If you look at the Roll20 Token Marker Library and click the set you purchased, each marker has a unique name listed under it. Pass that name into the command to use the custom markers. Regarding multiple tokens that all have the same name, you can enumerate (automatically number) NPCs by selecting tokens, right-clicking, and choosing "Enumerate Tokens" under "Advanced Transform". This feature should be available in all Jump Gate games to add a number to each token's nameplate, simplifying tracking of multiple identical creatures in combat. However, I will add a command to the roadmap to query the conditions applied to a selected token and output which active conditions were added and by whom. James H. said: How do we get it to read different token marker sets, such as Keithcurtis's set?  Its really great by the way, very useful Also: I was in initiave and attempting to add an effect to multiple tokens.  I had multiple badguys who( the initiative tracker will hi-lite when it is their)  all have the same names...so when I was asked by the Condition-Tracker which token was causing the effect, there was no way to know which of my tokens was which...having said that, I dont think it matters as it is really just trying to figure out what to put into text, so as long as it says "girralon grapples Ted" it doesnt really matter to the script which girralon it was? BUT, if there were a way to see which token i was looking at when I hover over the button in the chat window...that would be something.
request - I run a heavy curse / disease gritty game and I would love to have a feature like this that keeps track outside of combat. When combat starts, it is automatically applied. Currently, when I start combat, I have to pause the table to set everyone curses/disease/long term poisons or other long term debuffs before I get to their normal pre-combat buffs. Also would love a feature to Hide certain info. Example - Bane/bless is open to the public, but if they have a curse item and they are not aware of it yet, or a caster / enemy applied something to them like bane and they dont know what it is yet, I like to hide that info from the players but still see it for myself.  tl;dr: so 2 potential features 1) out of combat status tracker for diseases/cursed debuffs 2) In Combat - ability to hide status info from players to gm only
Hi Novercalis, let me have a think about how I can make those work, and I will see what I can do. Novercalis said: request - I run a heavy curse / disease gritty game and I would love to have a feature like this that keeps track outside of combat. When combat starts, it is automatically applied. Currently, when I start combat, I have to pause the table to set everyone curses/disease/long term poisons or other long term debuffs before I get to their normal pre-combat buffs. Also would love a feature to Hide certain info. Example - Bane/bless is open to the public, but if they have a curse item and they are not aware of it yet, or a caster / enemy applied something to them like bane and they dont know what it is yet, I like to hide that info from the players but still see it for myself.  tl;dr: so 2 potential features 1) out of combat status tracker for diseases/cursed debuffs 2) In Combat - ability to hide status info from players to gm only
This looks like a great capability! I definitely have a need for it in my campaigns. I tried to take the JS from the Dropbox and put it into my API environment in my campaign, but it did not compile. I hope the One-Click install comes soon!
Anthony S. said: This looks like a great capability! I definitely have a need for it in my campaigns. I tried to take the JS from the Dropbox and put it into my API environment in my campaign, but it did not compile. I hope the One-Click install comes soon! Hi Anthony, can you tell me what messages you could see in the Mod console?  Or, if it would help, I think the Roll20 Discord has channels we could connect to, that would allow you to talk me through your problem and should allow screen sharing so we can try and figure it out. I'm based in the UK and am available in the evenings to the early hours of the morning - so that would be 3pm to 11pm eastern time if you're from the US - just let me know if that would help.
At the moment, the next version of the Condition Tracker will be adding these features: Persistent Effects System (Saved Effects) : Store long-term conditions (curses, diseases, poisons, hidden debuffs) in script state outside the Turn Tracker. Token Report Command :   Reporting for selected tokens, including conditions applied to and conditions sourced by each token. Multi-system condition profiles : Added game-system-driven condition lists and default marker mappings with gameSystem configuration support (including dnd5e, dnd4e, dnd35, pathfinder1e, pathfinder2e, starfinder, and many additional systems). Name-based Token References : --source, --target, and --subject now accept token ids, exact token names, exact linked character names, and unique partial name matches. Actor Classification System : Cross-system token classification engine that reliably identifies PCs, NPCs, and ignored tokens in a deterministic order. Token Classification Overrides :  Explicitly override a token's actor type for selected tokens as PC, NPC or Ignored. Macro Creations: Easily create macros for commonly created tracked conditions. I should be done with testing soon and hope to publish the version 1.1.0 update in the next few days.
I have set-up a tracker for issues and feature requests in GitHub for the Condition Tracker mod:&nbsp;<a href="https://github.com/users/steverobertsuk/projects/3" rel="nofollow">https://github.com/users/steverobertsuk/projects/3</a>
Version 1.0.0 has now been added to the One-Click installer.
Version 1.1.0 - 2026-05-15 · &nbsp; Milestone Added Persistent Effects System (Saved Effects) : Store long-term conditions (curses, diseases, poisons, hidden debuffs) in script state outside the Turn Tracker. Saved effects persist across sessions and can be optionally promoted into the Turn Tracker when combat begins ( #7 , &nbsp; #14 ). Three visibility modes : &nbsp; public &nbsp; (full label visible in Turn Tracker and chat), &nbsp; masked &nbsp; (vague public label shown to players; full details whispered to GM), and &nbsp; gm &nbsp; (no Turn Tracker row; GM-whisper only when affected token reaches the top of initiative). !condition-tracker --saved &nbsp; commands : &nbsp; --saved &nbsp; (view list), &nbsp; --saved add &nbsp; (guided wizard), &nbsp; --saved edit &lt;id&gt; , &nbsp; --saved remove &lt;id&gt; , &nbsp; --saved promote &lt;id&gt; --visibility public|masked|gm , &nbsp; --saved snooze &lt;id&gt; --scope turn|rounds|combat --rounds &lt;n&gt; , &nbsp; --saved snooze-clear &lt;id&gt; . GM reminder system : When a token with &nbsp; gm &nbsp; or &nbsp; masked &nbsp; saved effects reaches the top of the Turn Tracker, the GM receives a whispered reminder listing hidden effects with inline action buttons. Duplicate reminders within the same turn are suppressed via a stable turn-key. Snooze controls : Suppress GM reminders for this turn, 1 round, 3 rounds, or the remainder of the current combat. Combat snoozes are automatically cleared when the Turn Tracker empties. Saved promotion : Copies (does not move) a saved effect into the Turn Tracker. Public and masked entries create visible tracker rows; GM-only entries confirm stored tracking without creating a row. Token-deletion cleanup : Removing a token from the board now prunes all associated saved effects in addition to active tracked conditions. Marker picker ( --config marker-pick ) : Added &nbsp; !condition-tracker --config marker-pick &lt;condition&gt; &nbsp; which whispers a visual card showing every campaign token marker as a 28×28 icon button. Clicking any button immediately sets that marker for the given condition — no need to look up marker names manually. The currently configured marker is highlighted in the picker. ( #16 ). Marker clear ( --config marker-clear ) : Added &nbsp; !condition-tracker --config marker-clear &lt;condition&gt; &nbsp; to remove a custom marker mapping for a condition, restoring the system default or leaving the slot unset. Custom marketplace marker support : &nbsp; --config marker &nbsp; now resolves custom marketplace marker names (e.g. &nbsp; 005-Unconscious ) to their full &nbsp; name::id &nbsp; tag format automatically via &nbsp; Campaign().get('token_markers') . Passing the full &nbsp; name::id &nbsp; tag form directly is also supported. Full locale support : All 24 supported languages updated with new translation keys across the 1.1.0 feature set, including saved effects UI, commands, and help handout. !condition-tracker --report-token &nbsp; command : Added GM-only per-token condition reporting for selected tokens, including conditions applied to and conditions sourced by each token ( #8 ). Multi-system condition profiles : Added game-system-driven condition lists and default marker mappings with &nbsp; gameSystem &nbsp; configuration support (including &nbsp; dnd5e , &nbsp; dnd4e , &nbsp; dnd35 , &nbsp; pathfinder1e , &nbsp; pathfinder2e , &nbsp; starfinder , and many additional systems) ( #9 ). Name-based token references in direct apply commands : &nbsp; --source , &nbsp; --target , and &nbsp; --subject &nbsp; now accept token ids, exact token names, exact linked character names, and unique partial name matches ( #10 ). ConditionTrackerSaved &nbsp; and &nbsp; ConditionTrackerClassify &nbsp; macros : Auto-installed for all GM players alongside the wizard, multi-target, and report-token macros ( #12 ). Actor Classification System : Cross-system token classification engine that reliably identifies PCs, NPCs, and ignored tokens in a deterministic order ( #11 ). Detection order: token-level state override → character &nbsp; ct_mod_actor_type &nbsp; attribute → unlinked-token eligibility check → game-system sheet adapter → generic NPC attribute scan → &nbsp; controlledby &nbsp; fallback. Unlinked tokens (map pins, spell templates, scenery) are classified as &nbsp; ignored &nbsp; by default and excluded from the wizard token picker. Game-system adapters for &nbsp; dnd5e , &nbsp; dnd4e , &nbsp; dnd35 , &nbsp; pathfinder1e , &nbsp; pathfinder2e , and &nbsp; starfinder &nbsp; read the sheet's native NPC attribute for automatic detection. Generic NPC attribute scan checks &nbsp; npc , &nbsp; is_npc , &nbsp; npcflag , &nbsp; sheet_type , and &nbsp; character_type &nbsp; as a fallback for unsupported sheets. !condition-tracker --classify &nbsp; command : Explicitly override a token's actor type for selected tokens ( #13 ). --classify pc|npc|ignored &nbsp; — mark selected tokens permanently. --classify auto &nbsp; — remove the override and restore automatic detection. --classify show &nbsp; — diagnostic whisper showing classification, source, and reason for each selected token. --scope character &nbsp; (default) — writes the override to the character's &nbsp; ct_mod_actor_type &nbsp; attribute; persists across all tokens that share the character sheet. --scope token &nbsp; — writes a token-level override to script state; useful for unlinked tokens or per-token overrides on shared sheets. Changed Name resolution for direct token references is now case-insensitive and exact-match-first, with partial matching used as a fallback. Ambiguous name matches now return a clear guidance message listing candidate tokens and recommending a more specific name or token id. Help and handout content now include copy-ready examples for name-based direct apply usage. isPlayerToken() &nbsp; now delegates entirely to the new &nbsp; classifyToken() &nbsp; engine, applying override and adapter logic consistently everywhere the function is called (wizard token picker, zero-HP cleanup prompts, token-change events). The wizard token picker now excludes &nbsp; ignored &nbsp; tokens. Previously, unlinked tokens with names appeared in the NPC column; they are now hidden unless explicitly classified as &nbsp; pc &nbsp; or &nbsp; npc . Added &nbsp; enablePostApplyMacroButtons &nbsp; configuration support to optionally show macro-creation action buttons in post-apply GM whispers. Developer Build pipeline now runs a &nbsp; prebuild &nbsp; version bump step ( scripts/bump-version.mjs ) that auto-increments the trailing numeric segment in &nbsp; script.json &nbsp; (e.g. &nbsp; 1.1.0.beta-3.4 &nbsp; → &nbsp; 1.1.0.beta-3.5 ; plain semver falls back to patch increment). To set an explicit version use &nbsp; npm run set-version -- &lt;version&gt; &nbsp; and then build via &nbsp; node scripts/build.mjs &nbsp; to skip the auto-bump. scripts/build.mjs &nbsp; now synchronizes &nbsp; package.json &nbsp; version to &nbsp; script.json &nbsp; before bundling, keeping package metadata aligned with release metadata. Build output formatting is now integrated into the build step: the primary generated bundle is formatted once with Prettier, then copied into the versioned release folder. Watch-mode rebuilds now use the same post-build formatting and versioned-copy behavior for consistent generated artifacts. Click here for the GitHub Pull Request . Click here for the Dropbox direct download . Roll20 One-Click installation version coming soon.