stnd.buildSTANDARD MANUAL2026-07-15

@stnd/loader

@stnd/loader

Content ingestion loaders for the Standard Ecosystem, built as custom Astro Content Collection Loaders.

ELI5

This is how an Astro site’s content collections point at something that isn’t a local src/content/ folder — an Obsidian vault (with wikilinks and frontmatter) or a Notion database. Define the collection once with the right loader, then use getCollection() like any normal Astro content collection.

Use it (vault):

import { defineCollection } from "astro:content";
import { vaultLoader } from "@stnd/loader/vault";
export const collections = {
  vault: defineCollection({ loader: vaultLoader({ path: "../../vault/Atelier" }) }),
};

Loaders

1. Vault Loader (@stnd/loader/vault)

Loads content from a local directory containing Markdown files with Obsidian-style frontmatter, wikilinks ([[link]]), and media files.

Configuration (src/content.config.ts)

import { defineCollection } from "astro:content";
import { vaultLoader } from "@stnd/loader/vault";

const vault = defineCollection({
  loader: vaultLoader({
    path: "../../vault/Atelier", // path to the local Obsidian vault
    flattenDirectories: false,   // preserve directory structure in IDs
    ignore: [".obsidian", ".trash", ".agent"], // directories to ignore
  }),
});

export const collections = { vault };

Astro Dev Mode Workaround (Important)

Warning

In Astro 6.x/7.x development mode (astro dev), calling getCollection("vault") inside routes injected via injectRoute() (used by plugins/integrations) returns []. This is due to virtual module hydration issues inside Vite SSR context.

To work around this, the vault loader populates a global singleton that survives HMR and SSR code-splitting. Instead of using getCollection, import the vault singleton directly:

import { vault } from "@stnd/loader/vault";

// Wait for the vault to initialize (optional, useful in edge cases)
await vault.ensureLoaded();

// Access entries and metadata
const entries = vault.entries; // Array of VaultEntry
const size = vault.size;       // Number of entries
const meta = vault.meta;       // { validLinks, imageIndex, vaultPath }

// Find individual entries
const note = vault.getEntry("my-permalink");

2. Notion Loader (@stnd/loader/notion)

Synchronizes content from Notion databases into the Standard Ecosystem.

Configuration (src/content.config.ts)

import { defineCollection } from "astro:content";
import { notionLoader } from "@stnd/loader/notion";

const notion = defineCollection({
  loader: notionLoader({
    auth: import.meta.env.NOTION_API_KEY,
    databaseId: import.meta.env.NOTION_DATABASE_ID,
  }),
});

export const collections = { notion };

Notes / Observations

(jot down anything noticed here — quirks, gotchas, ideas)

Todo

  • [ ] Nothing tracked yet.