Owais Sadiqque Dayderh16 downloadsA tiny calendar for events that run until you say they're done, linked to your notes.
A tiny calendar for Obsidian that tracks events which stay open until you say they're done — instead of every event needing a fixed end date up front.
Every event is just frontmatter on a real note in your vault. Start something today, keep working on the note, and its bar on the calendar keeps growing day by day until you explicitly end it. No recurrence, no reminders, no external sync — just a lightweight, note-linked way to see what's currently in progress.
Most calendar plugins assume you know when something ends before it starts. tinyCal is built around the opposite case: ongoing work — a project, a trip, a "currently reading" — where the end date is the last thing you know, not the first. Ending an event is a deliberate action from the calendar UI, not something you have to remember to type into the note.
Every event is plain frontmatter on a note — nothing is stored outside your vault:
---
tinycal-id: "20260723a1b2" # generated once, identifies the event
tinycal-start: "2026-07-23" # YYYY-MM-DD
tinycal-end: null # YYYY-MM-DD, or absent/null = still open
tinycal-tag: "work" # optional, free-text
---
tinycal-id is what makes a note "an event" to tinyCal — a note without it is invisible to the plugin, and any note can only be linked to one event. Dates are plain YYYY-MM-DD strings with no time component.
tinyCal isn't yet on the Community Plugins list. Until then, install manually:
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/tinycal/ and place those three files inside it.tinyCal is desktop-only.
git clone https://github.com/owais-sadiqque-dayderh/tinycal.git
cd tinycal
npm install
npm run dev # esbuild in watch mode, rebuilds main.js on save
npm run build # type-checks (tsc --noEmit) then produces a production build
npm run test # runs the Vitest unit test suite
Tests cover the pure logic modules (src/events/eventLogic.ts, src/view/dateUtils.ts, src/view/colorUtils.ts) — date-range math, event status/lane assignment, and color resolution. UI code (views, modals) is verified manually against a real vault, since it depends on the Obsidian API.
Symlink (or copy) the repo's build output into a test vault's plugin folder so npm run dev rebuilds are picked up live:
mkdir -p /path/to/test-vault/.obsidian/plugins/tinycal
ln -s "$(pwd)/main.js" "$(pwd)/manifest.json" "$(pwd)/styles.css" /path/to/test-vault/.obsidian/plugins/tinycal/
Then in Obsidian, enable tinyCal under Settings → Community plugins, and use Ctrl/Cmd+R to reload the app after each rebuild (or install the Hot-Reload plugin to skip manual reloads).
src/
main.ts # Plugin class: onload/onunload, commands, settings wiring
settings.ts # TinyCalSettings, DEFAULT_SETTINGS, TinyCalSettingTab
types.ts # TinyCalEvent, frontmatter field name constants
events/
eventIndex.ts # in-memory event index, built from vault scan + metadataCache
eventStore.ts # create/link/end event — all frontmatter read/write logic
eventLogic.ts # pure logic: status, lanes, date-range overlap (unit tested)
view/
calendarView.ts # ItemView subclass
monthGrid.ts / weekGrid.ts # grid layout for each view mode
dayRow.ts # shared per-week event rendering (pill + line + lanes)
dateUtils.ts # month/week range math (unit tested)
colorUtils.ts # tag-color resolution + contrast text color (unit tested)
modals/
newEventModal.ts # calendar-first creation (new note or link existing)
startEventModal.ts # note-first creation
endEventModal.ts # "end on a specific date"
noteSuggestModal.ts # FuzzySuggestModal over notes without an existing tinycal-id
suggest/
folderSuggest.ts # AbstractInputSuggest for vault folder autocomplete
tagSuggest.ts # AbstractInputSuggest for known-tag autocomplete
styles.css
manifest.json
versions.json
npm version <patch|minor|major> # bumps package.json, runs version-bump.mjs (manifest.json + versions.json)
Then tag a GitHub release with main.js, manifest.json, and styles.css attached, per Obsidian's release format.
Issues and PRs are welcome. Before opening a PR, please run npm run build and npm run test and make sure both pass.
Recurring events, reminders/notifications, mobile support, external calendar sync (ICS/CalDAV), time-tracking, multiple events per note, and Tasks-plugin interoperability are intentionally not part of tinyCal — see brainstorm.md for the reasoning.