English Β Β·Β TΓΌrkΓ§e
β¨ Features Β Β·Β π§© Concepts Β Β·Β π Getting started Β Β·Β π·οΈ Frontmatter Β Β·Β β¨οΈ Commands Β Β·Β π οΈ Development
π 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.
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.
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
| Concept | What it is | Part of the fiction? | |
|---|---|---|---|
| π | Timeline | A reality β the main universe, or a parallel one | β Yes |
| π§΅ | Flow | A lane inside a timeline, usually one character's thread. Lanes cross, merge, and split again | β Yes |
| π | Version | A draft of one note. Carries its own time, flow and connections | β An authoring tool |
| π¦ | Status | draft Β· 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.
| πΏ | Branching canvas | Time across the x axis, flows as lanes, next/prev drawn as curves |
| π | Versions that reshape the story | Each draft carries its own time, flow and connections |
| π | Version sets | Flip a whole story revision back and forth in one move |
| π | Your own time system | Any unit, any epoch, optional mapping to Earth years |
| ποΈ | Types and entities | Characters, species, places, factions, objects, events β defined in a note, not in code |
| βοΈ | Laws | Universe physics and the entities that break them, linked both ways |
| π‘ | Drafts you can promote | A shelf for homeless ideas, turned into real notes when they earn it |
| π§ | Navigation | A bar under each note showing every place it leads, with a hover map |
| π | Dashboard & consistency | Counts, everything unfinished, and an advisory report |
| π | Search & export | Filter by field, then build one Markdown document from what you choose |
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
- 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.
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.
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 readersDefine the time system 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.
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.
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
βοΈ Universe-wide laws above, entity-specific below β each one showing who is bound and who breaks it
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.
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 | Counts by type, everything unfinished (half-written sorted above untouched), and a consistency report |
| π©Ί | Consistency | Broken 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 |
| π | Search | Filters 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" |
| π€ | Export | One 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 |
Not yet in the community plugin browser. Until then:
- Download
main.js,manifest.jsonandstyles.cssfrom the latest release. - Put them in
<vault>/.obsidian/plugins/lore-creator/. - In Obsidian: Settings β Community plugins, turn off Restricted Mode, then enable Lore Creator.
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 β time system, 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.
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
- New lore note β pick Timeline, name it, give it a
timeline-idsuch asmain, and list its flows. - New lore note β pick Story. In the banner at the top, click the time to
place it, and set
timelineandflowin the properties. - Repeat, linking notes with
next. - Open the timeline from the ribbon.
Standard fields β on every lore note
| Field | Meaning |
|---|---|
type |
Which type this is β the folder is only organisation |
icon / icon-type |
An emoji or a Lucide icon name |
status |
draft Β· partial Β· done |
aliases |
Obsidian's own field; resolves [[Lord Kyle]] to this note |
alias-history |
When and why a name changed |
related |
Free-form links |
π Timeline placement β when a note has one
| Field | Meaning |
|---|---|
timeline |
Which reality it belongs to |
flow |
Which lane |
time |
A single number. Sorting depends only on this. May be empty |
time-precision |
year Β· date Β· datetime |
time-label |
What readers see |
time-end |
Set when this spans a period rather than a moment |
time-uncertain |
Drawn dashed |
earth-time |
Optional reference, computed or written by hand |
next / prev |
Connections. More than one means the story branches |
π Versioning
| Field | Meaning |
|---|---|
version |
v1, v2, β¦ |
version-name |
Optional label, also used in the archive filename |
version-note |
What is different about this draft |
version-of |
Present only on archived versions |
βοΈ Laws and π‘ drafts
| Field | Meaning |
|---|---|
scope |
universe or local |
applies-to / timeline-scope |
Where a law holds. Empty means everywhere |
laws / breaks-law |
Declared on entities; the laws view inverts them |
idea-for |
What a draft is an idea for |
promoted-to / promoted-from |
The two-way link left by a promotion |
| Command | What it does | |
|---|---|---|
| πͺ | Set up this vault | Create folders, templates and the type registry |
| π | New lore note | Create a note from a type's template |
| πͺ | Open timeline / laws / drafts / dashboard | Open a view |
| π | Versions of this note | List, create, switch and archive versions |
| π | Version sets | Capture and apply named snapshots |
| π§ | Go to the next / previous fragment | Follow a connection; asks when there are several |
| π‘ | Promote this draft | Turn a sketch into a real note |
| π | Find in the universe | Search by field rather than by text |
| π€ | Export the universe | Build a single Markdown document |
Every path is configurable; these are the defaults:
| Setting | Default |
|---|---|
| Universe file | Universe.md |
| Type registry | System/Types.md |
| Versions folder | Versions |
| Templates folder | Templates |
| Version sets file | System/Version sets.md |
| Exports folder | Exports |
The time system is 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.
npm install
npm run dev # esbuild watch β rebuilds main.js on save
npm run build # type-check, then produce a minified main.jsThe 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.
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.