Skip to content

v0.11.0

2026-03-25

Bugs

  • [x] Re-center map button is covered by PlayTopBar; needs to be moved down
  • [x] When Share Character is used for an existing character, the user is not seeing the newly shared character on their own Characters page. The badge in the character menu is showing.
  • [x] When using Import Party, the 'loading' state of every button is 'loading' instead of just the party that is loading
  • [x] When using Import Party, the tokens should be placed near the location of the right-click that spawned the context menu, instead of all spawning at 0,0
  • [x] Using WASD and QE to move and zoom the camera used to be fluid; now it moves at only a few fps. This is a camera move in WebGL--it should operate at many dozens of FPS and probably shouldn't trigger any React re-renders.
  • [x] When multiple tokens are stacked in one space, clicking the stack does not select the visible "top" token, but rather a different token in the stack. There should be a z-order for tokens in the same stack, determining which is shown on the top and therefore clickable. The "send to back" and "bring to front" options in the token context menu should adjust this z-order accordingly, as should "bring forward" and "send backward" options.
  • [x] In the Edit Token modal, in the Artwork editor drawer, the "auto-detect" button for background color (uses a magic wand icon) is detecting colors such as #100100100 which is not a valid hex color. It is supposed to sample the image and suggest the right color to match the average background color.

Playtest Feedback

  • [x] Add a ... sub-button to action buttons in CurrentTokenBar, with options to edit or delete the action. Do the same for the actions in Party UI and Target UI.
  • [x] The Map Status Label in WebGLMap should be positioned in the center of the any elements at its level of the map frame, taking into account Party and Target UI (when active) in addition to sidebars.
  • [x] Refine on Server processing for background removal fails with a JSON parsing error, and "Fetch API cannot load blob:http://localhost:5173/feee78e5-1f71-4a7a-b8b6-725fff47406e. URL scheme "blob" is not supported." This may be due to the fact that the image is being sent as a blob URL, which is not accessible from the server. Instead, the image should be sent as a file or a base64 string.
  • [x] In the Monster Generator, add a tab bar. The current UI is "Algorithm". The new tab is "AI". In the AI tab, the user can input a text prompt describing the monster they want to generate, and the AI generates a stat block based on that prompt. This stat block is then converted into a token with all campaign/system properties populated, and actions configured based on the creature's attacks and special abilities (with targeting). Use OpenAI's API for this feature, and create a new endpoint on the server to handle the request and response.
  • [x] Add "Insert Monster" to the Token menu and the map context menu. This opens a modal with a list of monsters. For 5e, use https://www.dnd5eapi.co/, which has an open API. For System 8, note in the UI that this feature is not yet implemented. When the monster is chosen, create a token with properties and actions (with targeting) populated based on the monster stat block, and insert it onto the map. This can probably be done with regular code, without AI, but if there is an open-source model that can handle this task well, it may be easier to implement that way.
  • [x] The ... in actions in the TargetCard has an Edit Token button, but it doesn't do anything. This should open the token modal for the target token.
  • [x] When creating a token through Insert Monster or Generate Monster, default to a red outline in the tokenized art.
  • [x] Merge target chat bubble with the action's output. If an action returns text, append the target into to that chat log item. If an action calls sendMessage() once and doesn't return text, append the target info to that message. If the action explicitly returns more than once (i.e. two sendMessages() or a sendMessage() and a return statement with text), only then should multiple chat bubbles be made. The target info should always be appended to the last bubble. It may be necessary to queue sendMessage outputs while running an action to determine how to append the target info correctly.
  • [x] Bug: in targeting mode, targets have a circular indicator that they're being hovered over / selected. However, this indicator is always 1x1; for larger tokens, it should be sized and positioned appropriately to encompass the entire token.
  • [x] After accepting an invite it says 'redirecting to campaigns' but doesn't actually redirect. Make sure it does that, and add a manual link to the redirect target just in case.
  • [x] Tooltips on CurrentTokenBar action buttons can't be moused into in order to scroll them. Mousing out of the button closes the tooltip. If Mantine doesn't have a built-in solution, suggest overlapping the tooltip with the button so that it's still active when you mouse into it (if the tooltip is a child node of the button, otherwise this won't help).
  • [x] Character sheet play mode: feats and powers should have tooltips. If you click a power/feat in build mode you see a detail popup, but that popup doesn't show in play mode. It should.
  • [x] System/Campaign Actions (such as Inflict Damage and Heal) should show in TargetCard; currently not shown.
  • [x] When editing properties, the - and + buttons have a popup with +1, +10, and +(insert number here) options. When editing properties in the ExpandedTokenContext, mousing into the input closes the whole context before you can change the property.
  • [x] When applying conditions (context menu, PartyCard, CurrentTokenBar, etc), add a 'custom' condition option, prompting the user for a name and optional description for the condition. This allows for more flexible use of conditions that aren't predefined in the system.
  • [x] Make the current turn indicator on the map thicker and more obvious. Currently it's a narrow gold ring around the token.
  • [x] The tooltip that appears when hovering over a token on the map currently shows the token's name and token art. It should show:
    • Portrait art (if available), with background removed if that option was chosen, fall back to token art
    • Name
    • All bars (these can be shorter than they are on the map to fit a small tooltip)
    • Property values (e.g. HP, AC) as defined in the campaign
    • "Friendly" (if in your party), "Hostile" (if generated as a monster), or "Neutral" (if neither)
  • [x] Increase thickness of bars on tokens by 50%. The bars are currently very thin and hard to see.
  • [x] Scale bars with token size. All bars are rendered with the same thickness right now. Since 2x2 is double 1x1, double bar thickness for 2x2 tokens, triple for 3x3, etc.
  • [x] "View character sheet" from the context menu still opens a modal instead of the sidebar; it should use the same sidebar as 'view character sheet' from the CurrentTokenBar and PartyCard/TargetCard.
  • [x] While impersonating a token, I used the Inflict Damage action, and after it applied, my impersonate changed to the current token whose turn it was. That auto-impersonate feature should only happen when the turn starts, not after any action that applies damage.
  • [x] Add a built-in condition called 'dead'. Not system specific, all systems have it.
    • Special UI: when a token has the 'dead' condition active, shade the token art dark red, and put a big red X over it.
  • [x] Add a built-in condition called 'dying'. Not system specific, all systems have it.
    • Special UI: when a token has the 'dying' condition active, shade the bottom half of the token dark red, and put a red downward arrow over it.
  • [x] When a token is deleted or gains condition 'dead', it should removed from initiative
  • [x] Check the logic on Generate Monster actions, some are throwing 3 bubbles per action
    • Analysis: the roll() function is likely the culprit. Enhance roll() to take a second, optional argument to pipe the output to chat (default true). When generating these actions, use 'false' for this. Return the result of the action in the final function return, which will appear in chat log.
  • [x] Generated monsters don't have ability score actions. In all current systems, they should have actions for raw ability score checks (e.g. Strength Check). In 5e, they should have 6 "save" actions as well, one for each ability score.
    • [x] The category for ability check actions should be 'ability check'. Similar for saves.
    • [x] The category for attack actions should be 'attack'.
  • [x] Equipment in Character Sheet needs tooltips in play mode (if not already specified, feats and powers need these as well) — EquipmentSection already has click-to-detail modals, feats/powers now have them too
  • [x] All generated actions that do damage should use the applyDamage() function instead of just piping to chat. This includes actions from Import Character (powers and attacks), Generate Monster, and Insert Monster.
  • [x] Action notifications don't seem to understand html perhaps? I see weird JSON code in some of them, that doesn't appear in the chat log. Might be targeting related
  • [x] Bug: in the tokenizer preview, transparent backgrounds are not rendered, so the border color becomes the background. This doesn't actually happen for the token on the map, just in the preview window in the artwork editor.
  • [x] The hit area for the token context menu on tokens larger than 1x1 is only the bottom left square; all of its squares should count.
  • [x] Add targeting to Generated Monsters. Currently their macros support target.applyDamage, but the targeting properties of the action are not set, so the user won't go into targeting mode when using that action.

Map

  • [x] Add 'change size' to token context menu and Edit Token modal (default tab)
  • [x] Mouse events are only considered valid for tokens in the current layer; otherwise they're ignored. This is working as intended for left click, but not for right click. Right clicks are working on tokens regardless of layer. Fix: right clicking a token not on the current layer should ignore the token and be treated as right-clicking the map itself.
  • [x] "undo" doesn't undo token deletion. Token deletion is a 'soft delete' so it should be possible to restore the token.

Campaign and System Properties

  • [?] Modify the Campaign Property and System Property entity to have an 'order' property (integer, default 0).
    • For System properties, increment order by 1000. Thus, an order value can be 0, 1000, 2000, etc; no other values.
    • For Campaign properties, allow any integer value except those divisible by 1000, to ensure they are always ordered between system properties.
    • This allows campaign owners to sort system and campaign properties in any mix without collision (assuming they have fewer than 1000 properties total, which seems reasonable).
    • [ ] Bug: order seems wonky. TODO: document all broken use cases
  • [x] Modify the UI for custom campaign properties so the properties can be dragged to determine their order.
  • [x] Modify the UI of the System Properties editor so the system properties can be dragged to determine their order.
  • [?] When rendering properties in the CurrentTokenBar, TargetCard, and PartyCard, render them in the order specified by their 'order' property.

Edit Token Modal

  • [x] When creating a new token (either not a character, or a character without existing artwork), as soon as one image is provided, duplicate it for both token and portrait, and apply tokenization and background removal respectively, so that the user has a starting point for both artworks without having to manually copy them. (Characters with existing art do this already)
  • [x] Instead of the current UI for artwork in the general tab, when there are zero artwork items for a token, show a simple button to 'add artwork'. This is the same as creating a new artwork then clicking 'customize', just more intuitive.
  • [x] In the general tab, artwork section, add labels for the current portrait and token artwork, which should always be the first two in the list if they exist. Enlarge the thumbnails so this label isn't wider than the image.
  • [x] In the General tab, add a small icon button below each thumbnail to 'customize' the artwork. This opens another modal (or a drawer within the modal if that's possible) with the same UI currently on the Artwork tab (the part of that UI which is specific to one artwork item, not including the list of all artwork, which already exists on the general tab). Once this is done, hide the Artwork tab.
  • [x] On the General tab, make Layer, Chat Color, Pronouns, and Size half-width, so they fit in a 2x2 grid, taking up less height overall.
  • [x] On non-mobile devices, make the Properties tab a 2-column layout. The flow is top to bottom in left column, then top to bottom in right column, with half the properties in each column (if an odd number, the left column gets the extra one). Order based on the properties 'order' field described in the Campaign and System Properties section above.

Chat

  • [x] When anyone says your character's name (case insensitive), the chat bubble for that message should be outlined with a glowing purple outline, and also spawns with a animation where it grows, then shrinks, all the while wobbling side to side.
  • [x] Change the message for initiative starting from ${tokenName} has started it's turn to ${tokenName}, your turn has begun!

Character Sheet

  • Pagination isn't intuitive; infinite scroll would be better

  • Having a hard time with images. Didn't see Artwork tab at first

  • [ ] Character Sheet

    • [x] Add an option to set ability scores with guidance, instead of manually.
      • This spawns a modal.
      • For 5e, offer the following options:
        • Standard array
        • Custom array (input your own numbers)
        • Point buy (input a number of points to spend, and it calculates how many points you have left as you assign them to different ability scores)
      • For System 8:
        • Show a "drop zone" for each of the 6 stats
        • Show a draggable 16, a 14, two 12s, and two 10s.
        • They can drag the numbers into the drop zones to assign them to different stats. This ensures all stats are within the valid range, and takes the guesswork out of assigning stats.
        • Additionally, show a -2 draggable, which is optional. This decreases the stat it's dropped on, and once done, a +2 is spawned that can also be dragged to increase a different stat. The +2 cannot be applied to the 16.
        • When all 6 drop zones have a value, allow the user to click "apply", which saves the assigned stats to the character sheet.
      • All of this is for the "base" component of ability scores. Proficiency, racial, etc are not affected.
    • [x] Template should apply stats. Logic:
      • Fighter: max out strength and constitution, then dexterity, then intelligence/wisdom/charisma
      • Rogue: max out dexterity, then intelligence, then constitution/strength/wisdom/charisma
      • Arcanist, Psion: max out intelligence, then constitution, then dexterity, then wisdom/strength/charisma
      • Elementalist, Witch, Priest: max out wisdom, then constitution, then dexterity, then intelligence/strength/charisma
      • Warlock: max out charisma, then constitution, then dexterity, then intelligence/wisdom/strength
      • By "max out", I mean:
        • Get the highest valid base score possible. Meaning:
          • 5e: if the user didn't already use the stat wizard, ask for the method (roll, standard array, point buy, custom), and apply the template in a way that gets the highest possible base score for the relevant stats based on that method's rules.
          • System 8: max base stat is 16, so assign 16 to the relevant stats first, then 14, etc until the template is fully applied.
        • In 5e, apply Ability Score Increases as appropriate if they are level 4+.
        • In System 8, use existing proficiency bonus logic to max out stats in order. To wit:
          • Character has (level + 3) * 2 proficiency points to assign to stats (no weight).
          • Max proficiency bonus for one stat = (level + 3).
    • [x] In the ability score section in build mode, show a notification if the current ability scores do not match the expected distribution based on the character's class and level, based on logic described above.
      • Special case: in 5e, if they haven't selected an ability score generation method yet, prompt them to do so or to use the wizard to set their stats.
    • [x] Feat and Power modals should default to current class(es) if the character isn't classless
    • [x] Feat/Power modal filter popup doesn't close on clickout
    • [x] Feats and Powers should have full detail tooltips (play, build, and modal)
    • [x] Feat and Power modal filter should have 'all valid' option in system 8 (which means ancestry, background, disposition, skill, and all classes the character has, only the ranks they qualify for)
    • [x] Feat and Power modal filter is treating multiple filters as AND when they should be OR (note: this may require extending the API to support OR filtering) — backend already handles OR for same-field filters correctly

Edit Token Modal

  • Compact the default tab
  • Add 'customize' button for each artwork in general that pops up the customization options for that artwork (e.g. background removal for portraits, tokenization for tokens, etc). Remove artwork tab
  • Artwork preview thumbnail for portrait doesn't show the remove background version
  • Move subject-only buttons and UI elements to the subject only mini-tab
  • Token shouldn't have a dropdown for 'appearance on map' but should use the same mini-tab as portrait
  • Remove 'other' artwork type
  • Add subject removal toggle to token artwork as well
  • Flow for tokens with no art:
    • Choose one image
    • It creates token and portrait from that image, with tokenization and background removal automatically applied respectively. User can then edit each artwork separately as desired.