Personal project · 2026

This Portfolio

Sole designer and direction · Claude Code · HTML/CSS

Hand-written HTML/CSS, live on Vercel, WCAG AA across 11 case pages. One design system reskinned by a per-case accent. No framework, no build step. Directed solo with Claude as typing partner.

Solo Build · Direction AI-Assisted Workflow HTML / CSS Accessibility · WCAG AA
The portfolio homepage on desktop: a lime navigation bar with white outlined buttons, a large black 'Antonio Furtado' headline with a lime highlight behind the surname, and a project card with thick black borders, a hard offset shadow, and an indigo accent edge.

I built my portfolio the way I’d build a product: brief, constraints, small design system, shipped.

I wrote every line of HTML and CSS with Claude as my implementation partner. No Webflow, no template, no developer handoff. The brief, the critique and the direction stayed with me.

AA
WCAG, every page

Constraints first

I started by defining what I wouldn’t do.

Constraint Decision Why
No build tooling Plain HTML/CSS, no Webpack, no framework No deploy friction. Vercel serves the static files as they are.
Solo, no design team AI as implementation and critique partner I directed the build myself to sharpen the skill instead of outsourcing it.
Must be accessible WCAG AA throughout Accessibility runs through my case work, so the portfolio had to prove it in practice.
No AI-generated look Every visual decision owned manually AI-built portfolios tend to look alike, and I wanted to avoid that tell.

It comes from Brasília

I grew up in Brasília, a city designed from scratch, where the bones of a building are always left showing: raw concrete, exposed structure, load-bearing logic on display.

Brutalism there was never about ugliness. It was about honesty. The thick borders and hard shadows are the structure, left on show on purpose. The colours are mine, a bit plural and a bit loud, not pulled from a UI kit.

The interior of the Instituto Central de Ciências at the University of Brasília: a vast waffle-slab concrete ceiling on a triangular grid, daylight falling through it onto an open hall, with a green geometric sculpture and palms to one side.
Brasília, the bones showing: raw concrete left exposed, the structure used as the finish

A building in Brasília is never only concrete. Green grows through it and flowers break against the grey. The accent colours across this portfolio are those: the loud greens, oranges and pinks of Brazilian nature.

A long, curved board-marked concrete canopy over a dense garden of cacti and flowering plants, a small figure walking along the path.
Concrete overhead, a garden beneath it
A multi-level concrete atrium at the University of Brasília, open walkways around a courtyard with tall columns wrapped in climbing plants and hanging ferns.
Hard structure, softened by what grows through it
What carries into the frame

The borders and shadows are the structure. The colours are what grows through it.

Design structure

The token set is deliberately small, and I decided each value rather than reaching for a default: a warm off-white ground (#F7F6F3) under near-black ink (#0A0A0A, softer than pure black), two warm greys for text, one structural 2px black border, a lime accent plus a per-case accent, and three hard-offset shadow steps. Type is the neubrutalism.com pairing: Syne for display, Space Grotesk for headings, Inter for body, Space Mono for meta labels and chips, with sizes snapped to a fixed rem scale and the big type set in clamp() so it flexes without a breakpoint each. Spacing follows a four-step rhythm, from tight padding inside chips and buttons up to the 4.5rem gap between sections. Shared universal patterns live in assets/design-tokens.css and a numbered table of contents in assets/toc-numbered.js, so every case inherits the same nav dropdown, hero-takeaway treatment, screen-caption strip and TOC. One place to edit, eleven pages updated.

Shadows mean you can touch it

A shadow marks anything pressable: buttons, cards, nav links, the TOC button. All three steps are hard offset, no blur. A card lifts on hover and sinks on click, so it reads as physical weight. Blur would soften that, so it stays out.

Interactive: shadow, lifts on hover, sinks on click.

Per-case accent system

Each case redefines --accent locally, one colour per project, picked to fit the character of the work.

Multi-brand design system#452EE0 · indigo
Systems, structure, authority. The token-architecture case.
AI assistant#FB923C · orange
Warmth and conversation. Tech that talks back without feeling cold.
Consent system & GDPR#EC4899 · pink
Breaks the legal-blue cliché. A heavy topic handled with a human tone.
Bluetooth pairing flow#0082FC · blue
Reads like a connection signal, a go.
Connexx B2B tool facelift#ED0400 · Signia red
Signia’s brand red. A real Signia product, so it keeps the brand colour.
RTApps Figma Library#ED0400 · Signia red
The same red. Also a Signia product, so the two share one colour.
B2B App-Store portals#6958E6 · purple
VW Group and CARIAD. Enterprise software at fleet scale.
Sudokue#FFD600 · yellow
Game energy. The one project that is purely for play.
This portfolio#D0FF3A · lime
This site. Matches the homepage, personality up front.
PUMA learning platform#006B2A · green
University of Brasília green, straight from its identity manual.
Personal finance management#FE621D · coral
Optimistic about money, not bank-blue. Brazilian warmth.

Three patterns

Each of these three interactions needed a real UX decision.

01
Stretched link: fully clickable cards
Problem
Only the "View case →" text as a link forces precision-clicking and fails the "card feels like a card" expectation.
Solution
CSS stretched link pattern: .card-cta::after { content:''; position:absolute; inset:0; }. One focusable element per card, fully tappable, so keyboard users tab through cards instead of through every link inside them, and screen readers get one clear label.
02
Abbreviation tooltips: pure CSS, no JavaScript
Problem
Terms like EAA, GDPR, HAW, WCAG mean nothing to someone outside healthcare or accessibility.
Solution
HTML <abbr title="..."> with a CSS ::before/::after tooltip. No JS, no library, consistent across every case file. Context lands inline.
03
Image zoom: hover-reveal + lightbox, CSS+JS
Problem
Case study images are constrained by the two-column layout. Accessibility annotations and flow maps need to be read at full size.
Solution
Hover reveals a Zoom button; click opens a fullscreen overlay, Escape closes, and clicking again zooms further. Built once, rolled out to every image in a single pass.

Reflow, not horizontal scroll

Built desktop-first, tested down to 320px. Three breakpoints do most of the work: 900px drops two-column grids and data tables to one column, 640px tightens the gutters, 600px swaps the top nav for a fixed bottom tab bar.

Nothing is hidden on mobile and nothing overflows sideways. The one horizontal scroll is the "More cases" strip at the bottom, which is deliberate.

The homepage at mobile width: a single column of project cards, each keeping its accent edge (indigo, then orange), with a fixed bottom tab bar showing Projects, About me, and Get in touch.
Homepage, mobile: one column, accent edges intact, fixed bottom tab bar
The Multi-brand design system case at mobile width: an indigo header and a fixed bottom tab bar, the hero showing its component bento, everything in a single column.
Any case, mobile: same frame, different accent, fixed bottom tabs and floating contents button
WCAG 2.1 Reflow (1.4.10)

Reflow is the test: content has to stay usable at 320px wide and 400% zoom with no horizontal scrollbar. Every table on the site collapses to one column to pass it.

AI as implementation partner

I built the site over several sessions in Cowork, the Claude desktop app, with Claude as implementation partner. Pairing with a very fast developer who needs clear direction on everything that matters.

My role
  • Visual direction: colours, type, layout
  • Copy: all case text, labels, taglines
  • Design decisions: what to include, what to cut
  • Critique: what’s wrong, what to change
  • Accessibility requirements
  • QA verdicts: approve / reject / fix
Claude’s role
  • Writing all HTML/CSS
  • Suggesting structure when asked
  • Flagging implementation options
  • Executing changes precisely
  • Implementing semantic HTML and ARIA
  • Running structured QA review

Vague direction gives generic output. Specific direction gives something that looks designed.

Built in from the start

Accessibility runs through my case work, so the portfolio had to prove it in practice.

  • Skip link to #main, visible on focus, so keyboard users can bypass the nav.
  • Semantic landmarks: <nav>, <main>, <section aria-labelledby>, so screen-reader navigation works.
  • Card accessibility: one focusable element per card, not a stack of links. A role="list" container with a labelled link.
  • Focus ring: 3px solid black, 3px offset. Visible and on-brand, not the default browser blue.
  • Contrast enforcement: fixed hex values, not opacity hacks. opacity: 0.4 on small text fails AA, so every value is set explicitly at 4.5:1 or better.
  • Reduced motion: @media (prefers-reduced-motion: reduce) drops every transition.
  • Focus & keyboard: section labels are real tab stops; the nav ring is dual white-plus-black, so it stays visible on any accent.
  • Per-accent contrast: light accents (lime, yellow, coral) switch to a darkened token for text and black on fills, so every case clears WCAG AA.

Shipped, and live:

The portfolio is in production.

  1. Live on Vercel as a static site, served straight from hand-written HTML and CSS, with no framework and no build step.
  2. WCAG AA across all eleven case pages: keyboard focus order, contrast, reflow to 320px, reduced-motion support, and semantic landmarks.
  3. One design system, eleven cases. Each retheme is a single accent token, so a new case inherits the whole frame for free.
  4. Written as I built it, rather than reconstructed afterwards.
  5. Owned end to end by one designer: the brief, the copy, the visual direction, the accessibility, and the code.

What I’d do differently:

  1. Be specific earlier: Precise direction ("change this stripe from yellow to lime, text stays black") works. Writing down exactly what something should do becomes the prompt.
  2. Log decisions as they happen: A live log keeps the reasoning findable and catches contradictions early.

What I got right:

  1. Treating the portfolio as a product: Brief, constraints, audience, then design.
  2. The per-case accent system: Solves visual variety without a different layout for every case.
  3. The collaboration model: Direction from me, execution from Claude.
The thesis, held

A designer can own the full product stack, from concept to shipped accessible site, without being an engineer. AI lifts the floor on execution; the ceiling on thinking is still yours to raise.