TTRPG Tools - Time is an Obsidian plugin for fantasy calendars, event tracking, moons, seasons, generated weather, timeline views, embedded timelines, and lightweight in-world time control for tabletop RPG campaigns and worldbuilding.
This plugin is still an early release. Expect rough edges, ongoing UI changes, and data formats that may still evolve.
The control pane provides quick actions in a compact one-column button list.
Current actions:
It can also show a fantasy-time section with custom time-advance buttons if configured in plugin settings.
The control pane can open a modal that generates a timeline embed block for the current note.
Configurable options:
jumpTo: todayThe generated YAML block is inserted into the last known Markdown editor cursor position.
The plugin can store a lightweight internal fantasy time in plugin data.
This is intended as a lightweight in-world time tracker, not yet a full simulation system.
All plugin data is stored as JSON files inside your vault, so it can be inspected, backed up, and version-controlled.
Build or download the plugin files.
Create this folder inside your vault:
.obsidian/plugins/ttrpg-tools-time
Copy these files into that folder:
main.js
styles.css
manifest.json
Open Obsidian.
Go to Settings → Community plugins.
Disable Restricted mode if required.
Enable TTRPG Tools - Time.
Install dependencies:
npm install
Development build / watch mode:
npm run dev
Production build:
npm run build
Lint:
npm run lint
Auto-fix lint issues:
npm run lint:fix
By default, plugin data is stored in:
TTRPG/Time
The data folder can be changed in plugin settings.
Typical subfolders include:
TTRPG/Time/calendars
TTRPG/Time/tag-packs
TTRPG/Time/weather-packs
TTRPG/Time/weather-reference
TTRPG/Time/weather-dayview
TTRPG/Time/event-details
TTRPG/Time/event-index
TTRPG/Time/event-presets
Plugin-level settings and fantasy-time state are stored in the plugin data JSON via Obsidian’s plugin storage.
Available ribbons / commands include:
Tag packs are used for event categorization and timeline filtering.
Use:
Weather packs define climate behavior and weather generation.
Use:
The control pane is meant as a quick-access side pane.
Typical workflow:
If fantasy-time buttons are configured and the active calendar has a time system enabled, the control pane also shows the current in-world time and your configured time-advance buttons.
The plugin includes a standalone timeline view that reads events from the active calendar.
Features:
The filter pane shows tags from the active calendar’s linked tag packs.
Interaction:
The plugin can render timelines directly in Markdown via code blocks.
```time-timeline-cal
title: Campaign Timeline
calendars:
- my-calendar
includeTags:
- history
- travel
excludeTags:
- spoiler
jumpTo: today
```
```time-timeline-h
title: Travel Log
calendar: my-calendar
includeTags:
- travel
excludeTags:
- downtime
jumpTo: today
mode: mixed
align: left
maxSummaryLines: 7
cardWidth: 200
cardHeight: 315
boxHeight: 289
sideGapLeft: 40
sideGapRight: 40
```
title
Optional title above the embed
calendar / calendars
One or more calendar ids
includeTags
Tags to include
excludeTags
Tags to exclude
jumpTo: today
Shows a Today button in the embed
mode
Horizontal only:
mixedstackedalign
leftrightmaxSummaryLines
cardWidth
cardHeight
boxHeight
sideGapLeft
sideGapRight
Tag filters accept either:
full tag refs like:
locations:city
or short tag ids like:
city
If you want precise control, prefer full packId:tagId references.
Eras define labeled historical periods.
Each era has:
Leap rules can insert extra month blocks or extra day blocks into matching years.
Each rule has:
Example:
44This means the leap rule triggers every fourth year.
Named days are one-day calendar entries that exist outside normal months. They are useful for feast days, year-end days, epagomenal days, and special leap days such as the Shire calendar's Overlithe.
Each named day supports:
Named days that participate in weekday progression can be rendered directly in an adjacent month grid. They use the holiday gradient and show an icon or image instead of a day number.
For example, Shire-style Lithe days can be configured like this:
End of previous monthStandalone card, No weekdayStart of next monthExample: Shire-style named days:
{
"intercalaryDays": [
{
"id": "second-yule",
"name": "2 Yule",
"insertAfterMonthIndex": -1,
"displayPosition": "standalone",
"order": 10,
"weekdayMode": "none",
"cycleYears": 1,
"activeYearPositions": [1],
"skipYearsDivisibleBy": []
},
{
"id": "first-lithe",
"name": "1 Lithe",
"insertAfterMonthIndex": 5,
"displayPosition": "after-previous-month",
"order": 10,
"weekdayMode": "normal",
"cycleYears": 1,
"activeYearPositions": [1],
"skipYearsDivisibleBy": []
},
{
"id": "overlithe",
"name": "Overlithe",
"insertAfterMonthIndex": 5,
"displayPosition": "standalone",
"order": 30,
"weekdayMode": "none",
"cycleYears": 4,
"activeYearPositions": [4],
"skipYearsDivisibleBy": [100]
}
]
}
skipYearsDivisibleBy: [100] means that a day active every fourth year is
suppressed in years 100, 200, 300, and so on.
Calendars can map climate/weather in two ways.
Weather follows the actual calendar year and month structure, including leap months and leap day blocks.
Weather follows a separate fixed-length climate year.
This is useful if your calendar structure and your climate cycle should not match exactly.
Moons support two anchors:
Moon phase is based on absolute day count.
Moon phase starts over at the beginning of each month.
A calendar can enable exact time with:
This is used for:
Weather is generated from a weather pack.
A weather pack does not directly assign one fixed weather type to each day. Instead, it defines climate tendencies and instability values that are used to generate daily results.
These values define the overall regional climate:
temperatureMin / temperatureMax
Overall annual temperature range
humidity
General air moisture
precipitation
General tendency toward wet weather
storminess
Likelihood of strong storm fronts and thunderstorms
cloudiness
General amount of cloud cover
fogginess
Tendency toward mist and fog
windiness
General wind strength tendency
seasonality
Strength of temperature shifts across the year
frontFrequency
How often unstable weather fronts appear
frontStrength
How strong those fronts are
volatility
How changeable the weather is overall
stableSpanMin / stableSpanMax
Typical duration of stable weather phases in days
frontSpanMin / frontSpanMax
Typical duration of front-driven weather phases in days
snowTemperature
Threshold below which precipitation may turn into snow, sleet, flurries, or blizzard conditions
Each month can define its own baseline values:
temperatureOffsethumidityprecipitationcloudinessfogginesswindinessfrontBiasThese values are interpolated across the year to shape seasonal weather behavior.
Before a visible weather result is chosen, the generator first selects an internal phase:
clearcloudywet-frontstorm-frontfog-banksnow-frontwarm-spellcold-snapThese phases influence:
The generator then resolves the final visible day result into one of these conditions:
clearmostly-clearpartly-cloudyscattered-cloudsbroken-cloudsovercastmistfogdrizzlerainheavy-rainthunderstormsleetflurriessnowblizzardCloud-based weather is mainly driven by:
Lower cloud cover tends toward:
clearmostly-clearpartly-cloudyHigher cloud cover tends toward:
scattered-cloudsbroken-cloudsovercastMist and fog are mainly influenced by:
fog-bank phaseHigher fogginess increases the chance of mist and fog.
Wet weather is mainly influenced by:
Typical progression:
drizzlerainheavy-rainThunderstorms are mainly influenced by:
Higher storminess makes thunderstorm results more likely.
Winter precipitation depends on:
snowTemperatureTypical progression:
sleetflurriessnowblizzardThe settings tab lets you manage:
You can configure custom buttons for the control pane.
Each button can define:
Examples:
+8h+10h+30mLong RestTravel WatchIf no time buttons are configured, the fantasy-time section is hidden from the control pane.
The plugin currently registers commands for:
This plugin is made for campaign management and fantasy worldbuilding.
It does not try to model real-world astronomy or meteorology exactly. You can use realistic values if you want, but the plugin is optimized for useful, configurable game-facing results rather than scientific simulation.
MIT