Surfacing Forgotten Covers with Obsidian

The Problem

I've got over 200 cover songs saved in my Obsidian vault. Chord sheets, lyrics, notes on arrangement. The problem is obvious: most of them just sit there, untouched. I forget what I know. Songs I used to play well drift into obscurity while I keep returning to the same comfortable handful.


What I needed was something to surface forgotten material. Not a todo list (too rigid), not random chance (too chaotic), but a system that quietly reminds me: "Hey, you haven't played this in a while."


The Solution: Obsidian Bases

Obsidian recently released a core plugin called Bases. It's essentially a query language for your vault - you can filter, sort, and display notes based on their properties and metadata. Think of it like a database view over your markdown files.


I built a base that tracks when I last practiced each cover, and surfaces the ones I've neglected. It embeds in my daily note, so every morning I see three songs I haven't touched in over 30 days.


How It Works

Each cover file has frontmatter with three properties:

1---
2lastPracticed: 2026-01-04
3snoozedUntil:
4retired: false
5---
  • lastPracticed: Date I last practiced this song
  • snoozedUntil: If I don't fancy it today, snooze until this date
  • retired: Songs I never want to see again

The base queries all files in my Covers folder and filters based on these properties. The "Daily Picks" view shows the 3 oldest untouched songs, excluding anything retired or snoozed.


Setting It Up Yourself

If you want to build something similar, here's how.


1. Enable Bases

Bases is a core plugin in Obsidian 1.9+. Go to Settings → Core plugins → Enable "Bases".


2. Add Frontmatter to Your Files

Your cover files need frontmatter with the tracking properties. You can add them manually or run a script to add empty frontmatter to all files at once.


3. Set Property Types

In Obsidian, property types determine how fields are edited. Add these to your .obsidian/types.json:

1{
2"types": {
3  "lastPracticed": "date",
4  "snoozedUntil": "date",
5  "retired": "checkbox"
6}
7}

This gives you a date picker for dates and a toggle for retired - no typing, no format confusion.


4. Create the Base

Create a .base file (or use a code block in a note). Here's a simplified version:

1filters:
2and:
3  - file.inFolder("Covers")
4  - file.ext == "md"
5
6views:
7- type: list
8  name: Daily Picks
9  filters:
10    and:
11      - file.mtime < now() - "30d"
12      - retired != true
13  sort:
14    - property: file.mtime
15      direction: ASC
16  limit: 3
17  markers: none

This shows the 3 oldest files (by modification time) that aren't retired.


5. Embed in Your Daily Note

Add this to your daily note template:

1## Practice Something Forgotten
2![[YourBase.base#Daily Picks]]

Now every day you'll see three forgotten songs waiting for attention.


The Workflow

When a song surfaces:

  1. Practice it → Set lastPracticed to today (click the date picker)
  2. Not today → Set snoozedUntil to next week
  3. Never again → Toggle retired to true

The system respects your choices. Practiced songs drop off the list. Snoozed songs reappear when ready. Retired songs disappear forever (unless you unretire them).


Why This Works For Me

It's low friction. I don't have to remember to review my repertoire - it surfaces automatically. I don't have to make decisions about what to practice - something is suggested. And I can dismiss suggestions easily without guilt.


The 30-day threshold is arbitrary but feels right. Long enough that I'm not seeing the same songs constantly, short enough that skills don't completely atrophy.


Gotchas

A few things I learned building this:

  • Filtering on formula values doesn't work in Bases. Use date arithmetic directly: file.mtime < now() - "30d" instead of referencing a calculated field.
  • File modification time resets when you sync or migrate your vault. I'm gradually adding explicit lastPracticed dates to get accurate tracking.
  • Obsidian needs to know property types for the nice UI. Without types.json entries, you get text fields instead of date pickers.

What's Next

I'm considering adding more properties: instrument, difficulty, key. You could then filter for specific contexts - piano songs for a gig, or everything in a particular key if you're working on transposition. But for now, the simple version is working well enough that I'm actually practicing more variety.


That's the goal, right? Not a perfect system, but one that gets me playing.