Magic Links System
This project uses a build-time magic link system (adapted from surfdeeper) for semantic document linking.
Syntax
Standard Magic Links
[Display Text](:document-id)
[Display Text](:document-id|:fallback-id)
Example:
[Read about context collapse](:context-collapse)
Learning Links (optional variant)
[[document-id]]
[[document-id|Custom Display Text]]
These render as auto-numbered references.
How It Works
- Author writes
[text](:id)in any markdown file - At build time, the Remark plugin scans all content collections
- Builds a map of
id→slugfrom frontmatter - Rewrites
:idreferences to actual routes like/concept/{slug}
Document Frontmatter
Each content file needs an id in frontmatter:
---
title: Context Collapse
id: context-collapse # Used for magic link resolution
aliases: [context-loss] # Optional alternative IDs
---
Collections
Magic links resolve across these collections:
concepts→/concept/{slug}failure-modes→/failure-mode/{slug}patterns→/pattern/{slug}
Implementation Files
If implementing this system, you need:
Remark plugin (
scripts/remark-magic-links.mjs):buildIdMap()- scans content directories, extracts id/slug/aliases- Plugin function - transforms
:idlinks to actual URLs
Astro config (
astro.config.mjs):import remarkMagicLinks from "./scripts/remark-magic-links.mjs"; export default defineConfig({ markdown: { remarkPlugins: [remarkMagicLinks], }, });Validation script (
scripts/validate-concept-ids.js):- Checks for duplicate IDs
- Validates all magic link references resolve
- Run with
npm run lint:links
When Adding New Content
- Always include a unique
idin frontmatter - Use kebab-case for IDs:
context-collapse, notcontextCollapse - Add
aliasesarray if the concept has common alternative names - Run link validation before committing
Error Handling
- Unresolved magic links are converted to plain text (no broken links)
- Build-time validation catches broken references
- Duplicate IDs cause validation failure