Matthew Newton21 downloadsManage quotes from your vault, generates a word of the day, this-day-in-history, word-of-the-day recaps, daily featured wikipedia article, on-this-day for your vault, reflection prompts, and more.
An Obsidian community plugin that turns your daily note into a small-but-rich daily ritual.
Upgrading from Muse or Almanac (pre-release)? Install this plugin as Clio (
clio). Existingmuse-quote,almanac-quote,muse-static, andalmanac-staticblocks still work; new quotes useclio-quote. Copyplugins/muse/data.jsonorplugins/almanac/data.jsontoplugins/clio/data.jsonif you had an older folder installed separately.
A daily ritual in your notes: a quote from your own vault, a word of the day with definition and examples, on this day in history (and optionally in your own vault), today's Wikipedia featured article and picture of the day, a reflection prompt, a one-line journal, daily intentions with streak tracking, and a sky card with the moon phase plus sunrise / sunset.
Quote of the day (from your vault):

Word of the day with definition and examples:

Today's Wikipedia featured article (text excerpt):

Reflection prompt of the day:

One-line journal:

Sky today (moon phase and sunrise / sunset):

clio-quote code blocks (the canonical, opt-in format) and, optionally, markdown blockquotes / Obsidian [!quote] callouts.quote-of-the-day code block, ideal for daily-note templates.philosophy or programming.clio-quote blocks - editable like any other note, and immune to false positives from prose blockquotes.word-of-the-day code block.word-recap block renders a flashcard-style list: word + part-of-speech, with the definition hidden until you click Reveal.on-this-day code block (or the legacy fact-of-the-day alias).featured-article code block.vault-on-this-day code block. Configure your daily-notes folder and filename format in settings.prompt-of-the-day code block.one-line-journal code block.daily-intentions code block renders them as checkboxes inside any note.sky-today code block. Never makes a network call.Drop these into your daily-note template:
## Quote of the day
```quote-of-the-day
```
## Word of the day
```word-of-the-day
```
## On this day
```on-this-day
```
## Today's featured article
```featured-article
```
## On this day in your vault
```vault-on-this-day
```
## Reflection
```prompt-of-the-day
```
## One-line journal
```one-line-journal
```
## Sky today
```sky-today
```
## Today's intentions
```daily-intentions
```
## Word recap
```word-recap
limit: 7
```
Every block is opt-in: just include the ones you want.
```quote-of-the-day
mode: daily
tags: philosophy, ethics
```
mode: daily (default) - same quote all day. mode: random re-rolls every render.tags: a, b - require the quote to have all listed tags.A random-quote block is also available as a shorthand for mode: random.
To drop a self-contained quote anywhere in your notes (rendered as a card, indexed for the daily picker):
```clio-quote
quote: Make new mistakes.
author: Esther Dyson
tags: productivity
```
See Quote source format for the full field list.
```daily-intentions
date: 2026-01-15
stats-days: 30
```
date: YYYY-MM-DD - render the checklist for a specific day instead of today (useful for backfilling).stats-days: N - completion-rate window for the footer. Default 7, max 365.```one-line-journal
date: 2026-01-15
across-years: true
```
date: YYYY-MM-DD - edit the entry for a specific day. Defaults to today.across-years: true|false - show / hide entries from the same calendar day in past years. Defaults to true.```word-recap
limit: 14
reveal: false
```
limit: N - how many recent entries to show. Default 7, max 30.reveal: true - show all definitions immediately instead of behind a "Reveal" button.| Command | What it does |
|---|---|
| Add quote | Open the modal to capture a new quote. |
| Open quote library | Open the sidebar view listing every quote. |
| Insert quote of the day | Inserts today's quote at the cursor as a blockquote. |
| Insert random quote | Inserts a random quote at the cursor. |
| Insert quote-of-the-day block | Drops a quote-of-the-day code block. |
| Insert blank quote block | Drops a blank clio-quote block, ready to paste a quote into. |
| Insert word-of-the-day block | Drops a word-of-the-day code block. |
| Insert on-this-day block | Drops an on-this-day code block. |
| Insert featured article block | Drops a featured-article code block. |
| Insert vault on-this-day block | Drops a vault-on-this-day code block. |
| Insert reflection-prompt block | Drops a prompt-of-the-day code block. |
| Insert one-line journal block | Drops a one-line-journal code block. |
| Insert sky-today block | Drops a sky-today code block. |
| Insert word-recap block | Drops a word-recap code block. |
| Insert daily intentions block | Drops a daily-intentions code block. |
| Copy quote of the day to clipboard | Quick one-liner with attribution. |
| Copy on-this-day event to clipboard | Plain text + Wikipedia link. |
| Reroll word of the day | Pick a different word for today (no dismissal). |
| Skip today's word | Dismiss the current word and pick a new one. |
| Show a different on-this-day event | Cycle through today's cached events. |
| Skip today's on-this-day event | Dismiss the current event and pick a new one. |
| Show a different reflection prompt | Re-pick today's prompt. |
| Skip today's reflection prompt | Dismiss the prompt and pick a new one. |
| Refresh quote index | Re-scan the configured folders. |
| Convert blockquote quotes to structured blocks | Walks every blockquote / quote callout in scope - and every clio-quote block whose quote: field still has inline attribution - and lets you confirm one-at-a-time whether to migrate it. |
| Complete all of today's intentions | One-shot mark-everything-done. |
The recommended format is a clio-quote code block. It's explicit, immune to false positives, and renders as a styled card in reading mode:
```clio-quote
quote: Of all people only those are at leisure who make time for philosophy, only they truly live.
author: Seneca
source: On the Shortness of Life
tags: stoicism, time
```
Field rules:
quote: is the only required field.key: are appended to the previous field's value, so you can soft-wrap long quotes.tags: is comma-separated. The # prefix is optional.# are treated as comments.Migrating existing quotes: run Convert blockquote quotes to structured blocks from the command palette. It walks every candidate one at a time, shows you the original, lets you edit the auto-detected author / source / tags, and previews the proposed clio-quote replacement live. Stop any time - already-converted quotes stay converted.
The migration covers two cases:
[!quote] callouts that haven't been structured yet.clio-quote blocks whose quote: field still contains inline attribution like quote: "..." — Seneca. The tool offers to split the author (and source, if you wrote Author, Source) into their own fields.For false positives in a blockquote (e.g. a > SFP = 1G world technical aside), click Mark as not a quote. That appends an invisible %%clio:ignore%% marker so Clio permanently skips it - both the migration tool and the daily / random pickers respect the marker. Any line containing the substring clio:ignore works (e.g. <!-- clio:ignore --> if you'd rather use an HTML comment).
For an already-structured clio-quote block you'd rather leave alone (e.g. you intentionally kept the attribution inline), click Keep as is. That inserts a # clio:keep comment line right after the opening fence so the migration tool stops flagging it. The block is still indexed as a quote.
To reverse either marker, just delete it from the source.
If you'd rather keep using markdown blockquotes / [!quote] callouts, switch Settings → Clio → Quote source away from "clio-quote blocks only". Attribution still works - if the last non-empty line begins with —, –, --, - (followed by a space), or by, it's parsed as the author (anything after the first comma becomes the source):
> The unexamined life is not worth living.
> — Socrates, Plato's Apology
> [!quote] Maxim
> Make new mistakes. #productivity
Inline #tags on quote lines are extracted and stored on the quote.
Available in Settings → Community plugins → Clio.
Fetch events online switch, on-this-day dismissals, featured-article toggle (text-only).The plugin exposes an API at app.plugins.plugins["clio"].api. Every daily card has a matching *Markdown() helper that returns a self-contained, static markdown snapshot - perfect for Templater dropping the day's value into a daily note (it won't change tomorrow, since the markdown is baked into the file).
Each helper emits a clio-static code block with the day's data baked in as YAML. The plugin renders these blocks using the same DOM and CSS classes as the live quote-of-the-day / word-of-the-day / etc. codeblock cards, so the drop looks identical to the live block - except the data is frozen in your daily note forever. Reopen the same note tomorrow and you'll see the same word/quote/fact you saw the day you wrote it. Live-state-only controls (Skip, Show different) are omitted; "Copy" buttons and external "Read more" links are kept since they only need the baked data. The codeblock language is unique to static drops, so the indexer never picks them up - your daily-note quote won't show up as a duplicate in the quote library, and you don't need any extra ignore marker.
Drop everything you want with one block:
<%*
const clio = app.plugins.plugins["clio"]?.api;
tR += clio?.getQuoteOfTheDayMarkdown() ?? "";
tR += await clio?.getWordOfTheDayMarkdown() ?? "";
tR += await clio?.getFactOfTheDayMarkdown() ?? "";
tR += await clio?.getFeaturedArticleMarkdown() ?? "";
tR += await clio?.getPromptOfTheDayMarkdown() ?? "";
tR += clio?.getIntentionsMarkdown() ?? "";
tR += clio?.getJournalAcrossYearsMarkdown() ?? "";
%>
Each helper returns "" when there's nothing to show (feature disabled, fetch failed, no data) so the ?? "" guard never throws.
API surface:
getQuoteOfTheDay(): Quote | nullgetRandomQuote(): Quote | nullgetQuoteOfTheDayMarkdown(): stringgetRandomQuoteMarkdown(): stringgetWordOfTheDay(): Promise<DailyWordRecord>getWordOfTheDayMarkdown(): Promise<string>getRecentWords(limit?): WordHistoryEntry[]getFactOfTheDay(): Promise<DailyFactRecord>getFactOfTheDayMarkdown(): Promise<string>getFeaturedArticle(): Promise<FeaturedArticleRecord> (text only - no image)getFeaturedArticleMarkdown(): Promise<string>getPromptOfTheDay(): Promise<DailyPromptRecord>getPromptOfTheDayMarkdown(): Promise<string>getJournalEntry(date?): stringsetJournalEntry(text, date?): Promise<void>getJournalAcrossYears(): { date, year, yearsAgo, text }[]getJournalAcrossYearsMarkdown(): stringrefreshQuotes(): Promise<void>getIntentions(): Intention[]getIntentionsMarkdown(): stringgetIntentionsForDate(date?): IntentionStatus[]setIntentionDone(id, done, date?): Promise<void>getIntentionStreak(id, date?): numberClio makes only two kinds of network request, both to free, unauthenticated public APIs, and only when the corresponding feature is enabled:
GET https://api.dictionaryapi.dev/api/v2/entries/en/<word> to look up the daily word's definition.GET https://api.wikimedia.org/feed/v1/wikipedia/en/featured/<YYYY>/<MM>/<DD> to fetch Wikipedia's curated featured-content payload (on this day + today's featured article text). Both Wikipedia cards share this single request - one fetch per local day at most. The full payload is cached locally so re-rolls and skips never trigger another network call. The endpoint also returns Wikipedia's "picture of the day" and the featured article's lead image; the plugin deliberately ignores both and never displays any image from Wikipedia, since their daily images can include sensitive content without warning.Both responses are cached locally in data.json and re-used for the rest of the day. To run fully offline, turn off Fetch definitions online and Fetch events online in settings - the plugin will keep working with the offline word list, your own quotes, intentions, prompts, journal, sky card, and vault on-this-day.
No vault contents, file paths, or personal information are ever sent to either service. The sky card runs entirely locally - your country / region pick (and the derived coordinates) are stored in data.json and never leave the device. The vault on-this-day card reads daily notes from disk only; nothing is uploaded.
Requests carry only a generic User-Agent: clio (Obsidian community plugin) header.
npm install
npm run dev # watch build
npm run build # production build (also runs tsc check)
npm run lint # eslint
Output is written to main.js at the plugin root.
This plugin is released under the GNU General Public License v3.0 or later. See LICENSE for the full text.