Skip to content

Repository files navigation

Lifelong Calendar

Lifelong Calendar icon

Lifelong Calendar is an Obsidian plugin for keeping a date-based timeline of your life inside your vault.

It is designed for people who want to record what they read, learned, built, visited, or experienced on specific dates, while keeping the actual data in Markdown files they control.

The plugin supports:

  • timeline entries stored in your vault as Markdown
  • internal Obsidian note links and external URLs
  • a dedicated timeline view with search and filtering
  • reminder emails for incomplete days
  • grounded AI questions over timeline entries and linked notes

What The Plugin Does

The plugin creates and manages dated timeline entries under a folder in your vault, which defaults to:

Lifelong Calendar/Entries

Each entry is stored as a normal Markdown file with frontmatter and note content. This means:

  • your timeline data remains portable
  • you can inspect and edit entries manually
  • your data is not locked into a proprietary backend

The plugin also offers optional cloud-based reminder support. That part uses a small Cloudflare Worker and D1 database so reminders can still function when Obsidian is closed.

Main Features

  • Dedicated Lifelong Calendar view inside Obsidian
  • Create and edit entries with date, title, category, links, and note
  • Attach internal Obsidian links or external URLs
  • Preview-first workflow from the detail pane
  • Search entries by text
  • Filter by year and category
  • Open a random memory
  • Sync today's completion state to a reminder backend
  • Send reminder emails through Resend
  • Ask grounded AI questions over entries and linked notes

How Entries Are Stored

Each entry is stored as one Markdown file. Filenames are generated from the date and a slug of the title.

Example:

---
lc_id: 123e4567-e89b-12d3-a456-426614174000
date: 2026-03-06
title: Read chapter 1
type: reading
links:
  - "[[Book Notes]]"
  - "https://example.com/article"
created_at: 2026-03-06T20:00:00.000Z
updated_at: 2026-03-06T20:00:00.000Z
---

Short note about the day.

Important behavior:

  • one file per entry
  • unknown frontmatter fields are preserved
  • links may be plain internal paths, wikilinks, Markdown links, or external URLs
  • for reminder purposes, a day is considered complete if at least one timeline entry exists for that date

Installation

This repository contains the plugin source and build output.

To install manually into Obsidian:

  1. Run:
npm install
npm run build
  1. Copy these files into your vault plugin folder:
  • manifest.json
  • main.js
  • styles.css

Target path:

<your-vault>/.obsidian/plugins/lifelong-calendar/
  1. In Obsidian, open Settings -> Community plugins.
  2. Enable Lifelong Calendar.

Community Plugin Release Checklist

If you plan to submit this plugin to the official Obsidian Community Plugins directory, use this checklist:

  1. Keep these files in the root of your GitHub repository:
    • README.md
    • LICENSE
    • manifest.json
    • versions.json
  2. Keep your source code in the repository.
  3. Do not commit main.js to the repository. Generate it only for releases.
  4. Update manifest.json with the release version.
  5. Create a GitHub release whose tag exactly matches the plugin version in manifest.json.
  6. Upload these release assets:
    • main.js
    • manifest.json
    • styles.css
  7. Submit the repository to community-plugins.json in obsidianmd/obsidian-releases.

Notes:

  • versions.json only needs updates when minAppVersion changes.
  • Obsidian Community Plugins currently does not support a custom listing icon through manifest.json.
  • The icon in assets/lifelong-calendar-icon.svg is for repository branding, README display, and other external use.

To generate the exact release assets locally, run:

powershell -ExecutionPolicy Bypass -File .\scripts\prepare-release.ps1

This creates a versioned folder and zip file under release/ containing only:

  • main.js
  • manifest.json
  • styles.css

Basic Usage

Typical usage flow:

  1. Open the command palette.
  2. Run Open Lifelong Calendar.
  3. Create entries for today or any past date.
  4. Attach relevant notes or external links.
  5. Search or filter the timeline later.

You can create entries with:

  • Add Timeline Entry
  • Add Current Note to Timeline
  • Add External Link to Timeline

The entry modal requires:

  • a valid YYYY-MM-DD date
  • a title
  • at least one link or a note

Commands

The plugin currently provides these commands:

  • Open Lifelong Calendar
  • Add Timeline Entry
  • Add Current Note to Timeline
  • Add External Link to Timeline
  • Open Random Memory
  • Ask Lifelong Calendar
  • Sync Today's Reminder Status
  • Send Test Reminder Email

Settings

General

  • Entries folder: folder where timeline entry Markdown files are stored
  • Default categories: comma-separated category suggestions in the entry modal
  • Open internal links in new tab: open internal note links in a new leaf

Reminder Cloud

  • Backend URL: deployed Cloudflare Worker URL
  • Backend token: shared bearer token used by the plugin
  • Reminder email: address that receives reminder emails
  • Reminder timezone: timezone used to determine the current day
  • Reminder time: daily reminder time in HH:MM format
  • Enable reminders: enables completion sync

Reminder action buttons:

  • Save config: sends reminder settings to the backend
  • Sync today: sends today's completion state to the backend
  • Test email: sends a test reminder email

AI Chat

  • Provider: OpenAI, Groq, Gemini, Ollama, or Custom OpenAI-compatible
  • API key: required for cloud providers
  • Base URL: optional override, required for custom endpoints
  • Model: model name
  • Max retrieved chunks: number of local sources sent to the model

Reminder System Overview

The reminder system is optional.

When configured, the plugin syncs whether today is complete to a small backend. That backend can send reminder emails even when Obsidian is closed.

The backend stores:

  • reminder email
  • reminder time
  • reminder timezone
  • reminder completion state
  • reminder delivery records

The backend does not store:

  • your vault
  • your Markdown files
  • the full contents of your timeline entries for reminder purposes
  • your AI chat answers

Reminder behavior:

  • a day is complete if your timeline contains at least one entry for that date
  • the plugin syncs today's completion automatically when relevant entry files change
  • completion from Obsidian and web check-in is merged per source instead of blindly overwriting
  • email links do not mutate reminder state on GET
  • the email check-in flow requires an explicit confirmation POST

Reminder Setup

The reminder system is optional and sends daily emails when you haven't logged an entry.

Quick Setup (Recommended)

  1. Get a Resend API key at resend.com/api-keys

  2. Run the setup script:

    npm run setup-reminder
  3. Copy the Worker URL shown at the end of the script

  4. Configure in Obsidian:

    • Settings → Lifelong Calendar → Reminder Cloud
    • Set Backend URL to your Worker URL
    • Set Backend token to the AUTH_TOKEN shown
    • Set Reminder email, Reminder timezone, Reminder time
    • Enable Enable reminders
    • Click Save configSync todayTest email

See backend/README.md for detailed instructions.

Manual Setup

If you prefer to set up manually, see backend/README.md.

AI Chat Setup

The AI feature is optional.

Ask Lifelong Calendar searches your timeline entries and linked internal notes, then sends the top retrieved chunks to the configured model.

Recommended setup options

Option A: OpenAI

  • Provider: OpenAI
  • API key: your OpenAI API key
  • Base URL: leave blank
  • Model: a valid model such as gpt-4.1-mini

Option B: Gemini

If you use the built-in Gemini provider:

  • Provider: Gemini
  • API key: your Gemini API key
  • Base URL: leave blank
  • Model: use a valid Gemini model

Important:

  • do not set the Gemini Base URL to the OpenAI-compatible Gemini endpoint when using Provider = Gemini
  • the built-in Gemini provider in this plugin uses the native generateContent API

If you specifically want the OpenAI-compatible Gemini endpoint:

  • set Provider to Custom OpenAI-compatible
  • set Base URL to the Gemini OpenAI-compatible root URL
  • use a valid Gemini-compatible model name

Option C: Ollama

  • Provider: Ollama
  • Base URL: http://localhost:11434
  • Model: a locally available Ollama model

AI Behavior Notes

  • retrieval is currently lexical, not embedding-based
  • citations are shown only when the model returns valid grounded citation IDs
  • if a model returns malformed JSON or plain text, the answer may still display without citations

Troubleshooting AI

If Ask Lifelong Calendar says Failed to fetch, the most common reasons are:

  • wrong provider selected
  • wrong base URL
  • local Ollama server not running
  • invalid endpoint path
  • network or firewall issue

For example:

  • if Provider = Gemini, leave Base URL blank
  • if using a custom OpenAI-compatible endpoint, set Base URL to the API root, not /chat/completions

Data Ownership

Your actual timeline data stays in your vault as Markdown files.

That means:

  • you can inspect entries manually
  • you can back them up normally with your vault
  • the plugin can rebuild its index from stored files

Limitations

  • reminder emails require your own Cloudflare and Resend setup
  • AI chat requires your own provider configuration
  • retrieval is lexical only for now
  • reminder completeness is currently based on whether at least one entry exists for that date

Development

Install dependencies:

npm install

Type-check the plugin:

npm run check

Build the plugin:

npm run build

Validate the Worker syntax:

node --check backend/worker.mjs

Project Structure

Current State

The project currently includes:

  • a working Obsidian timeline plugin
  • Markdown-backed entry storage
  • a deployable reminder backend
  • AI retrieval and grounded-answer foundation

The remaining work is mostly product polish, deployment testing, and retrieval improvements.

About

A plugin for obsidian which is meant for tracking your lifetime calendar.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages