sbuffkin113 downloadsCreate a hex map and a guidebook level wiki for your setting with minimal fuss. Hex crawl worldbuilding toolbox. System agnostic, ready for any TRPG you care to run in it.
An Obsidian plugin for tabletop RPG hex-map world-building. Each hex on the map is a Markdown note in your vault — attach terrain, locations, paths, and prose directly to the geography of your world.
Hexmaker gives you an interactive hex grid that lives inside Obsidian. Paint terrain, draw roads and rivers, link town and dungeon notes to individual hexes, overlay faction and geographic region fills, roll random encounters, and browse everything in a spreadsheet view — all without leaving your vault. Every hex is a plain Markdown file you own.
Right-click any hex to open the editor: set terrain, override the icon, link Towns, Dungeons, Features, Quests, Factions, and Encounters Tables, and write freeform notes (Description, Landmark, Hidden, Secret, Weather, Hooks & Rumors). A 🎲 button on each section lets you roll any random table and append the result inline.
Switch to the Terrain tool, pick a colour from your palette, and drag across hexes to paint. Choose a 1×, 3×, or 7× brush for broad strokes. An eyedropper lets you sample an existing hex's terrain as your active brush.

Click the Path button to open the path picker. Select any defined path type — road, river, or anything you've created — then click hexes to lay down a chain. Each type has its own colour, width, line style (solid / dashed / dotted), and routing mode (through hex centres, meandering between them, or tracing hex edges). Edit types at any time from the map toolbar.

A two-panel view for rolling and managing weighted random tables. Click any table to open it, hit Roll to highlight a result, and see percentage odds for every entry. Create new table files from the toolbar, edit entries inline, and chain tables together into multi-step workflows that fill a template note with rolled results.

A scrollable spreadsheet of every hex note — one row per hex, columns for terrain, description, towns, dungeons, features, quests, factions, encounters table, and all the freeform sections. Click any cell to edit it in place. Filter by region, terrain type, or the presence of specific link types. The ◎ button jumps the map view to that hex's position.
Paint translucent colour fills over hexes to show political control or geographic regions. Adjacent hexes of the same faction or region merge into smooth blobs with a rendered legend. Toggle overlays from the map toolbar; overlay state is saved per map.
Toggle the GM layer from the toolbar to switch between player-facing and GM views. When active, Hidden and Secret sections in the hex editor expand automatically, and hexes with hidden or secret content are highlighted on the map.
main.js, manifest.json, and styles.css from the latest release..obsidian/plugins/hexmaker-plugin/.After enabling the plugin, do this once before you start mapping:
Open Settings → Hexmaker and enter a root folder name in World folder (e.g. RPG/world). This is the base for all other folders.
Click Generate folders. This fills in the hex, towns, dungeons, tables, and other folder settings with sensible defaults under your world folder and creates them in your vault. Any field you've already filled in is left untouched.
Click the map icon in the left ribbon (or use the command palette: Open Hexmaker hex map). You'll be prompted to create your first region — give it a name, choose its size, and pick a terrain palette.
Once your folders are set, go back to Settings → Hexmaker and click Generate terrain tables & hex links. This creates a description and encounters table file for every terrain type and links them into any existing hex notes. It's safe to run again at any time.
You're ready to start mapping.
An interactive hex grid rendered as an Obsidian panel.
+/− buttons in the toolbar.⌖ button) — enter coordinates to centre the view on a specific hex.The map is divided into named regions, each stored as a subfolder under your hex folder. Switch, create, rename, and delete regions from the region button in the toolbar.
Each region is assigned a terrain palette at creation time (see below).
A side-panel modal for editing a hex note without leaving the map.
Open via Command palette → "Open Hexmaker random tables" or the 🎲 toolbar button on the hex map.
A two-panel view for managing and rolling on random tables.
.md files in the configured Tables folder. Click a table to load it. + New creates a file from the default template.dice: frontmatter and recalculates die ranges.Open via the Workflows tab in the Random Tables panel.
Chain multiple table rolls together into a filled template note.
$placeholder variables, and a results folder.Each terrain type has two auto-generated table files: {terrain} - description.md and {terrain} - encounters.md, stored under {tablesFolder}/terrain/.
⚠️ Configure all folder settings before clicking Generate. The Generate button (Settings → Hexmaker → Generate world data) creates the terrain table files and links each hex note's terrain encounters table into its Encounters Table section. It is safe to run multiple times.
Toggle tools from the toolbar above the map. Right-click off a hex to exit any tool.
| Tool | Left-click | Right-click (on hex) |
|---|---|---|
| Terrain | Paint terrain on a hex (drag to paint multiple) | — |
| Icon | Paint an icon override on a hex | — |
| Path | Add hex to the active path chain | Remove hex from chain |
| Faction | Paint a faction colour on a hex (drag to paint multiple) | Erase faction from hex |
| Region | Paint a geographic region colour on a hex | Erase region from hex |
| Table link | Add the selected random table as a link in a hex's Encounters Table section | — |
Terrain painter extras:
Path tool: Click the Path button to open the path type picker. Select a type to start drawing, or switch to edit mode to create, rename, recolour, or delete path types. Each path type has a name, colour, line width, line style (solid / dashed / dotted), and routing mode:
Toggled from the overlay panel on the map toolbar.
### Factions section.Toggle the GM layer from the map toolbar. When active:
GM layer state is stored per map and persists across sessions.
Open via Command palette → "Open Hexmaker hex table".
A scrollable reference table of every hex note, with one row per hex and columns for all sections.
Open Settings → Hexmaker to configure:
| Setting | Description |
|---|---|
| World folder | Root folder for world notes (used by the Features file picker). |
| Hex folder | Folder where hex notes are stored, e.g. RPG/world/hexes. |
| Towns folder | Scopes the Towns dropdown to a specific folder. |
| Dungeons folder | Scopes the Dungeons dropdown to a specific folder. |
| Quests folder | Scopes the Quests dropdown to a specific folder. |
| Factions folder | Scopes the Factions dropdown to a specific folder. |
| Tables folder | Folder for random table files. Terrain tables are created in a terrain/ subfolder here. |
| Workflows folder | Folder for workflow definition files and their templates. |
| Default die | Die size used when creating new table files (d4–d100). |
| Icons folder | Folder containing .png icon files available as custom terrain/hex icons. |
| Template path | Path to a custom hex note template. Supports {{x}}, {{y}}, {{title}} placeholders. Leave blank to use the built-in template. |
| Hex gap | Gap between hexes in pixels. |
| Grid size | Number of columns and rows in the map grid. |
| Hex orientation | flat (default) or pointy top hex style. |
| Path types | Named path types used by the Path drawing tool. Each type has a name, colour, width, line style, and routing mode. Manage them from the Path button on the hex map toolbar. |
| Terrain palettes | Named palettes of terrain types. Each palette has a name and a list of terrain entries (name, colour, optional icon). Palettes are assigned to regions at creation time and cannot be changed after. Edit palette contents from the terrain tool on the hex map. |
| Generate | ⚠️ Configure all folders first. Creates missing terrain table files and links each hex's terrain encounters table into the hex note. |
Each hex note lives at {hexFolder}/{region}/{x}_{y}.md (e.g. RPG/world/hexes/Overworld/3_7.md).
Frontmatter:
---
terrain: Forest
---
Sections (used by the editor and table view):
| Heading | Type | Purpose |
|---|---|---|
### description |
Text | What the party sees and feels |
### landmark |
Text | The standout visible feature |
### Towns |
Links | Settlement links |
### Dungeons |
Links | Dungeon/site links |
### Features |
Links | Other points of interest |
### Quests |
Links | Active quest links |
### Factions |
Links | Faction links (used by the faction overlay) |
### Encounters Table |
Links | Random table links (linked to terrain by Generate) |
### hidden |
Text | Discoverable with effort |
### secret |
Text | Revealed only through investigation |
### weather |
Text | Weather notes |
### hooks & rumors |
Text | Adventure seeds |
You can use your own template (configured in Settings). Any ### Heading that matches a section name will be picked up automatically.
npm install # install dependencies
npm run dev # watch mode — rebuilds main.js on every save
npm run build # production build (type-check + bundle)
npm run version # bump version (updates manifest.json and versions.json)
npm test # run the test suite
The built output is main.js in the repo root. Obsidian loads this file directly from the plugin folder.
Reload the plugin after a build:
// Paste in Obsidian developer console (Ctrl+Shift+I)
app.plugins.disablePlugin('hexmaker-plugin');
app.plugins.enablePlugin('hexmaker-plugin');
main.ts ← re-exports HexmakerPlugin
src/
HexmakerPlugin.ts ← plugin entry point
HexmakerSettingTab.ts ← settings UI
HexmakerModal.ts ← base modal class (all modals extend this)
types.ts ← interfaces and type constants
constants.ts ← runtime constants and defaults
frontmatter.ts ← terrain/icon YAML read/write
sections.ts ← markdown section read/write helpers
utils.ts ← shared utilities
defaultHexTemplate.md ← built-in hex note template
hex-map/
HexMapView.ts ← interactive hex grid (ItemView)
HexEditorModal.ts ← right-click hex editor (Modal)
TerrainPickerModal.ts ← terrain palette picker
TerrainEntryEditorModal.ts ← edit a single terrain entry
IconPickerModal.ts ← icon override picker
RegionModal.ts ← region management
PathPickerModal.ts ← path type picker
PathTypeEditorModal.ts ← edit a single path type
FileLinkSuggestModal.ts ← file picker scoped to a folder
hex-table/
HexTableView.ts ← hex reference table (ItemView)
HexCellModal.ts ← inline cell editor
HexTerrainPickerModal.ts ← terrain picker in table view
random-tables/
RandomTableView.ts ← random tables + workflows panel (ItemView)
RandomTableModal.ts ← inline roll modal
RandomTableEditorModal.ts ← edit table entries
WorkflowEditorModal.ts ← edit workflow definition
WorkflowWizardModal.ts ← execute a workflow
randomTable.ts ← parse/roll/odds utilities
workflow.ts ← workflow parse/serialize utilities
main.js is missing. Run npm run build.Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (Mac) to open the developer console.This plugin bundles MiniSearch (© Luca Ongaro, MIT License) for in-memory full-text search.