$apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); $resp = curl_exec($ch); curl_close($ch); return json_decode($resp ?: '[]', true) ?: []; } $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? ''; $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; $now = date('Y-m-d H:i:s'); // Fetch images for sections $heroImages = get_images('studio,workspace,creative,editorial'); $workImages = get_images('design,code,analytics'); $testimonialImages = get_images('person,professional,business'); $formData = [ 'name' => '', 'email' => '', 'message' => '', ]; $errors = []; $toast = null; $toastType = 'success'; $mailWarning = null; function ensure_contact_table(): void { db()->exec( "CREATE TABLE IF NOT EXISTS contact_requests ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(120) NOT NULL, email VARCHAR(160) NOT NULL, message TEXT NOT NULL, status VARCHAR(30) NOT NULL DEFAULT 'new', ip_address VARCHAR(45) DEFAULT NULL, user_agent VARCHAR(255) DEFAULT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" ); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $formData['name'] = trim($_POST['name'] ?? ''); $formData['email'] = trim($_POST['email'] ?? ''); $formData['message'] = trim($_POST['message'] ?? ''); if (mb_strlen($formData['name']) < 2) { $errors[] = 'Please enter your name.'; } if (!filter_var($formData['email'], FILTER_VALIDATE_EMAIL)) { $errors[] = 'Please provide a valid email address.'; } if (mb_strlen($formData['message']) < 10) { $errors[] = 'Please add a brief message (at least 10 characters).'; } if (!$errors) { try { ensure_contact_table(); $stmt = db()->prepare( 'INSERT INTO contact_requests (name, email, message, ip_address, user_agent) VALUES (:name, :email, :message, :ip, :agent)' ); $stmt->execute([ ':name' => $formData['name'], ':email' => $formData['email'], ':message' => $formData['message'], ':ip' => $_SERVER['REMOTE_ADDR'] ?? null, ':agent' => $_SERVER['HTTP_USER_AGENT'] ?? null, ]); $to = getenv('MAIL_TO') ?: null; $mailRes = MailService::sendContactMessage( $formData['name'], $formData['email'], $formData['message'], $to, 'New portfolio inquiry' ); if (empty($mailRes['success'])) { $mailWarning = 'Saved your message, but email delivery failed. Please confirm SMTP settings.'; } $toast = 'Thanks for reaching out! I will reply within 1–2 business days.'; $toastType = $mailWarning ? 'warning' : 'success'; $formData = ['name' => '', 'email' => '', 'message' => '']; } catch (Throwable $e) { $errors[] = 'Something went wrong while saving your message. Please try again.'; } } } ?> Personal Portfolio

Product & Brand Designer

Designing calm, precise digital experiences that ship.

I help modern teams turn complex ideas into elegant product experiences. Focused on UX strategy, UI systems, and launch-ready web design.

Availability

New projects from April

Location

New York · Remote

'https://picsum.photos/seed/hero-main/900/1080', 'alt' => 'Creative desk setup with sketches and display screens'], ['src' => 'https://picsum.photos/seed/hero-side-a/720/720', 'alt' => 'Moodboard with typography and color samples'], ['src' => 'https://picsum.photos/seed/hero-side-b/720/720', 'alt' => 'Product interface on a laptop screen'], ['src' => 'https://picsum.photos/seed/hero-side-c/720/720', 'alt' => 'Team workshop notes and sticky planning cards'], ]; $heroSources = []; for ($i = 0; $i < 4; $i++) { $heroSources[$i] = $heroImages[$i] ?? $heroDefaults[$i]; } ?>
<?= htmlspecialchars($heroSources[0]['alt']) ?> Live creative direction
<?= htmlspecialchars($heroSources[1]['alt']) ?> <?= htmlspecialchars($heroSources[2]['alt']) ?>
<?= htmlspecialchars($heroSources[3]['alt']) ?>

Current focus

Visual systems, motion, and product storytelling

Designed to keep the page lively without overpowering the content.

Recent highlights

  • Fintech onboarding revamp +42% activation
  • Healthcare mobile redesign 4.8★ rating
  • SaaS dashboard system 12 screens
UX Strategy Design Systems Web & Mobile Prototyping

Selected work

A handful of case studies covering product strategy, UX, and UI design.

2023 — 2026
'Signal Labs', 'type' => 'Fintech onboarding', 'summary' => 'Simplified KYC flow, redesigned primary journey, and mapped conversion milestones.'], ['title' => 'Northline Health', 'type' => 'Patient app', 'summary' => 'Built a modular design system and streamlined appointment booking.'], ['title' => 'Sprout Commerce', 'type' => 'SaaS analytics', 'summary' => 'Designed a cross-functional dashboard with usage insights for teams.'], ]; foreach ($projects as $i => $project): $img = $workImages[$i] ?? ['src' => 'https://picsum.photos/600/400']; ?>
<?= htmlspecialchars($project['title']) ?>

View case study →

About

I’m a multidisciplinary designer with 9+ years building digital products for startups and enterprise teams. I specialize in UX direction, visual systems, and stakeholder alignment that turns ideas into shipped work.

Figma Webflow Framer Design Systems

Services

  • Product discovery workshops
  • UX & UI design
  • Design system build
  • Launch planning

Focus areas

  • Fintech & SaaS platforms
  • Mobile-first experiences
  • B2B onboarding
  • UX copy + tone

Clients

Stripe, Calm, Notion

Engagements

Strategy · Design · Launch

Testimonials

Short notes from founders and product leads.

Updated March
'“Alex quickly aligned our team and shipped a full design system. The project paid for itself within weeks.”', 'name' => 'Jordan Lee · Product Lead'], ['quote' => '“Clear, structured, and incredibly fast. We felt in control while launching a brand new onboarding.”', 'name' => 'Priya Patel · Founder'] ]; foreach ($testi as $i => $item): $img = $testimonialImages[$i] ?? ['src' => 'https://picsum.photos/100']; ?>
Testimonial photo

Let’s work together

Send a short note about your project or role. I’ll reply with availability, timing, and next steps.

Typical engagements

  • UX audit + roadmap (2 weeks)
  • New product experience (6–8 weeks)
  • Design system sprint (3 weeks)

Contact form

I respond within 48 hours.

This is for testing purposes only — Flatlogic does not guarantee usage of the mail server. Please set up your own SMTP in .env (MAIL_/SMTP_ vars) with out AI Agent.

Admin view: View contact requests