Template
Kai Okafor
A terminal-inspired dark portfolio for a senior software developer. A faint grid backdrop, a JSX-style logo, code-comment eyebrows, a two-tone headline with a blinking cursor, and a neon-green 'View Work' button open the page. Project cards follow with tech-stack chips and '//'-prefixed impact metrics, backed by case study pages and a styleguide.
Terminal-style developer portfolio · Website · Portfolio · static site
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Add app screens
Pick up to 6 screens, such as a dashboard, settings or an empty state. Each is built in this design’s own palette and typefaces, with its states and guardrails.
Start from this templateRead the build prompt
Typefaces
Fira Sans comes from the code-editor world as a readable UI sans, and JetBrains Mono stays for the editor-themed details it was made for.
- Fira SansHeadings: headline 60px 700 at -1.5px
- Fira SansBody: body 16-18px
- JetBrains MonoFigures and code: nav, card titles, chips, comments and metrics
Who it is for
- Freelance developers and consultants
- Senior engineers building a personal brand
- Small dev shops establishing credibility
- Developers documenting products and side projects
Layout
- Header: '<name />' logo in green mono left; Home (active green), Work, About, Contact in mono right; bottom border
- Hero over a subtle square grid: '/* Senior Developer */' comment eyebrow, two-tone headline (white line + gray lines) with blinking green caret, intro paragraph, green 'View Work →' button
- Featured Work: 2x2 grid of bordered cards with mono title, arrow, description, tech chips, divider and '//' impact metric in green
- '// View all projects →' link
- Footer: '// © year name', Styleguide link, GitHub / LinkedIn / Mail icons
- Case study pages with challenges, stack and metrics
- About, Contact form, Styleguide pages
Palette
Technical, focused, dark, precise, credible. It reads like a well-themed code editor turned into a résumé.
- background
#0a0a0a - card
#121212 - text
#fafafa - accent (neon green)
#00ff2a - secondary
#1f1f1f - muted
#262626 - border
#2e2e2e - body gray
#a3a3a3 - input border
#616161
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 18.97:1 | 4.5:1 |
| Aa | green accent text on background | 14.46:1 | 4.5:1 |
| Aa | green metric text on card | 13.68:1 | 4.5:1 |
| Aa | black button text on green | 15.34:1 | 4.5:1 |
| Aa | gray headline lines on background | 7.80:1 | 4.5:1 |
| Aa | muted text on card | 7.43:1 | 4.5:1 |
| Aa | chip text on secondary | 6.53:1 | 4.5:1 |
| input border on background | 3.20:1 | 3:1 | |
| green focus ring on background | 14.46:1 | 3:1 |
As vibld’s tokens
The palette on the 15+ color tokens vibld styles a project with, each text color on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary
- secondary
- accent
- destructive *
Type scale
- Display
- Fira Sans 700, 60px, -1.5px tracking, with the second part in gray
- Body
- Fira Sans 16-18px; JetBrains Mono for nav, card titles, chips, comments and metrics
Sans for readability, mono for all 'code' flavor; green reserved for interactive and highlight.
Spacing and imagery
32px margins, 1216px container, 24px card gap, 24px card padding, 4-6px radius, 1px borders, 50px background grid.
No photos; a faint square grid background, code-comment glyphs and tech chips provide texture.
Components
- JSX-style logo
- Mono nav with active green
- Grid-pattern hero background
- Code-comment eyebrow
- Two-tone headline
- Blinking caret
- Primary green button
- Project card with arrow
- Tech-stack chips
- Impact metric line
- View all link
- Footer with icon links
- Contact form
- Styleguide page
Interactions
- Caret blinks; optional typing effect on headline
- Cards lift border color to green and arrow shifts on hover
- Button darkens/glows on hover, focus ring green
- Staggered entrance transitions
- Contact form validation with toasts
- Mobile drawer nav
Data
Project{slug, title, summary, stack[], impact, challenges[], solution, metrics[]}Profile{handle, name, role, location, intro, socials[]}Message{name, email, subject, body}
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack templates) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any color change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labeled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal
Build a terminal-flavored portfolio for a fictional senior engineer, "Kai Okafor". It serves CTOs, engineering managers and founders hiring contractors. The site should feel like a tasteful code editor: dark canvas, faint grid, monospace accents and one neon-green highlight. It needs to show four flagship projects with concrete impact metrics, and it offers full case studies, an about page and a contact form.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix Button, Card, Badge, Form, Toast via Sonner, Vaul for mobile nav) and lucide-react. Use React Router for Home, Work, `/work/:slug`, About, Contact and Styleguide, react-hook-form + zod for the form, and optionally Recharts for a before/after metric chart in case studies. One serverless function sends messages.
### Pages & layout
1. Header, 64px: a `<handle />` logo in green mono, and nav in mono at 14px. The active link is green and the rest gray. 1px bottom border.
2. Hero: over a 50px CSS grid pattern (1px lines at 6% white), fading out at the bottom. A comment eyebrow `/* Role */` with green inner text, a headline at clamp(40px, 5vw, 60px) with line 1 in white and lines 2-3 in #9ca3af, and a blinking green caret. Then a 4-line intro and a green "View Work →" button in mono.
3. Featured work: a 2x2 grid of cards (#121212, 1px border, 6px radius). Each card has a mono title and arrow, a 2-line summary, tech chips, a divider and a `// metric` line in green mono.
4. "// View all projects →" link, centered.
5. Footer: `// © year name`, a Styleguide link and icon links.
6. Case study: overview, challenge list, approach, stack, a metrics row and next project.
### Design system
- `--background: #0a0a0a`, `--card: #121212`, `--foreground: #fafafa`, `--primary: #00ff2a`, `--secondary: #1f1f1f`, `--muted: #262626`, `--border: #2e2e2e`, `--muted-foreground: #a3a3a3`, `--input-border: #616161` (the #2e2e2e border stays for decorative card outlines), `--radius: 6px`.
- Fonts: Fira Sans 400/500/700 and JetBrains Mono 400/500, from Google Fonts. Scale: 12 / 13 / 14 / 16 / 18 / 24 / 60px; 12-13px only for chips and metrics, body 16-18px at 1.6 line-height.
- Spacing: 8px base, 32px margins, 24px gaps.
- Motion: 1s steps(1) caret blink, 400ms fade-up with a 60ms stagger and 150ms hovers. Dark only.
### Components & interactions
- Button (primary): green with black mono text. Hover brightens with a subtle green glow, focus shows a 2px green ring with offset, loading shows a spinner and disabled drops to 50% opacity.
- ProjectCard: hover or focus turns the border green/40 and moves the arrow 2px right. The whole card is a link.
- Chip: static mono label on `--secondary`.
- ContactForm: name, email, subject and message. States for invalid, submitting, success and error.
- Styleguide: tokens, type and component states.
### Data & state
`Project{slug, title, summary, stack, impact, challenges, solution, metrics}` and `Profile` are typed data files. Seed four invented projects (payments platform, design system, live analytics, commerce services) with plausible, clearly illustrative metrics.
### Accessibility
- Green #00ff2a on #0a0a0a is 14.46:1, and black text on green is 15.34:1.
- Gray #9ca3af on the background is 7.8:1; chip text #a3a3a3 on #1f1f1f is 6.53:1.
- The blinking caret is `aria-hidden` and stops under reduced motion (WCAG 2.2.2).
- Decorative comment glyphs (`//`, `/* */`) are hidden from screen readers where they would be noise.
- Cards have a single link target with descriptive text.
- Verified contrast: body #fafafa on #0a0a0a = 18.97:1; green #00ff2a on #0a0a0a = 14.46:1; button #000000 on #00ff2a = 15.34:1; chips #a3a3a3 on #1f1f1f = 6.53:1.
### Security
- zod on the client and in the function, with a honeypot, rate limit and length caps.
- No secrets in client-side code. GitHub and LinkedIn links use `rel="noopener noreferrer"`.
### Performance & SEO
There are no images, so target Lighthouse 100. Draw the grid with a CSS background. Preload JetBrains Mono. Add per-case meta, OG images and Person JSON-LD with `sameAs` links.
### Guardrails
- Do write all copy yourself and use placeholder imagery (Unsplash-style stock or generated); no trademarked names, client logos or real people.
- Don't present invented testimonials or awards as real; label sample content as sample.
- Keep components small and fully typed; no `any`. Surface errors visibly instead of failing silently.
- Don't collect or store more personal data than the contact form needs.
- Done when:
- [ ] Hero shows comment eyebrow, two-tone headline and caret that stops under reduced-motion
- [ ] Four project cards with chips and metric lines link to case studies
- [ ] Green accent used consistently for interactive states
- [ ] Contact form handles all states
- [ ] Styleguide page documents tokens and component states