Ishaan35 downloadsCMS for Astro sites to manage file collections with live frontmatter schema validation and automated publishing workflows.
Your Astro website's control panel — inside Obsidian.
Write your blog posts and research notes in Obsidian. This plugin checks they're perfect, then helps you publish them to your Astro website.
Think of it like a spell-checker for your blog posts, but instead of checking spelling, it checks that every post has all the information your Astro website needs to display it properly.
Here's what you get:
| Feature | What It Means |
|---|---|
| Dashboard | See all your blog posts in one place, like a spreadsheet |
| Validation | The plugin tells you if a post is missing something (like a title or date) |
| Pre-flight | Marks a draft as ready for deployment (frontmatter only; deploy via Git sync) |
| Quick validate sidebar | See errors on the post you're currently editing |
| Bulk pre-flight | Mark many draft posts as ready for deployment at once |
| Track system | Organize posts by type — articles, profiles, or events |
| Status bar | See your content health at a glance in Obsidian's status bar |
| Sort & filter | Find posts fast with sort options, search, and filters |
| Context menus | Right-click files for quick validate and pre-flight actions |
| Safe upgrades | Settings automatically merge when you update — nothing is lost |
| Mobile support | Responsive dashboard that works on Obsidian Mobile |
| Accessibility | ARIA labels, keyboard navigation, and screen reader support |
| Differential rendering | Only changed cards update — fast even with hundreds of posts |
main.js, manifest.json, and styles.css from the latest release.obsidian/plugins/ishistory-cms/ in your vaulthttps://github.com/dr-ishaan/astro-cms-obsidian-pluginCtrl+P (or Cmd+P on Mac) and search for "Open isHistory dashboard"Your Obsidian vault needs to look like your Astro project's content folder for the plugin to find your posts.
The plugin looks for content inside src/content by default. Your vault should have this structure:
your-vault/
src/
content/
blog/ ← Your blog posts (archive collection)
A1-the-ancient-dream-of-artificial-life.md
P1-ada-lovelace.md
E1-the-dartmouth-conference-1956.md
...
vault/ ← Your research notes (vault collection)
vision-and-architecture.md
content-schema.md
...
The easiest way: Open your entire Astro project folder as your Obsidian vault. That way, the src/content path matches automatically.
posts/ folder, type postsEvery blog post needs a special block at the very top called frontmatter. It tells your Astro website everything it needs to know about the post.
Copy this template and fill in your own information:
---
title: "Your Post Title Here"
date: 2026-05-28
description: "A short one-line description of your post (15 to 160 characters)."
draft: false
tags: ["tag1", "tag2", "tag3"]
aliases: ["A1"]
image: "/images/your-hero-image.jpg"
series: "minds-and-machines"
seriesOrder: "A1"
track: "A"
status: "published"
part: "Part I · The Dream"
figures: "Person One, Person Two, Person Three"
connects: "P2, A5, E1"
era: "Ancient – 1850"
---
Your amazing blog post content goes here...
---
title: "Your Note Title"
created: 2026-05-28
updated: 2026-05-28
author: Ishaan
description: "What this note is about."
publish: true
tags: [meta, research, notes]
order: 1
relatedChapters: "A5, P2, E1"
---
Your research note content goes here...
| Field | What to Write | Example |
|---|---|---|
title |
The name of your post (5–120 characters) | "The Ancient Dream of Artificial Life" |
date |
When this post is published (YYYY-MM-DD format) | 2026-05-28 |
description |
A short summary for search engines and previews (15–160 characters) | "From bronze giants to clockwork wonders..." |
| Field | What to Write | Example |
|---|---|---|
series |
Which series this post belongs to | "minds-and-machines" |
seriesOrder |
The chapter code within the series | "A1" |
track |
Which track: A (Articles), P (Profiles), or E (Events) — or any custom track you define |
"A" |
status |
Publication status: published, upcoming, or planned — or any custom status you define |
"published" |
part |
The act/part label | "Part I · The Dream" |
| Field | What to Write | Example |
|---|---|---|
figures |
Key people mentioned (comma-separated) | "Ada Lovelace, Alan Turing" |
connects |
Related chapter codes (comma-separated) | "P2, A5, E1" |
era |
The time period this post covers | "1936-1954" |
| Field | What to Write | Example |
|---|---|---|
draft |
Is this a work-in-progress? Must be true or false |
false |
tags |
A list of topic tags | ["ai-history", "philosophy"] |
aliases |
A list of alias names for linking (must be a YAML list) | ["A1"] |
image |
Hero image path (must start with /) |
"/images/a1-hero.jpg" |
The plugin checks your posts and shows you exactly what's wrong. Here are the most common problems:
| Problem | What's Wrong | How to Fix |
|---|---|---|
| Missing title | No title field in frontmatter |
Add title: "Your Title" |
| Missing date | No date field |
Add date: 2026-05-28 |
| Bad date format | Date is not in YYYY-MM-DD format | Use 2026-05-28 not May 28, 2026 |
| Future date | Date is set in the future | Use a current or past date |
| Tags not a list | tags is a string instead of a list |
Use ["tag1", "tag2"] not "tag1, tag2" |
| Aliases not a list | aliases is a string instead of a list |
Use ["A1"] not "A1" |
| Has series but no order | series is set but seriesOrder is missing |
Add seriesOrder: "A1" |
| Missing description | No description field |
Add description: "Your description here" |
| Draft + published conflict | draft: true but status: "published" |
Set draft: false or status: "upcoming" |
| Invalid track code | track is not one of your defined tracks |
Use a track code from Settings |
| seriesOrder track mismatch | seriesOrder starts with a different track letter than track |
Make them match |
| Profile missing figures | A Profile-track post has no figures field |
Add figures: "Person Name" |
| Invalid connects reference | connects has references that don't match the track+number format |
Use format like "A1, P5, E3" |
At the top of the dashboard, you'll see:
draft: trueEach post card has buttons:
draft: false, status: "published", and today's date if none set)Click the Bulk pre-flight all drafts command to mark all drafts as ready for deployment. It will ask you to confirm first.
File explorer (right-click a file):
Editor (right-click inside a note):
The status bar at the bottom of Obsidian shows your content health:
This is a lightweight panel that shows you validation results for whatever post you're currently editing.
How to open it:
Ctrl+P (or Cmd+P on Mac)You can access these from the command palette (Ctrl+P or Cmd+P):
| Command | What It Does |
|---|---|
Open isHistory dashboard |
Opens the full content management dashboard |
Open quick validate |
Opens the sidebar validator |
Validate current post |
Checks the post you're editing for errors |
Pre-flight current draft |
Marks the draft you're editing as ready for deployment |
New Articles (A-track) |
Creates a new post for a track (one command per track) |
Validate all content |
Validates all content and shows summary |
Bulk pre-flight all drafts |
Marks all draft posts as ready for deployment |
Pre-flighting a post marks it as ready for deployment, but doesn't push it live. To deploy changes to your Astro site:
That's the full pipeline: Write → Pre-flight → Git sync → Auto-deploy
You can also use any other Git sync method you prefer — the plugin only manages frontmatter, so any tool that commits and pushes your vault to your Astro repo will work.
Tip: You can also open Obsidian Git directly from the plugin's Settings page — there's a quick-access button at the bottom.
Go to Settings → isHistory CMS to configure:
src/content/blogsrc/content/vaultpublished, upcoming, planned)/ or another prefixminds-and-machines){{seriesOrder}}, {{trackName}}, {{date}}, etc.draft becomes when pre-flightingstatus becomes when pre-flightingThe settings page shows warnings when:
tags: ai-history instead of tags: [ai-history]) are now normalized without errorssrc/content/blog-vault/ no longer matches the archive path src/content/blog)connects references don't follow the track+number format (e.g. A1, P5, E3)Make sure your Archive path or Vault path in settings matches where your content actually is. If your posts are in src/content/blog/, the archive path should be src/content/blog.
That's normal! In BRAT, "(frozen)" just means the plugin is pinned to a specific version. It does NOT mean the plugin is broken. Your plugin is working fine.
Community Store: Settings → Community Plugins → Click "Check for updates" → Update Manual: Download the latest release files and replace the old ones. BRAT: BRAT settings → Check for updates → Update.
Go to Settings → isHistory CMS and lower the Cards per page number. Try 20 instead of 40.
Pre-flight only changes frontmatter in your vault. You still need to sync your vault to Git (using Obsidian Git or another tool) for your Astro site to rebuild and deploy. See the Deploying to Your Site section above.
No! The plugin uses a deep-merge strategy that reads your existing settings, keeps everything you configured, and only adds any new fields that didn't exist before. Your settings are always safe.
No! The default settings work great out of the box. Regex is only used internally to match seriesOrder patterns based on your track codes. You just pick a short code (like "A", "P", "E") and the plugin handles the rest.
This plugin is designed for the isHistory Astro project — a deep-dive into the history of Artificial Intelligence. It uses:
archive (blog posts) and vault (research notes)But it works with any Astro project that uses content collections!
main.js and styles.css (cryptographic provenance verification)innerHTML usage — DOM manipulation uses Obsidian's createEl API (with two minimal document.createElement calls for style injection and card rendering)!important in CSS — proper selector specificity is used insteadbuiltin-modules npm dependency — uses Node.js built-in module.builtinModulesapp.vault.getMarkdownFiles() — the recommended Obsidian API that only accesses markdown files, not all vault files# Install dependencies
npm ci
# Build for production
npm run build
# Development mode (watch)
npm run dev
# Run tests
npm test
# Type check
npm run typecheck
# Lint
npm run lint
MIT