This application enables users to create DynDash Dashboards to assist during 5e combat encounters. It is not intended to be an entire combat tracker with hit points and abilities. I simply wanted to create a tool that would quickly give me an overview on the to-hit bonuses in relation to my players' armor classes.
The express.js server scrapes information on 5e Characters and Creature Statblocks from simplified Markdown files (see why). It also harbors a digital dice object that can be interacted with through specific endpoints. All of this is served under the API specification that makes the data available to any connected DynDash application.
| Component Name | Source Data Types | Purpose |
|---|---|---|
| Encounter Display | 5eEncounter |
Shows all given encounters and gives buttons to control them |
| Dice Roll Display | 1x 5eEncounter, 1x digitalDice |
Takes the rolls of a dice and the contextual bonuses from an encounter to displays the total result |
| Party Display | 1x 5eEncounter, 1x digitalDice, 5eParty |
Takes the rolls of a dice and the contextual bonuses from an encounter. Displays which party members (from all given parties) would be hit by the total result. Also provides buttons to control the members' AC. |
| Combat Display | 1x 5eEncounter, 1x digitalDice, 5eParty |
Combines all previous Components (shown in the image above). |
Run the following command for installation
npm installYou may need to extend the safelist of the tailwind.config.js inside your DynDash application with the following lines, depending on the version of your installation:
"w-[75%]",
"w-[10%]",
"w-[15%]",
"h-[20%]",
"h-[75%]",
"h-[30%]",
"h-[65%]",
"h-[90%]",
"translate-x-[70%]",
{
pattern:
/.*(translate|top|right|left|bottom|animate|w|h|items|justify|flex|rounded|px|py|p).*/,
},As previously mentioned, the application scrapes data from Markdown files (see why). You need to define the correct folder paths in the configuration file of this application (ideally before running it, but it might work at runtime in some cases).
The party-paths object expects party names as keys that map to absolute paths of the respective party folders that are structured like this:
party_folder
├─ player_A.md
├─ player_B.md
└─ player_C.md
Each player file should be a Markdown file that contains a mandatory frontmatter property for armor-class and an optional property for potential armor-bonuses that stray from the common +2 and +5 bonuses related to cover.
Additionally, as seen in the example below, a player file might include an embedded image of the character. To allow the application to load these images, ensure that the linked image is only referred to by its direct file name (no prepended directories) and add the absolute path of its parent directory to the image-paths array inside of the configuration file. The application checks for embedded images in the formats  and ![[image_name.ext]]. When using the latter, ensure that the wikilink does not have an alias (![[image_name.ext|alias]]).
---
armor-class: 12
armor-bonuses:
- "3"
- "-4"
---
![[figure_a.png]]The encounter-paths object works in the same way. However, it is also possible to load all encounters within a parent folder by adding the parent folder's absolute path to the session-paths array. In the latter case, the encounter names will be automatically generated from the folder names of each encounter.
session_folder_1
├─ encounter_devils
│ ├─ devil_large.md
│ └─ imp.md
└─ encounter_elementals
├─ fire_elemental.md
├─ water_elemental.md
└─ ice_elemental.md
Each statblock file should be a Markdown file that contains a mandatory frontmatter property for attack-bonus:
---
attack-bonus: 3
---Run the following command to start the application
npm startConnect to a running DynDash application by pasting the URL http://localhost:4453/ into its Config Editor and hitting the + button, followed by the Save button. You should be able to select all of the things you want the application to provide (refresh the page if you aren't able to do so).
Note
The Components of the this application can be used in conjunction with the dice from the pixels-dyndash-api, since both providers use the same digitalDice Data Type.
It may seem like a really weird choice to store the relevant data in Markdown files. There is no denying that it is a little unconventional.
The motivation for doing it like this anyways is that I already store my 5e Campaign notes and data in .md files and wanted to make use of the structures that were already in place.
From my understanding, many people use Markdown files inside Obsidian or Logseq vaults for this very purpose as well, so I felt like this would be an acceptable way of implementing it.
Additionally, the format is simple enough for people to quickly set their data up in the correct way. A good starting point for this is the /examples/ directory.
The project is licensed under the GNU AGPL v3 License

