Let's work together

Design

The system behind this site, in the colors and sizes it actually ships with. Toggle the theme button in the header and the swatches below follow along, since they are rendered with the same CSS variables as the rest of the site.

Color tokens

Nine custom properties, defined once in theme.css for :root and :root[data-theme='dark'], and used everywhere else on the site. Dark mode's neutrals are the same near-black as the brand assets below, not a separate blue-tinted dark theme.

--bg App background #fafcfd light · #161616 dark
--surface Cards and panels #ffffff light · #202020 dark
--text Primary text #32404f light · #f5f5f4 dark
--muted Body copy and metadata #878f98 light · #a3a3a0 dark
--line Borders and separators #d8dde1 light · #3a3a38 dark
--surface-hover Hover background #f1f5f7 light · #282828 dark
--accent Interactive highlight #e65f2e light · #ff8052 dark
--accent-soft Low-emphasis accent background #fff0ea light · #422d29 dark
--footer Footer background #32404f light · #101010 dark

Type

Exactly two self-hosted font families, no third-party font CDN, nothing else used anywhere on the site. Headings and interface text lean sans (Geist Sans), body copy leans serif (Lora), and a small italic accent marks a single word in the hero.

Heading · Geist Sans, Inter, -apple-system, Segoe UI, sans-serif · weight 700

Aa Design system

Body · Lora Variable · line-height 1.45

The quick brown fox jumps over the lazy dog. Body copy stays small and readable, and every paragraph inherits var(--muted) for its color unless overridden.

Accent · Lora Variable italic · weight 400 · hero only

in

Section title2rem · .section-title
Card heading1.9rem desktop, 1.2rem mobile · .card h3
Section subtitle0.95rem · .section-subtitle
Meta text0.78rem · .meta

Spacing and layout

Content stays centered under a fixed max width, and vertical rhythm comes from one repeated section gap, not a full spacing scale.

1024px

Max content width (.site-main), with 24px side padding, dropping to 16px under 720px.

56px / 38px

Space above each .section: 56px desktop, 38px under 720px.

Shape

Radius is not one fixed token, it scales with what it's wrapping: small for controls, larger for cards and heroes, a full pill or circle for anything round.

8px Small controls post-lightbox image, otp inputs
12px Compact panels matrix tool panels, gallery buttons
16px Standard card BlogCard, ContentCard, ToolCard, links tiles
20px Hero banners tools hero, blog hero
999px Pills tag chips, theme toggle, buttons
50% Circles avatars, icon badges

Components

The reusable primitives: a bordered card on a grid, a divider, and the pill used for tags and badges across the site.

Card

Border in var(--line), background in var(--surface). Hovers with an accent-tinted border and a 1px lift.

Card grid

Three columns desktop, two at 920px, one at 720px. The same grid backs Skills, Featured reads, and Tools.

Divider

A 1px var(--line) rule with 22px of margin, used to separate sections inline rather than with more whitespace.

Hackathon Cybersecurity AI

Motion

Mostly short and functional, one deliberately expressive touch on the cursor. Everything here turns off under prefers-reduced-motion or on touch devices, not just slows down.

120 to 180ms

Hover and focus transitions across cards, tiles, and links, all ease timing.

180ms

The theme switch itself: background and text color crossfade, plus a circular reveal from the toggle button.

Frosted cursor

A borderless, translucent, accent-tinted dot replaces the system cursor and tracks the pointer exactly, site-wide. It condenses to a small, fully solid orange dot over anything interactive. Over a link worth naming, a separate chip also appears offset above or below the dot with a short label, "Read this," "Start an email," "Visit this," in Geist Sans, so the label never sits on top of the link itself. Fine-pointer, motion-ok visitors only; touch and reduced-motion get the native cursor untouched.

Portrait hover

On the homepage, hovering the profile portrait colors "Human" and "Tech" to match the always-accent "in" in the hero, via a :has() selector reaching back across the hero from a shared ancestor.

Marks and banners

Downloadable assets built from the AG monogram: the mark alone, a lockup with the Abhiigatty wordmark, a muted grey pair for embedding elsewhere, a desktop wallpaper, and a LinkedIn cover banner. Click any tile to download.

Monogram

Work + monogram lockup

Muted · for embedding

Wallpaper · 1920×1080

LinkedIn banner · 1584×396

Book a call