Personal technology lab on a .tech domain.
The single source of truth for identity, schemas, and conventions is AGENTS.md.
Indie Tech Lab = Personal Tech Lab + Tiny Tools + AI Workflows + Tech Decisions + Micro SaaS Graveyard
- Astro v5 + content collections (Zod schemas).
- MDX for project pages, build logs, notes, decisions, case studies.
- Tailwind CSS v4 (Vite plugin) for styling.
@astrojs/sitemapfor SEO; staticrobots.txtroute.
npm install
npm run dev # http://localhost:4321
npm run build # static output → dist/
npm run preview # serve built siteNode.js ≥ 18.20 is recommended.
src/
├── content/ # canonical content (one folder per contentType)
│ ├── projects/ # Experiments — the Lab's source of truth
│ ├── build-logs/ # {YYYY-MM-DD}-{project-slug}.mdx
│ ├── notes/ # Tech Notes
│ ├── workflows/ # AI Workflows
│ ├── decisions/ # Tech Decisions
│ ├── case-studies/ # Case Studies + Failure Analyses
│ └── tools/ # Tool descriptions
├── pages/
│ ├── index.astro # /
│ ├── lab/ # /lab, /lab/[slug]
│ ├── graveyard.astro # /graveyard (derived: status ∈ {Failed, Killed})
│ ├── build-logs/ # list + detail
│ ├── notes/ # list + detail
│ ├── tools/ # list + detail
│ ├── workflows/ # list + detail
│ ├── decisions/ # list + detail
│ ├── case-studies/ # list + detail
│ ├── about.astro
│ ├── privacy.astro
│ └── robots.txt.ts
├── layouts/
│ ├── Layout.astro
│ └── ContentDetail.astro
├── components/ # ProjectCard, StatusBadge, StatusIcon, TagList, ContentList, Nav, Footer
├── lib/status.ts # status → color/icon/label
├── styles/global.css # Tailwind v4 + design tokens (@theme)
└── content/config.ts # Zod schemas matching AGENTS.md
-
Read the relevant format section in
AGENTS.md. -
Create a new
.mdxfile in the right collection. The filename rule:- Projects:
content/projects/{slug}.mdx - Build logs:
content/build-logs/{YYYY-MM-DD}-{project-slug}.mdx - Everything else:
content/{collection}/{slug}.mdx
- Projects:
-
Frontmatter must use approved tag values and ISO 8601 dates (or
null). -
Run
npm run build— Zod will fail loudly on schema violations. -
The Graveyard updates itself when a project's
statusbecomesFailedorKilled.
- Slugs are lowercase, kebab-case, ASCII, stable forever once published.
nullfor unknown dates and links. NeverTBD,coming soon,#.- Status is conveyed by color + icon + label, never color alone.
- Each project's Graveyard appearance requires a linked Failure Analysis in
case-studies/. - One
contentTypeper file, matching its collection folder.
- Pages:
/,/lab,/graveyard,/build-logs,/notes,/tools,/workflows,/decisions,/case-studies,/about,/privacy. - Seed content: 3 projects (PromptVault — Failed, LaunchLens — Building, StackPicker — Idea), 1 failure analysis, 1 build log, 1 tech decision.
- Sitemap + robots.txt + favicon.
- LaunchLens MVP at
/tools/launchlens(idea scorer, local-first). - StackPicker prototype.
- Filters by status / type / stack on
/lab. - Privacy-friendly analytics.