// catalog
Software catalog.
Three Component entities owned by anil-ardic in system=anilardic-portfolio. Schema mirrors backstage.io/v1alpha1 — same fields, same intent. This is not a Backstage instance; it's the entity model I'd ship on day one of one.
- total
- 4
- lifecycle:production
- 3
- lifecycle:experimental
- 1
- type:website
- 2
- type:service
- 2
- distinct tags
- 26
────────────────────────────────────────────────────────────────
⚛ the filter below is a React island
(client:visible) — search · lifecycle · type · tag chips
drive a live filtered view of the same Zod-validated entities. URL state
is mirrored to ?q=&lc=&tp=&tag= for share-links.
AI Startup Tycoonproductionwebsite Idle/tycoon web game — validates an AI-startup growth loop end-to-end. 10-day MVP shipped; iOS port deferred until GO/PIVOT/KILL thresholds confirm.
Check Dutyproductionwebsite Tap counter. PWA, local-first, calendar-aware.
OnPremAIexperimentalservice Governed AI access layer. Two-plane airlock keeps prompts inside the perimeter — internal plane runs scoped knowledge sources, external plane handles general research, sanitization + approval boundary between them.
AIfactoryproductionservice Local-first SW-Factory control tower — memory + tickets + sprints + cross-model review + dashboards. Started as a private-by-default replacement for hook telemetry I didn't trust; grew into a combined pipeline / scrum / CI/CD / DevOps tool for solo-agent work.
────────────────────────────────────────────────────────────────
Each entity in src/content/projects/*.md validates against this Zod schema in src/content/config.ts:
apiVersion: 'backstage.io/v1alpha1' (literal)
kind: 'Component' (literal)
metadata: {
name: /^[a-z0-9-]+$/,
title, description: string,
tags: string[],
annotations: Record<string,string>?
}
spec: {
type: 'service'|'website'|'library'|'documentation',
lifecycle: 'production'|'experimental'|'deprecated',
owner: string,
system: string?,
dependsOn: string[]?,
providesApis: string[]?,
links: { url, title, kind }[]?
}
order: number?