Context
ShaderBase's web UI has three major gaps to address:
-
Submission is painful — The /submit page is a 545-line manual form with ~30 fields. We want an AI-first flow: paste code or a link, AI extracts everything, user reviews and submits.
-
Search is a dead end — /shaders shows cards but they aren't clickable, there's no detail page, and shaders are never rendered. Users can't see what a shader looks like.
-
No feedback loop — When an AI agent (during vibecoding) uses a shader, there's no way to capture user satisfaction and send reviews back. We need an API for automated reviews and display them on the detail page.
Decisions made:
- Use Three.js for live shader preview (shaders are Three.js ShaderMaterial code)
- Replace the manual form entirely with AI-first flow
- Use Vercel AI SDK (
ai + @ai-sdk/anthropic) to keep provider-agnostic
- Reviews stored in SQLite (using
node:sqlite like Better Auth), visible on detail page
Branch: feat/ai-first-detail-reviews
Phase 1: Shader Detail Page (/shaders/$name)
1.1 Server function — apps/web/src/lib/server/shader-detail.ts (NEW)
Create getShaderDetail server function (createServerFn) that:
- Takes
{ name: string }, reads shaders/{name}/shader.json (full manifest)
- Reads GLSL files (vertex, fragment) as raw text
- Reads recipe files as raw text
- Reads preview SVG content if format is
svg
- Returns typed
ShaderDetail object with all data needed for the page
1.2 WebGL preview — apps/web/src/components/ShaderPreviewCanvas.tsx (NEW)
Solid.js component using Three.js to render the shader live:
- Three.js
WebGLRenderer, Scene, Camera (orthographic for fullscreen-pass, perspective for surface/geometry)
- Surface shaders: render on a rotating mesh (sphere or plane)
- Post-processing/fullscreen-pass: render on a fullscreen quad
ShaderMaterial with actual vertex + fragment code and manifest uniforms
requestAnimationFrame loop updating uTime uniform if present
- Falls back to SVG preview if shader compilation fails
1.3 Uniform controls — apps/web/src/components/UniformControls.tsx (NEW)
float/int → range slider + number input
bool → toggle
color/vec3 (color-like) → HTML color picker
vec2/vec3/vec4 → grouped sliders
sampler2D/samplerCube → label only
1.4 Code block — apps/web/src/components/CodeBlock.tsx (NEW)
Reusable <pre> block with language label, copy button, design system styling.
1.5 Detail page route — apps/web/src/routes/shaders.$name.tsx (NEW)
Layout: Back link → Hero → Preview + Controls → Description → Compatibility → Recipes → Source code → Provenance → Reviews
1.6 Make cards clickable — apps/web/src/components/ShaderCard.tsx (MODIFY)
Wrap in <Link to="/shaders/$name"> with cursor-pointer styling.
1.7 Dependencies
three (runtime)
@types/three (dev)
Phase 2: AI-First Submission Flow
2.1 AI parsing — apps/web/src/lib/server/ai-parse.ts (NEW)
resolveShaderSource: Detect Shadertoy URLs, GitHub gists, raw URLs, or plain GLSL
aiParseShader: Vercel AI SDK generateObject() with Zod schema to extract all manifest fields from shader code
2.2 AI wizard — apps/web/src/components/AiSubmitWizard.tsx (NEW)
Three-step wizard replacing the manual form:
- Input (paste code/URL)
- Processing (AI analysis)
- Review & Edit (editable fields + live preview + submit)
2.3 Rewrite submit page — apps/web/src/routes/submit.tsx (MODIFY)
Replace manual form with AiSubmitWizard. Keep auth flow and saveDraftSubmission.
2.4 Dependencies
ai (Vercel AI SDK)
@ai-sdk/anthropic
Phase 3: Shader Review System
3.1 Reviews database — apps/web/src/lib/server/reviews-db.ts (NEW)
SQLite via node:sqlite at .data/reviews.sqlite:
CREATE TABLE IF NOT EXISTS reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
shader_name TEXT NOT NULL,
rating INTEGER NOT NULL CHECK(rating BETWEEN 1 AND 5),
comment TEXT,
source TEXT NOT NULL DEFAULT 'web',
agent_context TEXT,
user_id TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
3.2 Reviews API — apps/web/src/routes/api/reviews.ts (NEW)
- POST
/api/reviews — Submit review (no auth for SDK/MCP)
- GET
/api/reviews?shader=<name> — Get reviews + stats
3.3 Reviews display — apps/web/src/components/ReviewsSection.tsx (NEW)
Average rating, source breakdown, recent reviews, web review form.
3.4-3.5 Integration
- Reviews on detail page + average rating in hero
- Rating badges on shader cards in browse view
3.6 SDK/MCP Interface
The POST /api/reviews endpoint is the contract for AI agents.
File Summary
| Action |
File |
| NEW |
apps/web/src/lib/server/shader-detail.ts |
| NEW |
apps/web/src/components/ShaderPreviewCanvas.tsx |
| NEW |
apps/web/src/components/UniformControls.tsx |
| NEW |
apps/web/src/components/CodeBlock.tsx |
| NEW |
apps/web/src/routes/shaders.$name.tsx |
| NEW |
apps/web/src/lib/server/ai-parse.ts |
| NEW |
apps/web/src/components/AiSubmitWizard.tsx |
| NEW |
apps/web/src/lib/server/reviews-db.ts |
| NEW |
apps/web/src/routes/api/reviews.ts |
| NEW |
apps/web/src/components/ReviewsSection.tsx |
| MODIFY |
apps/web/src/components/ShaderCard.tsx |
| MODIFY |
apps/web/src/routes/submit.tsx |
| MODIFY |
apps/web/src/lib/server/shaders.ts |
| MODIFY |
apps/web/package.json |
Implementation Order
- Phase 1 (detail page) — unblocks card clickability, provides
ShaderPreviewCanvas reused by Phase 2
- Phase 3 (reviews) — DB + API before detail page is "done"
- Phase 2 (AI submission) — depends on Phase 1's preview component
Context
ShaderBase's web UI has three major gaps to address:
Submission is painful — The
/submitpage is a 545-line manual form with ~30 fields. We want an AI-first flow: paste code or a link, AI extracts everything, user reviews and submits.Search is a dead end —
/shadersshows cards but they aren't clickable, there's no detail page, and shaders are never rendered. Users can't see what a shader looks like.No feedback loop — When an AI agent (during vibecoding) uses a shader, there's no way to capture user satisfaction and send reviews back. We need an API for automated reviews and display them on the detail page.
Decisions made:
ai+@ai-sdk/anthropic) to keep provider-agnosticnode:sqlitelike Better Auth), visible on detail pageBranch:
feat/ai-first-detail-reviewsPhase 1: Shader Detail Page (
/shaders/$name)1.1 Server function —
apps/web/src/lib/server/shader-detail.ts(NEW)Create
getShaderDetailserver function (createServerFn) that:{ name: string }, readsshaders/{name}/shader.json(full manifest)svgShaderDetailobject with all data needed for the page1.2 WebGL preview —
apps/web/src/components/ShaderPreviewCanvas.tsx(NEW)Solid.js component using Three.js to render the shader live:
WebGLRenderer,Scene,Camera(orthographic for fullscreen-pass, perspective for surface/geometry)ShaderMaterialwith actual vertex + fragment code and manifest uniformsrequestAnimationFrameloop updatinguTimeuniform if present1.3 Uniform controls —
apps/web/src/components/UniformControls.tsx(NEW)float/int→ range slider + number inputbool→ togglecolor/vec3(color-like) → HTML color pickervec2/vec3/vec4→ grouped sliderssampler2D/samplerCube→ label only1.4 Code block —
apps/web/src/components/CodeBlock.tsx(NEW)Reusable
<pre>block with language label, copy button, design system styling.1.5 Detail page route —
apps/web/src/routes/shaders.$name.tsx(NEW)Layout: Back link → Hero → Preview + Controls → Description → Compatibility → Recipes → Source code → Provenance → Reviews
1.6 Make cards clickable —
apps/web/src/components/ShaderCard.tsx(MODIFY)Wrap in
<Link to="/shaders/$name">with cursor-pointer styling.1.7 Dependencies
three(runtime)@types/three(dev)Phase 2: AI-First Submission Flow
2.1 AI parsing —
apps/web/src/lib/server/ai-parse.ts(NEW)resolveShaderSource: Detect Shadertoy URLs, GitHub gists, raw URLs, or plain GLSLaiParseShader: Vercel AI SDKgenerateObject()with Zod schema to extract all manifest fields from shader code2.2 AI wizard —
apps/web/src/components/AiSubmitWizard.tsx(NEW)Three-step wizard replacing the manual form:
2.3 Rewrite submit page —
apps/web/src/routes/submit.tsx(MODIFY)Replace manual form with
AiSubmitWizard. Keep auth flow andsaveDraftSubmission.2.4 Dependencies
ai(Vercel AI SDK)@ai-sdk/anthropicPhase 3: Shader Review System
3.1 Reviews database —
apps/web/src/lib/server/reviews-db.ts(NEW)SQLite via
node:sqliteat.data/reviews.sqlite:3.2 Reviews API —
apps/web/src/routes/api/reviews.ts(NEW)/api/reviews— Submit review (no auth for SDK/MCP)/api/reviews?shader=<name>— Get reviews + stats3.3 Reviews display —
apps/web/src/components/ReviewsSection.tsx(NEW)Average rating, source breakdown, recent reviews, web review form.
3.4-3.5 Integration
3.6 SDK/MCP Interface
The
POST /api/reviewsendpoint is the contract for AI agents.File Summary
apps/web/src/lib/server/shader-detail.tsapps/web/src/components/ShaderPreviewCanvas.tsxapps/web/src/components/UniformControls.tsxapps/web/src/components/CodeBlock.tsxapps/web/src/routes/shaders.$name.tsxapps/web/src/lib/server/ai-parse.tsapps/web/src/components/AiSubmitWizard.tsxapps/web/src/lib/server/reviews-db.tsapps/web/src/routes/api/reviews.tsapps/web/src/components/ReviewsSection.tsxapps/web/src/components/ShaderCard.tsxapps/web/src/routes/submit.tsxapps/web/src/lib/server/shaders.tsapps/web/package.jsonImplementation Order
ShaderPreviewCanvasreused by Phase 2