| Latest version | 14.2.3 |
|---|---|
| Minimum Core | |
| Compatible Core | |
| Last updated | 1 week ago |
| Created | 4 months ago |
| Authors |
|
| Languages |
|
| Systems | All systems |
| Project source | Project URL |
| Report bugs | Bug tracker URL |
| Read-me | Readme URL |
| Changelog | Changelog URL |
| License | License URL |
Faster targeting, marquee selection, and custom cursors for Foundry VTT.
Who doesn't like customized cursors!?
Preview · Quick Start · Features · Use It For · Installation · Compatibility · API · Bakshi's Bazaar · Community · Contributing · AI Use · Support · License
| Feature | What it does |
|---|---|
| Middle-Mouse Targeting | Target tokens instantly without switching canvas tools. |
| Marquee Box Select | Drag a rectangle to target groups quickly, with optional filters. |
| Custom Cursors | Give Foundry per-state cursor art, hotspot control, and live previews. |
| Multiplayer Cursor Sharing | See where other players are pointing without relying on the default cursor dot alone. |
| Cursor Name Labels | Place movable player labels next to shared cursors. |
Foundry already has targeting and cursor presence. Show of Hands makes them faster, more visible, and easier to customize.
Target tokens with the mousewheel button instead of swapping to the targeting tool.
T, but without interrupting your active tool.Hold the middle mouse button and drag to target several tokens at once.
10 pixels before the gesture becomes a marquee selection.Replace Foundry's default browser cursor with your own image for each cursor state.
| State | When Active |
|---|---|
| Default | Normal cursor on the canvas and UI. |
| Hover | Mouse is over a token or clickable Foundry UI control. |
| Pressed / Held | Primary mouse button is down during a default or clickable interaction, after press and before release/cancellation. Dragging keeps its separate cursor. |
| Hover To Drag | Mouse is over draggable headers, rows, or drag sources. |
| Dragging | A draggable UI element is actively being dragged. |
| Resize | Mouse is over a window resize handle. |
| Text Editing | Mouse is over a text field or editor. |
| Targeting | Targeting tool is active. |
| Panning | Right-click dragging to pan. |
Per-state customization includes FilePicker-backed image paths, click hotspot position, rotation from 0-359 degrees, width and height controls, aspect-ratio locking, state enablement, live preview, native fallback previews, and profile copy/reset controls. Hotspot sliders use the loaded source image's pixel dimensions, then scale that point with the image into the browser's 128px cursor limit. Show of Hands ships without cursor artwork; leave an image path empty to use Foundry's native cursor for that state.
Click Cursor Settings in module settings to open the configuration UI. GMs can choose a player at the top of the window before saving; connected players automatically apply GM changes to their own cursor profile.
For each cursor state you can:
0-359 degrees.The live preview shows the cursor image with a red dot marking the hotspot. The draggable name label controls only the module's shared overlay name; Foundry's built-in cursor name is configured separately through Built-In Foundry Cursor Elements. Players can use their own cursor image files anywhere Foundry's FilePicker can read them.
See other players' cursors on the canvas in real time. Each shared cursor appears as either the player's synced custom cursor image or a colored arrow fallback using that player's Foundry color.
5 seconds of inactivity unless fade is disabled in advanced settings.Cursor Sharing Mode has three options:
| Mode | Behavior |
|---|---|
| Share My Cursor | Send your module cursor and receive others. |
| Receive Only | Hide your cursor from others while still seeing shared cursors locally. |
| Private | Hide your cursor from others, including Foundry's built-in cursor dot and name. |
Private mode also wraps native cursor activity so canvas pings do not reveal your cursor through Foundry's built-in cursor display.
Place a player name label next to each shared cursor. The module overlay label is separate from Foundry's built-in cursor name. You can use preset positions or drag the label into a custom position in the Default tab of the Cursor Settings preview. Per-user positioning is synced to other clients.
When Show Shared Cursor Names (Overlay) is enabled, the module hides Foundry's default white cursor name only for peers who have an active Show of Hands overlay, while preserving the native color dot when applicable. Native-only and Receive Only peers keep their Foundry name, so nobody shows up with two labels or an anonymous dot.
Control Foundry's native cursor dot and name independently from the module overlay.
| Option | What's Shown |
|---|---|
| Show Player Names & Color Dots | Both Foundry default elements visible. |
| Show Only Player Names | Foundry name label visible, color dot hidden. |
| Show Only Color Dots | Color dot visible, Foundry name label hidden. |
| Hide Both | All Foundry default cursor elements hidden. |
When the hidden advanced Show Identity on Idle setting is enabled and some Foundry elements are hidden, those hidden elements fade in as a player's cursor fades out after going idle.
| Foundry Elements Setting | What Fades In on Idle |
|---|---|
| Hide Both | Both name and color dot. |
| Show Only Player Names | Color dot. |
| Show Only Color Dots | Player name. |
| Show Player Names & Color Dots | Nothing. |
Open Advanced Settings from module settings to tune less-common behavior without crowding the main Foundry settings list.
Cursors not appearing for other players:
F12) for errors.Custom cursor not displaying:
128x128 or smaller for best browser compatibility.Shared cursor name placement not behaving as expected:
Middle-mouse targeting not working:
Marquee box select not working:
10 pixels to trigger the selection rectangle.Set Debug Mode in module settings to focus console output:
| Mode | Use For |
|---|---|
| Cursor CSS & Settings | Cursor settings migration, image load checks, generated cursor CSS. |
| State Detection | Token hover, active targeting tool, and panning cursor classes. |
| Cursor Sharing | Socket messages, cursor image broadcasts, cursor image requests. |
| Marquee Box Select | Middle-click targeting, drag threshold, selected token counts. |
Useful browser console checks:
game.settings.get("show-of-hands", "settings-version")
game.settings.get("show-of-hands", "middle-mouse-actions")
game.settings.get("show-of-hands", "cursor-sharing-mode")
game.user.getFlag("show-of-hands", "cursorConfig")
game.activeTool
document.getElementById("board")?.classList.toString()
The module also exposes a compact support snapshot in the console:
game.modules.get("show-of-hands").api.getDebugState()
ShowOfHands.getDebugState()
For MCP Diagnostics through Foundry MCP Bridge, enable Debug Mode as a GM and turn on Enable MCP Diagnostics. These controls are advanced GM-only troubleshooting tools and can stay disabled during normal play. The available actions are listed under Developer API.
The normal hard refresh path from MCP is the bridge-level reload-foundry-client tool. The module-level refreshClient({ delayMs }) action is also available so this module's own diagnostics gate can be tested.
validateV14Runtime() is read-only and checks the V14 ApplicationV2, DialogV2, cursor, FilePicker, FormDataExtended, and canvas cursor contracts used by the module. It also reports Scene Levels observations when Foundry exposes them.
A diagnostic warning that legacy cursor-states differs from flags.show-of-hands.cursorConfig is expected after per-user profiles exist. The user flag profile is canonical.
Mutating fixture checks are paired with Enable MCP Diagnostics and still require an explicit confirmMutation: true argument. Automation creates temporary active-scene token fixtures named with the SOH-MCP-FIXTURE prefix and flagged with flags.show-of-hands.mcpAutomationFixture. Cleanup recognizes old TTB-MCP-FIXTURE fixtures for compatibility, but new automation uses the Show of Hands prefix. Keep MCP diagnostics disabled during normal play and use automation only in dedicated test worlds.
| Use case | What it looks like |
|---|---|
| Fast combat targeting | Middle-click enemies without changing canvas tools. |
| Area targeting | Drag a marquee over a cluster of visible tokens and target the whole group at once. |
| Table presence | Show player cursors with readable, movable name labels. |
| Cursor theming | Give the whole Foundry UI custom cursor art for hover, drag, targeting, panning, and text states. |
| Privacy | Receive other cursors while hiding your own, or go fully private when needed. |
https://github.com/GnollStack/Show-Of-Hands/releases/latest/download/module.json
Important:
show-of-handsand the legacytarget-the-beastieare distinct Foundry packages. Install Show of Hands, disable the legacy module, and never enable both together. On first load, Show of Hands imports compatible legacy settings and the local user's cursor profile. Verify the migrated profile before uninstalling the legacy package.
| Requirement | Version |
|---|---|
| Foundry VTT | v14 required; verified on 14.367 |
Module version: 14.2.2
Foundry VTT: v14 required; verified on 14.367.
Game systems: works in any system; tested in dnd5e 5.3.3. Targeting, cursor styling, and cursor sharing work at the canvas and UI level and don't use dnd5e data.
Browsers: cursor customization relies on browser cursor image support. Keep cursor images at 128x128 or smaller for best compatibility.
The optional viewed-level marquee filter only activates when Foundry exposes scene level observations. If no level context is available, marquee targeting continues to operate on visible tokens normally.
Cursor sharing respects Foundry's core Display Mouse Cursor permission. If that permission blocks a player role, the module will not force that player's cursor to appear through the normal sharing path.
Access:
const api = game.modules.get("show-of-hands").api;
Show of Hands' public API is small and support-oriented.
api.getDebugState()
api.refreshSharedCursorImage()
api.syncHiddenRemoteCursors()
getDebugState() also exists on the global helper:
ShowOfHands.getDebugState()
api.diagnostics.actions.getStatus()
api.diagnostics.actions.validateSettings()
api.diagnostics.actions.validateAssets()
api.diagnostics.actions.validateV14Runtime()
api.diagnostics.actions.collectClientDiagnostics()
api.diagnostics.actions.runSmokeTests()
api.diagnostics.actions.validateCursorConfig()
api.diagnostics.actions.validateCursorAssets()
api.diagnostics.actions.openWindow({ window: "cursor" })
api.diagnostics.actions.refreshClient({ delayMs: 250 })
Read-only diagnostics are gated behind GM-only debug settings. Mutating fixture automation additionally requires confirmMutation: true:
api.diagnostics.actions.runAutomation({ confirmMutation: true })
api.diagnostics.actions.cleanupFixtures({ confirmMutation: true })
--cursor-* values inline on the root element; overriding them only in a stylesheet can leave the native cursor active.Copy a compact debug snapshot to the console.
console.log(game.modules.get("show-of-hands").api.getDebugState());
Refresh the shared cursor image after changing a cursor asset.
game.modules.get("show-of-hands").api.refreshSharedCursorImage();
Open the cursor configuration window through diagnostics. Requires the diagnostics gates to be enabled.
game.modules.get("show-of-hands").api.diagnostics.actions.openWindow({ window: "cursor" });
Show of Hands is free. My premium modules are released as Bakshi's Bazaar for Bazaar Patrons and install through Foundry's Premium Content.
| Module | What it adds |
|---|---|
| 5e Activity Importer | Adds activities and Active Effects to dnd5e Items from YAML, or imports complete Items together with 5e Item Importer. |
| Custom Currency 5e | Custom coins, exchange rates, regional markets, and physical coin items on native dnd5e sheets. |
| FileSmith | Folder colors, multi-select, clipboard actions, and move undo for Foundry's sidebar. |
| Immersive Vision FX | Soft vision and light edges, creature vision profiles, cave light, and eyeshine. |
| Traffick | Party trading, merchant catalogs, perceived prices, and appraisal checks for dnd5e. |
A Bazaar Patron membership includes:
Everyone is welcome in the Bakshi's Bazaar Discord: the public channels cover release announcements, questions, and feature ideas, and patrons also get the patron-only channels and priority support. Bug reports for Show of Hands still go to GitHub issues, as described under Community.
Bug reports, feature ideas, reproduction notes, documentation fixes, and localization ideas are welcome.
I am not generally accepting unsolicited code PRs for features, refactors, architecture, or behavior changes. This is still my module and my codebase; I will decide how features are designed and implemented unless I explicitly say otherwise.
I may adapt, decline, or implement submitted ideas. Any accepted contribution or submitted project material may be released under the same EULA as the rest of the module.
This module is developed and maintained with the help of AI-assisted tools for coding, debugging, and testing.
I care about the quality, behavior, performance, security, and long-term maintainability of this module, and I take full responsibility for what ships. AI assistance does not replace review, testing, debugging, or security and design judgment.
AI is used here as a tool under my direction to make Foundry better and allow for long term mod support while still having a life outside of building and maintaining my free and premium modules.
If you are uncomfortable using software developed with AI-assisted tools, this module is not for you.
This module represents many hours of development.
If this module made your table smoother, clearer, or just a little more stylish, consider supporting development:
"Thanks for the support! It helps me maintain support for the module and puts a nice steak on the table."
This module is licensed under the GnollStack Proprietary EULA. It is Free for Personal Use, meaning you can use it in your home games, stream it, or modify it for your own table without restriction.
However, Commercial Redistribution is Strictly Prohibited. You may NOT sell this module, bundle it within paid content such as Patreon maps or adventures, or host it as a commercial service without prior written consent.
I am open to partnerships. If you are a map maker, adventure writer, or developer who wishes to use this module commercially, please contact me. Commercial licenses are available for:
For licensing inquiries or permission slips:
GnollStack (Preferred)[email protected]Author: GnollStack - Compatibility: Foundry VTT v14 - Version: 14.2.2
To install this package, open your Foundry Setup screen and navigate to your Module tab and click the Install Module button.
From there, you can either search for the package unique name: show-of-hands or copy its manifest URL:
And paste it to the input box at the bottom of your window.

You can install this package directly to your Forge account.