Obsidian Bases — What are they good for (And what are they not?)
When I first downloaded the Dataview plugin, I wasn’t sure what I wanted to do with it. Last year I wrote a blog post with a few simple examples. Since then, my ambitions have only grown as a way to run simple dynamic apps on my phone locally and offline.
A few of these microapps have taken the form of a pseudo-spreadsheet. But my data is taking the form of an array of arrays in a Javascript execution environment which isn’t actually that useful to modify. I don’t like typing code on my phone. But there’s still value in having a spreadsheet I can read and change.
So that’s why I was really excited for Bases, which at first glance is a sort of Obsidian take on a spreadsheet system. When version 1.9.X was made available last week, I was excited to dive in and see what I could do with it. As the excitement of the week has settled, I’ve come to a more balanced understanding of where it works for me and where it doesn’t. Below are three of my use cases.
Sci-Fi Writing
I write sci-fi short stories, one or two a week, and I’ve been trying manage the pipeline of writing: idea to draft to polished to scheduled to published.
At this moment, I have a little over 200 ideas in a list. I have about a hundred that are in drafts and roughly twenty that are polished and ready to publish. It’s a lot to manage and so I want a good way to manage all of this.
To accomplish this, I had an array of arrays where I could put in all kinds of useful information like the state, date of publication, a category, and others.
window.stories = [
'[[Glass Italian]],done,2025-06-01,2025-06-01,2025-07-03,,#bio',
'[[Sweetest Tooth]],done,2025-06-01,2025-06-01,2025-07-10,,#health',
'[[Blizzard Machine]],done,2025-06-01,2025-06-01,2025-07-17,,#energy',
'[[Mayor Kung-Fu]],done,2025-04-01,2025-04-01,,,#society',
'[[Cat Betrayal]],done,2025-04-01,2025-04-01,2025-07-29,,#future',
'[[Tariffs on Emails]],done,2025-04-01,2025-04-01,2025-07-31,,#society',
'[[State Fair Cultivated Meat]],done,2025-04-01,2025-04-01,,,#bio',
'[[Deepfaked by the Police]],done,2025-04-01,2025-04-01,2025-08-07,,#society',
// ...
];
dv.table(
['Story', 'State', 'Scheduled', 'Tag'],
stories.map(x => {
let [title, state, start, end, scheduled, count, tag] = x.split(',')
return [
`${title} ${count ?? ''}`,
`${state ?? 'Edit'}`,
`${scheduled ?? '--'}`,
`${cate ?? '--'}`,
]
})
)This in turn is used to generate a table where I can see each story and figure out where things are (and figure out what I want to do next). The title of each story is also wrapped in double brackets because each points to its own file. I keep my stories in Obsidian too so they’re easily accessible on all of my devices.
Obsidian Bases is not a regular spreadsheet in the way I originally imagined. Instead it gives you a table of all your files, with each file being a row. The columns are the frontmatter you define in each file.
Up to this point, I hadn’t put any frontmatter in the files. Every property was just placed in my one big file. But Obsidian Bases doesn’t like that. It wants frontmatter in every file.
So that’s what I did. You can see here where I opened each file, inserted the properties. As I migrated each one, I saw it appear to my Base on the right-hand side.
Since the frontmatter is still accessible with Dataview, I can still maintain custom tables to show various kinds of slices of data.
const tagmap = {}
const _stories = dv.pages().where(p => p.status === "Done" && p.schedule >= new Date('2025-01-01') && p.schedule <= new Date('2025-12-31'))
console.log(_stories)
_stories.forEach(x => {
const tag = x.category
const tagkey = tag ?? 'uncategorized'
if (tagmap[tag]) { tagmap[tag]++ }
else { tagmap[tag] = 1 }
})
tagmap['Total'] = _stories.length
dv.table(
['Category', 'Count'],
Object.entries(tagmap)
)Overall I’m quite happy with how this turned out. The Base loads well on my phone. I can use sorting to get the exact order I want, and if I edit a cell in the Base it mirrors that change in the underlying file.
Pokémon Cards
Tracking my Pokémon card collection, and planning which ones I should buy next, was developed originally as a map of key-value pairs in the frontmatter of a single file. The key was the title of the set and the value was a comma-separated array of its various subproperties.
---
Base: BS,1,87,102
Jungle: JU,1,46,64
Fossil: FU,1,46,62
Base Set 2: B2,1,27,130
Team Rocket: TR,1,32,83
Gym Heroes: G1,1,44,132
Gym Challenge: G2,1,34,132
...
---This was actually a lot harder to migrate. As I did not already have files for each of the ~150 sets, I had to create new ones and populate all of this information in frontmatter. Additionally, the order of each set is not well-defined here. As such, I had to add another field for the release date.
Obsidian Bases also allow you to add custom properties, formulas which run in the context of the base using existing frontmatter. For instace, the Distance field here is defined as the percent complete to the second power. I’ve been using this field to help me understand the sets that I should really focus on completing. But that’s just one of the many kinds of formulas which could be added here.
Here, Obsidian Bases actually helps me out. It’s definitely easier to maintain using a table and individual cells than mucking around and making sure the commas are in the right place. It was a bit tedious to add all the new files, but now that they’re migrated it will be easy to maintain going forward.
Audiobooks
I have been listening to a lot of audiobooks and have been using Dataview to store my current audiobook progress and essentially build out a schedule of my reading.
I have been populating an array with each book, my current page, and the last page. Then using a bit of logic I build out this list of days and pages in the style of a Gantt chart. The dates load dynamically based on today. Every morning I enter my current page and it is able to update the graph.
Before this, I was doing all of this math by hand which was a terrible idea.
const books = [
['LaTeX Introduction', 55, 250],
['Wealth of Nations', 0, 604],
['Wonderbook',13,313],
['Believe Ted Lasso',0,240],
// ...
]My list looks like this, or at least at the time of writing. As I’m adding and removing books frequently, it doesn’t really make sense to add a new note for each of them.
Sure, if I have some notes afterwards I might add them in a doc. But I don’t plan to add empty docs. The data is ephemeral: once I finish it, it’s removed from the array. In this use-case, Obsidian Bases isn’t really working for me unless I wanted to spend a lot of time rebuilding the whole thing conceptually. I don’t, as I’m happy enough with this system.
Conclusion
Overall I am happy with how Obsidian implemented the Bases feature. As I have shown, there are several cases where I’m happily using it now. At the same time, there are other uses where my existing DataviewJS setups are simply better.
Obsidian’s whole schtick is being an offline microapp platform, something I’m slowly beginning to appreciate. I’m not going to pick exclusively Bases or Dataview. What’s great is that I get to use both in places where they work best. My produtivity thanks me.
