kywk23 downloadsTurn Markdown notes into geographic stories with an interactive map and slides.
A small, reusable Leaflet-based StoryMap stack. One Markdown source and one standard
StoryMapConfig render in three hosts:
A bilingual project site (English / 繁體中文) lives in site/ and renders several live
examples with the shared renderer. It is published to GitHub Pages from main by
.github/workflows/pages.yml at https://kywk.github.io/story-map/; run it locally with
pnpm --filter @story-map/site dev.
Turn Markdown notes into geographic stories with an interactive map and slides.
Requires desktop Obsidian 1.8.7 or newer; mobile is not supported in this release.
The plugin is named Geo Story Map (geo-story-map); the source syntax remains
story-map. It does not require the separate Obsidian Leaflet plugin.
main.js, manifest.json, styles.css, and THIRD_PARTY_NOTICES.txt
from the plugin release.<Vault>/.obsidian/plugins/geo-story-map/.location or copy it.Add notes under the document's noteFolder, for example Travel/Chile/Places/Santiago.md:
---
story-map-note: true
title: Santiago
location: [-33.4489, -70.6693]
date-created: 2026-01-15
description: The journey begins here.
---
See the plugin guide for settings and note display. Geo Story Map is free, needs no plugin account, and includes no telemetry. Maps request OpenStreetMap tiles by default; configured tile providers and remote media connect to their specified hosts. The plugin reads notes and attachments inside your vault.
| Package | Role | Distribution |
|---|---|---|
@story-map/story-map-core |
Framework-agnostic schema, parser, and helpers | npm (0.2.0) |
@story-map/react-story-map |
React + Leaflet renderer | npm (0.2.0) |
@story-map/remark-story-map |
Remark build-time transform + browser client | npm (0.2.0) |
@story-map/obsidian-story-map |
Geo Story Map Obsidian view and Vault resolver | GitHub Release 0.2.1 |
corepack enable
pnpm install
pnpm typecheck
pnpm test
pnpm build
pnpm typecheck uses TypeScript project references (tsc -b), so it builds
story-map-core for dependents instead of relying on a stale dist.
Run the standalone example:
pnpm --filter @story-map/example-react dev # http://127.0.0.1:5173
A StoryMap document is a normal Markdown file with story-map: true frontmatter and one
fenced story-map configuration block:
---
story-map: true
---
```story-map
schema: storymap/v1
title: Chile Trip
map:
center: [-33.4489, -70.6693]
zoom: 6
showPath: true
noteFolder: Travel/Chile/Places
order: asc
dateField: date-created
noteDisplay: link
includeTags: [travel, chile]
excludeTags: [draft]
```
noteFolder recursively discovers Markdown notes with story-map-note: true, ordered by
dateField using order: asc | desc. includeTags keeps notes with any listed
frontmatter tag and excludeTags drops notes with any listed tag (both optional). Explicit
slides keep their exact order and are never reordered or appended to by folder discovery.
noteDisplay: basic | link | full controls how resolved notes are shown (default link):
frontmatter basics, basics with a title link to the note, or the full frontmatter-stripped
note body. Obsidian opens the note through host callbacks; Docusaurus renders the
published route as a normal browser link.
remark-story-map transforms each fence at build time into a host element and a browser
client mounts the shared renderer. Configure it with vaultRoot, assetBase, and a host
resolveNoteHref route callback. See packages/remark-story-map/README.md and
examples/docusaurus/.
A full-page map (Open as Story Map, with a Markdown toggle) is deliberately host UI rather than a package option; to add it to a site, follow docs/docusaurus-full-page.md.
react-story-map must never import Obsidian or Docusaurus APIs. Platform adapters resolve
notes, WikiLinks, Vault frontmatter, local assets, and routes into a StoryMapConfig
before render time.
SPEC.md — product and architecture contract.docs/architecture.md — implementation map for contributors and agents.AGENTS.md — working agreement and definition of done.RELEASING.md — npm and Obsidian plugin release steps.docs/history/ — archived plans.MIT; see LICENSE. Bundled dependency notices accompany the plugin release.