Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Add AudioSection component with media player and waveform visualization - Add NoteContent component with inline link support and syntax highlighting - Add NoteSidebar with collapsible sections for navigation - Add SidebarContext for managing sidebar state - Update note page layout to use new component architecture - Add assets utility for GCS audio/video URL generation - Update content library with audio/skill/prompt type support - Add vision.md with editorial guidelines - Update .gitignore with additional security patterns - Add upload-asset.sh script for GCS asset management Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
3.2 KiB
3.2 KiB
A Research Journal
Personal research projects exploring unfamiliar territory with AI.
Parent context: See ../CLAUDE.md for project-wide routing.
Development
npm install
npm run dev
Architecture
This blog uses a data-driven architecture:
- Content lives in
content/- YAML metadata + Markdown prose - Components in
src/components/- Reusable DRY components - Dynamic routes - Notes use
[slug]for SSG
Content Structure
content/
├── projects/
│ └── maxwell.yaml # Project metadata
├── notes/
│ ├── 001-picking-a-problem/
│ │ ├── meta.yaml # Prompts, navigation, metadata
│ │ └── content.md # Prose content
│ └── 002-building-the-scaffolding/
│ ├── meta.yaml
│ ├── content.md
│ └── files/ # Expandable file contents
│ ├── vision.md
│ ├── architecture.md
│ └── roadmap.md
└── white-paper/
└── outline.yaml # Structured sections
Routes
/- Journal home (list of projects)/maxwell- Maxwell project landing/maxwell/white-paper- Formal paper outline/maxwell/notes/[slug]- Individual research notes (dynamic)
Adding a Note
- Create
content/notes/NNN-slug/directory - Add
meta.yamlwith prompts, navigation, filesCreated - Add
content.mdwith prose - Add
files/directory if filesCreated references files - Update previous note's
meta.yamlnavigation.next
Key Files
| File | Purpose |
|---|---|
src/lib/content.ts |
Content loaders (getProject, getNoteBySlug, etc.) |
src/components/layout/PageLayout.tsx |
Page wrapper |
src/components/layout/BackNav.tsx |
Back navigation |
src/components/notes/NoteHeader.tsx |
Note header (#id, date, title) |
src/components/notes/PromptsSection.tsx |
Prompts with copy buttons |
src/components/notes/FilesSection.tsx |
Expandable files |
src/components/notes/NoteFooter.tsx |
Prev/next navigation |
src/components/white-paper/OutlineSection.tsx |
Outline sections |
src/components/copyable.tsx |
CopyButton, CopyableBlock, ExpandableFile |
Inline Links
Reference sidebar items in content.md:
[[prompt:id]]— link to a prompt by its id[[file:name.md]]— link to a file by its name[[skill:name]]— link to a skill by its name[[audio:file.m4a]]— link to an audio file by its name
Click scrolls to item + highlights for 1.5s.
Note meta.yaml Schema
id: "001"
slug: 001-picking-a-problem
date: "2026-02-06"
title: Picking a Problem
preview: "Short description for list view"
prompts:
- id: unique-id
label: Button label
content: |
Prompt content here
filesCreated:
- name: filename.md
description: What this file is
audioFiles: # optional
- name: filename.m4a
title: "Display title"
description: "What this covers"
source: NotebookLM # optional badge
navigation:
prev: null # or { slug, id, title }
next:
slug: 002-building-the-scaffolding
id: "002"
title: Understanding the Project