feat: redesign site as a modern developer portfolio

- New home page: hero, stats, about, focus areas, stack, projects, contact
- Light/dark theme with system default and persisted toggle
- Content centralised in data/profile.js
- Restyle /rates to match; remove it from nav and projects
- Afriex: log a clear error now that its API requires a device id

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jesse Egbosionu
2026-10-24 21:19:22 +02:00
co-authored by Claude Opus 5.5
parent 5c40a64c42
commit 3bb0a5e4a9
17 changed files with 1873 additions and 872 deletions
+160 -33
View File
@@ -1,52 +1,179 @@
import Layout from '../components/Layout';
import SocialLinks from '../components/SocialLinks';
import AnimatedName from '../components/AnimatedName';
import SectionHeading from '../components/SectionHeading';
import ProjectCard from '../components/ProjectCard';
import Reveal from '../components/Reveal';
import Icon from '../components/Icon';
import { profile, stats, focusAreas, stack, projects } from '../data/profile';
export default function Home() {
return (
<Layout showNavLinks={false}>
<Layout>
{/* HERO */}
<section className="hero">
<h1 className="hero-title">
Hey, I'm <AnimatedName />
</h1>
<div className="hero-main">
<div className="hero-backdrop" aria-hidden="true" />
<div className="shell hero-grid">
<div className="hero-content">
<p className="hero-subtitle">
A software engineer building systems that scale in Amsterdam
</p>
<div className="hero-description">
<p>
I architect and scale backend systems that handle millions of requests.
From payment processing to logistics orchestration, I turn complex
technical challenges into reliable production infrastructure.
{profile.available && (
<p className="status-pill">
<span className="live-dot" />
Open to new opportunities
</p>
)}
<p>
6 years shipping products across <strong>finance</strong>, <strong>ecommerce</strong>, and <strong>logistics</strong>.
I work with Python (Django, FastAPI), JavaScript (React, Node.js), PostgreSQL,
Docker, Redis, and Kubernetes to build systems that just work.
</p>
<h1 className="hero-title">
Hey, I’m {profile.firstName}.
<span className="hero-title-muted">{profile.tagline}</span>
</h1>
<p className="hero-subtitle">{profile.intro}</p>
<div className="hero-actions">
<a href={`mailto:${profile.email}`} className="button button-primary">
Let’s work together
<Icon name="arrowRight" size={16} />
</a>
<a href="#projects" className="button button-ghost">
View projects
</a>
</div>
<SocialLinks />
<div className="hero-meta">
<span className="meta-item">
<Icon name="pin" size={16} /> {profile.location}
</span>
<span className="meta-divider" />
<SocialLinks variant="icons" />
</div>
</div>
<a href="mailto:me@jesseinit.dev" className="primary-cta">
<span>Let's work together</span>
<span className="arrow">→</span>
<div className="hero-visual">
<div className="portrait">
<img src="/hero.jpg" alt={profile.name} className="portrait-image" />
</div>
<div className="terminal-card" aria-hidden="true">
<div className="terminal-bar">
<span />
<span />
<span />
<em>~/whoami</em>
</div>
<pre className="terminal-body">
<code>
<span className="t-prompt">$</span> whoami{'\n'}
<span className="t-accent">
<AnimatedName />
</span>
{'\n'}
<span className="t-prompt">$</span> cat role.txt{'\n'}
<span className="t-muted">{profile.role.toLowerCase()} @ {profile.location.split(',')[0].toLowerCase()}</span>
</code>
</pre>
</div>
</div>
</div>
<div className="shell">
<dl className="stats">
{stats.map((stat, i) => (
<Reveal key={stat.label} className="stat" delay={i * 80}>
<dt className="stat-label">{stat.label}</dt>
<dd className="stat-value">{stat.value}</dd>
</Reveal>
))}
</dl>
</div>
</section>
{/* ABOUT */}
<section id="about" className="section">
<div className="shell">
<SectionHeading index="01" eyebrow="About" title="Engineering for the long run." />
<div className="about-grid">
<Reveal className="about-copy">
{profile.about.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
</Reveal>
<div className="focus-grid">
{focusAreas.map((area, i) => (
<Reveal key={area.title} className="focus-card" delay={i * 80}>
<span className="focus-icon">
<Icon name={area.icon} size={20} />
</span>
<h3 className="focus-title">{area.title}</h3>
<p className="focus-description">{area.description}</p>
</Reveal>
))}
</div>
</div>
</div>
</section>
{/* STACK */}
<section id="stack" className="section">
<div className="shell">
<SectionHeading index="02" eyebrow="Stack" title="Tools I reach for.">
The technologies I use day to day to design, build and run production systems.
</SectionHeading>
<div className="stack-grid">
{stack.map((group, i) => (
<Reveal key={group.group} className="stack-group" delay={i * 80}>
<h3 className="stack-title">{group.group}</h3>
<ul className="tag-list">
{group.items.map((item) => (
<li key={item} className="tag tag-large">
{item}
</li>
))}
</ul>
</Reveal>
))}
</div>
</div>
</section>
{/* PROJECTS */}
<section id="projects" className="section">
<div className="shell">
<SectionHeading index="03" eyebrow="Projects" title="Things I’ve built.">
A mix of production tools and side projects. More on{' '}
<a href="https://github.com/jesseinit" target="_blank" rel="noopener noreferrer" className="text-link">
GitHub
</a>
.
</SectionHeading>
<div className="project-grid">
{projects.map((project, i) => (
<Reveal key={project.title} delay={(i % 3) * 80} className={project.featured ? 'span-2' : ''}>
<ProjectCard project={project} />
</Reveal>
))}
</div>
</div>
</section>
<div className="hero-image-wrapper">
<div className="image-backdrop"></div>
<img
src="hero.jpg"
alt="Jesse Egbosionu"
className="hero-image"
/>
</div>
{/* CONTACT */}
<section id="contact" className="section">
<div className="shell">
<Reveal className="contact-card">
<p className="eyebrow">
<span className="eyebrow-index">04</span>
Contact
</p>
<h2 className="contact-title">Have a system that needs to scale?</h2>
<p className="contact-lead">
I’m always happy to talk about backend architecture, interesting problems or new roles. My inbox is open.
</p>
<div className="hero-actions">
<a href={`mailto:${profile.email}`} className="button button-primary">
<Icon name="mail" size={16} />
{profile.email}
</a>
<SocialLinks variant="pills" />
</div>
</Reveal>
</div>
</section>
</Layout>