Lore Creator

approved

by PancstaR

Design fictional universes: branching timelines, versioned story fragments, custom calendars and structured worldbuilding entities. - This plugin has not been manually reviewed by Obsidian staff.

Updated 7d agoMIT

๐ŸŒŒ Lore Creator

Build fictional universes inside Obsidian

Branching timelines ยท versioned drafts ยท your own calendar

English ย ยทย  Tรผrkรงe


Obsidian Release Platform Language License


โœจ Features ย ยทย  ๐Ÿงฉ Concepts ย ยทย  ๐Ÿš€ Getting started ย ยทย  ๐Ÿท๏ธ Frontmatter ย ยทย  โŒจ๏ธ Commands ย ยทย  ๐Ÿ› ๏ธ Development


The branching timeline canvas: two flows, a converging thread and a lane for notes with no time yet

๐Ÿ•’ The timeline canvas โ€” flows as lanes, time across the axis, branches drawn as curves



Status โ€” early but complete. Every feature below works. Interfaces may still shift before 1.0, and the frontmatter schema is not yet frozen.


๐Ÿ’ก Why

Worldbuilding notes rarely get written in order. You write part 1, leave it half finished, jump to part 4, then go back to part 0. Later you decide the war started twenty years earlier than you first wrote, and eight notes have to change together โ€” but you want to keep the old draft, because you are not sure yet.

Most tooling assumes you write forwards and never change your mind. This plugin assumes the opposite:

๐ŸŒฑUnfinished is a normal state, not an error to clear
๐ŸŒฟA fragment can lead to different places in different drafts, and switching drafts reshapes the timeline
๐Ÿ“ฆNothing is deleted. Old versions and unused ideas stay where you can find them

Everything lives in ordinary Markdown with ordinary frontmatter. Uninstall the plugin and your universe is still a readable set of notes.


๐Ÿงฉ Concepts

Four ideas, kept deliberately separate:

flowchart TD
    U["๐ŸŒŒ Universe<br/><i>one vault</i>"] --> T1["๐Ÿ•’ Timeline<br/><i>a reality</i>"]
    U --> T2["๐Ÿ•’ Timeline<br/><i>a parallel reality</i>"]
    T1 --> F1["๐Ÿงต Flow<br/><i>a character's lane</i>"]
    T1 --> F2["๐Ÿงต Flow<br/><i>another lane</i>"]
    F1 --> N["๐Ÿ“„ Note<br/><i>a story fragment</i>"]
    F2 --> N
    N --> V1["๐Ÿ“ v3 ยท active<br/><i>lives at the note's path</i>"]
    N --> V2["๐Ÿ—„๏ธ v2 ยท archived"]
    N --> V3["๐Ÿ—„๏ธ v1 ยท archived"]

    classDef universe fill:#4f46e5,stroke:#3730a3,color:#fff
    classDef timeline fill:#7c3aed,stroke:#5b21b6,color:#fff
    classDef flow fill:#0ea5e9,stroke:#0369a1,color:#fff
    classDef note fill:#22c55e,stroke:#15803d,color:#062e11
    classDef active fill:#f59e0b,stroke:#b45309,color:#3b1d00
    classDef archived fill:#94a3b8,stroke:#475569,color:#0f172a

    class U universe
    class T1,T2 timeline
    class F1,F2 flow
    class N note
    class V1 active
    class V2,V3 archived
ConceptWhat it isPart of the fiction?
๐Ÿ•’TimelineA reality โ€” the main universe, or a parallel oneโœ… Yes
๐ŸงตFlowA lane inside a timeline, usually one character's thread. Lanes cross, merge, and split againโœ… Yes
๐Ÿ“VersionA draft of one note. Carries its own time, flow and connectionsโŒ An authoring tool
๐ŸšฆStatusdraft ยท partial ยท doneโŒ An authoring tool

[!IMPORTANT] A parallel universe is a timeline; a second attempt at the same scene is a version. Confusing the two is the fastest way to make a vault incoherent.


โœจ Features

๐ŸŒฟBranching canvasTime across the x axis, flows as lanes, next/prev drawn as curves
๐Ÿ“Versions that reshape the storyEach draft carries its own time, flow and connections
๐Ÿ“šVersion setsFlip a whole story revision back and forth in one move
๐Ÿ“…Your own calendarAny unit, any epoch, optional mapping to Earth years
๐Ÿ—‚๏ธTypes and entitiesCharacters, species, places, factions, objects, events โ€” defined in a note, not in code
โš–๏ธLawsUniverse physics and the entities that break them, linked both ways
๐Ÿ’กDrafts you can promoteA shelf for homeless ideas, turned into real notes when they earn it
๐ŸงญNavigationA bar under each note showing every place it leads, with a hover map
๐Ÿ“ŠDashboard & consistencyCounts, everything unfinished, and an advisory report
๐Ÿ”Search & exportFilter by field, then build one Markdown document from what you choose

๐ŸŒฟ Branching timeline canvas

Notes carrying a timeline id are laid out with time across the x axis and flows as lanes. Connections come from next and prev, drawn as curves so converging threads stay readable.

flowchart LR
    subgraph EXPLORER["๐Ÿงต Explorer"]
        direction LR
        A["First Signal"] --> B["Second Signal"] --> C["Silence"]
    end
    subgraph COLONY["๐Ÿงต Colony"]
        direction LR
        D["Founding"] --> E["Divergence"] --> F["Convergence"] --> G["Dissolution"]
        D --> H["Long Road"] --> F
    end
    C -.-> I["Ascent"]
    F --> I

    classDef done fill:#22c55e,stroke:#15803d,color:#062e11
    classDef partial fill:#f59e0b,stroke:#b45309,color:#3b1d00
    classDef draft fill:#94a3b8,stroke:#475569,color:#0f172a

    class A,B,D,E,F done
    class C,H,G partial
    class I draft
๐ŸŸฉ done ย ยทย  ๐ŸŸจ partial ย ยทย  โฌœ draft ย ยทย  dashed = uncertain
  • Boxes widen to show duration (time-end) and go dashed when approximate (time-uncertain).
  • Notes with no time yet get their own lane instead of vanishing.
  • Border colour reflects status; a dot marks fragments that have other versions.
  • Pan, zoom, click through to any note.

๐Ÿ“ Versions that reshape the story

Each version of a note carries its prose and its time, flow and connections. In one draft a scene leads to a battle; in another it leads somewhere else. Switch versions and the timeline redraws.

flowchart LR
    subgraph BEFORE["Draft A ยท v2 active"]
        direction LR
        A1["Second Signal"] --> A2["Silence"]
    end
    subgraph AFTER["Draft B ยท v3 active"]
        direction LR
        B1["Second Signal"] --> B2["Ascent"]
        B1 --> B3["Long Road"]
    end
    BEFORE -->|"switch version"| AFTER

    classDef old fill:#94a3b8,stroke:#475569,color:#0f172a
    classDef new fill:#7c3aed,stroke:#5b21b6,color:#fff
    class A1,A2 old
    class B1,B2,B3 new

The active version always stays at the note's own path, so [[links]] elsewhere in the vault never break. Older versions wait in an archive folder and are found by following version-of rather than by a list that could drift out of date.

๐Ÿ“š Version sets name a snapshot of which version of each note is active. One story revision usually touches many notes; without this, going back to the earlier draft means remembering and flipping every one of them by hand.

[!NOTE] Every file move is preceded by a dialog naming the exact paths, ordered so the current content reaches its new home before anything overwrites it.

๐Ÿ“… Your own calendar

A universe does not have to run on Earth years.

time: 134923.4521          # always a single sortable number
time-precision: date       # year ยท date ยท datetime
time-label: "Xen Year 134923, day 165"
earth-time: 2050           # optional reference for readers

Define the calendar once โ€” unit name, epoch, days per unit, and how it maps to Earth years โ€” and the time picker fills in the number and the label for you. Or leave the mapping out and write the label yourself.

๐Ÿ—‚๏ธ Types and entities

Characters, species, places, factions, objects, events, laws, drafts. Each type brings its own fields, its own template and its own default icon.

The registry lives in a note's frontmatter, so adding a type is editing a note, not editing this plugin โ€” and any AI assistant reading your vault can see what your types mean.

โš–๏ธ Laws that know who breaks them

Universe-wide physics and entity-specific rules, kept as two layers. Entities declare which laws they are subject to and which they break; the laws view inverts those links so a law shows both. Laws can be scoped to particular timelines, for when a parallel reality runs on different physics.

flowchart LR
    L["โš–๏ธ No faster-than-light travel<br/><i>scope: universe</i>"]
    C1["๐Ÿ‘ค Kyle"] -->|"laws"| L
    C2["๐Ÿ‘ฝ Xen envoy"] -->|"breaks-law"| L
    L -->|"the laws view inverts both"| VIEW["๐Ÿ“‹ Subject to ยท Breaks"]

    classDef law fill:#7c3aed,stroke:#5b21b6,color:#fff
    classDef entity fill:#0ea5e9,stroke:#0369a1,color:#fff
    classDef view fill:#22c55e,stroke:#15803d,color:#062e11
    class L law
    class C1,C2 entity
    class VIEW view
The laws view: universe-wide laws above entity-specific ones, each showing who is bound by it and who breaks it

โš–๏ธ Universe-wide laws above, entity-specific below โ€” each one showing who is bound and who breaks it

๐Ÿ’ก Drafts you can promote

A shelf for ideas that have no home yet. Open one beside whatever you are writing without losing your place. When an idea earns a place in the story, promote it: pick the type and the folder, and choose whether the draft keeps its text or hands it over. Either way the draft survives and the two notes reference each other.

๐Ÿงญ Navigation

A bar under each note showing where it leads. Fragments often lead to more than one place, so every destination gets its own button. Hover to preview the destination on a map that can show the whole timeline or just what is one step away โ€” and can be pinned open.

An empty next means the thread ends there. Nothing is invented to fill it.

๐Ÿ“Š Dashboard, search and export

๐Ÿ“ŠDashboardCounts by type, everything unfinished (half-written sorted above untouched), and a consistency report
๐ŸฉบConsistencyBroken links, one-sided connections, links that lead backwards in time, notes on a timeline with no date. Advisory only: it corrects nothing and blocks nothing, because most findings are work in progress rather than mistakes
๐Ÿ”SearchFilters by type, status, timeline, flow and time range. Obsidian's own search already covers the words; this answers "every unfinished character in the main universe"
๐Ÿ“คExportOne Markdown document from the sections you choose. This is why notes carry no privacy flag: what a reader sees is decided when you share, not stored on every note forever

๐Ÿš€ Getting started

๐Ÿ“ฅ Install

Not yet in the community plugin browser. Until then:

  1. Download main.js, manifest.json and styles.css from the latest release.
  2. Put them in <vault>/.obsidian/plugins/lore-creator/.
  3. In Obsidian: Settings โ†’ Community plugins, turn off Restricted Mode, then enable Lore Creator.

๐Ÿช„ Set up a vault

Run Set up this vault from the command palette. It creates the folders, templates and type registry the views read from โ€” previewing the exact tree first, and never overwriting a file that already exists.

๐Ÿ“ <vault>
โ”œโ”€โ”€ ๐Ÿ“„ Universe.md            โ† calendar, timelines, universe-wide laws
โ”œโ”€โ”€ ๐Ÿ“ System/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ Types.md           โ† the type registry: edit a note, not the plugin
โ”‚   โ””โ”€โ”€ ๐Ÿ“„ Version sets.md
โ”œโ”€โ”€ ๐Ÿ“ Templates/
โ”œโ”€โ”€ ๐Ÿ“ Versions/              โ† archived versions, found via version-of
โ””โ”€โ”€ ๐Ÿ“ Exports/

Folder names are chosen separately from the interface language: a universe is written in whatever language its story is, which is not necessarily the language of your menus.

โœ๏ธ Write something

flowchart LR
    S1["1๏ธโƒฃ New lore note<br/>โ†’ Timeline<br/><i>timeline-id: main</i>"]
    S2["2๏ธโƒฃ New lore note<br/>โ†’ Story<br/><i>set time, timeline, flow</i>"]
    S3["3๏ธโƒฃ Link notes<br/><i>next / prev</i>"]
    S4["4๏ธโƒฃ Open the timeline<br/><i>from the ribbon</i>"]
    S1 --> S2 --> S3 --> S4
    S3 -.->|"repeat"| S2

    classDef step fill:#4f46e5,stroke:#3730a3,color:#fff
    classDef last fill:#22c55e,stroke:#15803d,color:#062e11
    class S1,S2,S3 step
    class S4 last
  1. New lore note โ†’ pick Timeline, name it, give it a timeline-id such as main, and list its flows.
  2. New lore note โ†’ pick Story. In the banner at the top, click the time to place it, and set timeline and flow in the properties.
  3. Repeat, linking notes with next.
  4. Open the timeline from the ribbon.

๐Ÿท๏ธ How notes are described

Standard fields โ€” on every lore note
FieldMeaning
typeWhich type this is โ€” the folder is only organisation
icon / icon-typeAn emoji or a Lucide icon name
statusdraft ยท partial ยท done
aliasesObsidian's own field; resolves [[Lord Kyle]] to this note
alias-historyWhen and why a name changed
relatedFree-form links
๐Ÿ•’ Timeline placement โ€” when a note has one
FieldMeaning
timelineWhich reality it belongs to
flowWhich lane
timeA single number. Sorting depends only on this. May be empty
time-precisionyear ยท date ยท datetime
time-labelWhat readers see
time-endSet when this spans a period rather than a moment
time-uncertainDrawn dashed
earth-timeOptional reference, computed or written by hand
next / prevConnections. More than one means the story branches
๐Ÿ“ Versioning
FieldMeaning
versionv1, v2, โ€ฆ
version-nameOptional label, also used in the archive filename
version-noteWhat is different about this draft
version-ofPresent only on archived versions
โš–๏ธ Laws and ๐Ÿ’ก drafts
FieldMeaning
scopeuniverse or local
applies-to / timeline-scopeWhere a law holds. Empty means everywhere
laws / breaks-lawDeclared on entities; the laws view inverts them
idea-forWhat a draft is an idea for
promoted-to / promoted-fromThe two-way link left by a promotion

โŒจ๏ธ Commands

CommandWhat it does
๐Ÿช„Set up this vaultCreate folders, templates and the type registry
๐Ÿ“„New lore noteCreate a note from a type's template
๐ŸชŸOpen timeline / laws / drafts / dashboardOpen a view
๐Ÿ“Versions of this noteList, create, switch and archive versions
๐Ÿ“šVersion setsCapture and apply named snapshots
๐ŸงญGo to the next / previous fragmentFollow a connection; asks when there are several
๐Ÿ’กPromote this draftTurn a sketch into a real note
๐Ÿ”Find in the universeSearch by field rather than by text
๐Ÿ“คExport the universeBuild a single Markdown document

โš™๏ธ Settings

Every path is configurable; these are the defaults:

SettingDefault
Universe fileUniverse.md
Type registrySystem/Types.md
Versions folderVersions
Templates folderTemplates
Version sets fileSystem/Version sets.md
Exports folderExports

Calendar settings are written into the universe note's frontmatter rather than plugin data, so a vault stays self-describing even without the plugin installed. The type registry lives in a note for the same reason.

Interface language follows Obsidian's own, or can be set explicitly. ๐Ÿ‡ฌ๐Ÿ‡ง English and ๐Ÿ‡น๐Ÿ‡ท Turkish are included. Frontmatter field names are English in every language โ€” they are data, not interface.


๐Ÿ› ๏ธ Development

npm install
npm run dev     # esbuild watch โ€” rebuilds main.js on save
npm run build   # type-check, then produce a minified main.js

The sources live outside any vault. To work on the plugin, point a vault's plugin folder at this repository โ€” a junction or symlink keeps it to one copy:

# Windows, no administrator rights needed
mklink /J "<vault>\.obsidian\plugins\lore-creator" "<path to this repo>"

# macOS and Linux
ln -s "<path to this repo>" "<vault>/.obsidian/plugins/lore-creator"

Obsidian does not reload plugins by itself. Hot Reload picks up rebuilds automatically; without it, run Reload app without saving after each change.

Releases are tagged with the version number exactly, with no v prefix. Pushing the tag builds the plugin and publishes main.js, manifest.json and styles.css as individual assets, which is what Obsidian expects.

There are no runtime dependencies โ€” nothing third-party is bundled into main.js.


๐Ÿค Contributing

Issues and pull requests are welcome. Two things worth knowing before you start:

  • ๐Ÿ—„๏ธ The vault is the source of truth. Anything the plugin knows should be readable from the notes themselves, so a universe survives without it.
  • ๐Ÿ›ก๏ธ Nothing destructive happens without a dialog naming the exact files, and file moves are ordered so a failure leaves a duplicate rather than a hole.

Lore Creator ย ยทย  by PancstaR ย ยทย  MIT

Made for writers who change their minds โœ๏ธ

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.