Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ const outfit = Outfit({
});

export const metadata: Metadata = {
title: "Andrés Sánchez - Senior iOS Engineer",
description: "Senior iOS Engineer with 8+ years delivering resilient mobile banking apps for millions of users across Latin America.",
title: "Andrés Sánchez - Senior Engineer",
description: "Senior Engineer with 8+ years delivering resilient mobile banking apps for millions of users across Latin America.",
};

export const viewport: Viewport = {
Expand All @@ -41,7 +41,7 @@ export default function RootLayout({
<div className="absolute top-[-10%] left-[-10%] w-[50vw] h-[50vw] rounded-full bg-indigo-500/5 blur-[100px]" />
<div className="absolute bottom-[-10%] right-[-10%] w-[50vw] h-[50vw] rounded-full bg-purple-900/5 blur-[100px]" />
</div>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
{children}
</ThemeProvider>
</body>
Expand Down
10 changes: 9 additions & 1 deletion components/sections/hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export async function Hero() {
<HeroImage />
</div>

<div className="flex flex-wrap gap-3 mt-2 md:mt-4 items-center">
<div className="grid grid-cols-2 md:flex gap-3 mt-2 md:mt-4 items-stretch text-sm w-fit mx-auto md:w-auto md:mx-0">
<TactileButton
href="#projects"
className="px-8 py-3 rounded-xl border-2 border-accent text-accent font-semibold hover:bg-accent hover:text-black transition-all duration-300"
Expand All @@ -43,6 +43,14 @@ export async function Hero() {
>
Contact Me
</TactileButton>
<TactileButton
href="https://github.com/AndSanG"
target="_blank"
rel="noopener noreferrer"
className="px-8 py-3 rounded-xl border border-white/30 dark:border-white/10 bg-white/20 dark:bg-zinc-900/20 backdrop-blur-sm backdrop-saturate-150 text-zinc-600 dark:text-gray-400 font-semibold hover:bg-white/50 dark:hover:bg-zinc-900/40 hover:text-zinc-900 dark:hover:text-white transition-all duration-300"
>
GitHub
</TactileButton>
<CvDialog />
</div>
</div>
Expand Down
6 changes: 4 additions & 2 deletions components/ui/tactile-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { ReactNode } from "react"

interface Props {
href?: string
target?: string
rel?: string
onClick?: () => void
className?: string
children: ReactNode
}

export function TactileButton({ href, onClick, className = "", children }: Props) {
export function TactileButton({ href, target, rel, onClick, className = "", children }: Props) {
const base = `relative overflow-hidden group flex items-center justify-center active:scale-95 transition-transform duration-100 ${className}`
const shine = (
<span
Expand All @@ -19,7 +21,7 @@ export function TactileButton({ href, onClick, className = "", children }: Props

if (href !== undefined) {
return (
<a href={href} className={base}>
<a href={href} target={target} rel={rel} className={base}>
<span className="relative z-10 flex items-center gap-2">{children}</span>
{shine}
</a>
Expand Down
Binary file added public/projects/bsc-thesis-3d-printer.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/msc-ml-projects.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 8 additions & 6 deletions src/infrastructure/repositories/in-memory-about-repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@ export class InMemoryAboutRepository implements AboutRepository {
return {
name: "Andrés Sánchez",
heroDescription: [
"Senior Mobile & Frontend Engineer with 8+ years of experience delivering secure, high-performance banking platforms for millions of users.",
"Specializing in iOS native architecture, React Native bridges, and React microfrontends.",
"Proven track record in FinTech security compliance, CI/CD automation, and high-volume mobile systems.",
"Senior Software Engineer with 8+ years of experience delivering secure, high-performance banking platforms for millions of users.",
"iOS-native at the core, with React Native bridging and React microfrontends on the hybrid side.",
"Deep background in FinTech security compliance, CI/CD automation, and high-volume mobile systems.",
"Endurance athlete and coffee enthusiast.",
"Structure creates freedom, details create intuition, discipline creates flow."
],
bio: [
"Andrés has spent 8+ years building resilient mobile banking apps and frontend platforms for millions of users—maintaining high-stability operations under strict SLAs and high-volume production loads.",
"His work spans the full mobile and hybrid stack, with deep expertise in Swift/iOS native module development, React Native, and React microfrontends. He focuses on clean architecture, security compliance (PCI DSS, OWASP MASVS, ISO 27001), and end-to-end telemetry observability.",
"I've spent 8+ years building resilient mobile banking apps and frontend platforms for millions of users, maintaining high-stability operations under strict SLAs and high-volume production loads.",
"My work spans the full mobile and hybrid stack, with deep expertise in Swift/iOS native module development, React Native, and React microfrontends. I focus on clean architecture, security compliance (PCI DSS, OWASP MASVS, ISO 27001), and end-to-end telemetry observability.",
"I hold an MSc in Applied Computer Science from Vrije Universiteit Brussel (Distinction), with a thesis comparing statistical language models against cognitive architectures for AI explainability, and hands-on ML projects in PyTorch and scikit-learn.",
],
stats: [
{ label: "Years of Experience", value: "8+" },
Expand All @@ -23,7 +24,8 @@ export class InMemoryAboutRepository implements AboutRepository {
],
skills: [
"Swift", "SwiftUI", "UIKit", "Combine",
"React 18", "TypeScript", "React Native", "Cordova",
"React 18", "TypeScript", "React Native",
"Python", "PyTorch", "Keras", "NumPy", "scikit-learn",
"Clean Architecture", "VIPER", "MVVM-C", "Server-Driven UI", "Microfrontends",
"Jest", "XCTest", "TDD",
"Fastlane", "CI/CD", "GitHub Actions",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export class InMemoryExperienceRepository implements ExperienceRepository {
year: "2023 - 2025",
title: "Senior Software Engineer (iOS · React / React Native)",
company: "iuvity (Todo1 Services Inc.)",
description: "Senior Software Engineer and platform technical reference for iuviBANKINGiuvity's white-label banking SaaS deployed across regional financial institutions. Served as the quality certification gatekeeper for production handovers. Architected the AppShell web-to-native bridge contract, engineered React microfrontends, and authored secure Swift/Objective-C native modules for the React Native container.",
description: "Senior Software Engineer and platform technical reference for iuviBANKING, iuvity's white-label banking SaaS deployed across regional financial institutions. Served as the quality certification gatekeeper for production handovers. Architected the AppShell web-to-native bridge contract, engineered React microfrontends, and authored secure Swift/Objective-C native modules for the React Native container.",
imagePath: '/iuvity.jpeg',
color: "text-green-600"
},
Expand All @@ -18,16 +18,16 @@ export class InMemoryExperienceRepository implements ExperienceRepository {
year: "2020 - 2023",
title: "Senior iOS Engineer",
company: "iuvity (Todo1 Services Inc.)",
description: "Engineered high-availability mobile banking solutions for Bancolombia (10M+ users). Achieved 99.9% crash-free session rates while meeting strict 99.5% system availability SLAs. Modernized codebase architectures from legacy MVC to VIPER and MVVM-C, reducing coupling and enforcing an 80%+ unit testing standard. Delivered secure, regulatory-compliant mobile features (FaceID, Apple Pay, freeRASP).",
description: "Engineered high-availability mobile banking solutions for Bancolombia (10M+ users). Achieved 99.9% crash-free session rates while meeting strict 99.5% system availability SLAs. Modernized the codebase architecture from legacy MVC to VIPER and MVVM-C, reducing coupling and enforcing an 80%+ unit testing standard. Delivered secure, regulatory-compliant mobile features (FaceID, Apple Pay, freeRASP).",
imagePath: '/iuvity.jpeg',
color: "text-green-700 dark:text-green-500"
},
{
id: "2018",
year: "2018 - 2020",
title: "MSc Applied Computer Science",
company: "Vrije Universiteit Brussel — Brussels, Belgium",
description: "Government-funded scholarship. Graduated with Distinction. Thesis: Minimalistic AI Architectures for Language Models — developed a cognitive architecture for explainable AI bridging statistical language modeling and brain-inspired predictive processing.",
company: "Vrije Universiteit Brussel",
description: "Government-funded scholarship. Graduated with Distinction. Thesis: Minimalistic AI Architectures for Language Models. Developed a cognitive architecture for explainable AI that connects statistical language modeling with brain-inspired predictive processing.",
imagePath: '/vub.jpeg',
color: "text-sky-600"
},
Expand All @@ -45,7 +45,7 @@ export class InMemoryExperienceRepository implements ExperienceRepository {
year: "2015 - 2017",
title: "iOS Developer",
company: "Bayteq Cia Ltda",
description: "Built the Supercines Cinema App from concept to App Store, implementing custom seat-selection UI SDKs and PCI DSS-compliant payment integrations. Engineered white-label mobile banking blueprints for Produbanco and integrated biometric identity verification (FacePhi) for Banco Bolivariano.",
description: "Built the Supercines Cinema App from concept to App Store, with custom seat-selection UI SDKs and PCI DSS-compliant payment integrations. Engineered white-label mobile banking blueprints for Produbanco and integrated biometric identity verification (FacePhi) for Banco Bolivariano.",
imagePath: '/bayteq.jpeg',
color: "text-sky-700 dark:text-sky-400"
}
Expand Down
28 changes: 24 additions & 4 deletions src/infrastructure/repositories/in-memory-project-repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export class InMemoryProjectRepository implements ProjectRepository {
const iuvibanking: Project = {
id: 'iuvibanking',
title: 'iuviBANKING Platform',
role: 'Senior Software Engineer Platform Ownership',
role: 'Senior Software Engineer, Platform Ownership',
description: 'Technical reference and quality certification gatekeeper across React microfrontends, React Native shells, and iOS native modules, responsible for stable production handovers.',
challenge: 'Establishing zero-defect handoff protocols across independent product and operations teams, and resolving critical cross-layer failures through technical influence rather than formal authority.',
techStack: ['React', 'React Native', 'Swift', 'TypeScript', 'AWS', 'Modyo DXP', 'OIDC', 'Server-Driven UI'],
Expand All @@ -27,7 +27,7 @@ export class InMemoryProjectRepository implements ProjectRepository {
id: 'supercines',
title: 'Supercines iOS App',
role: 'iOS Developer',
description: 'Cinema booking application featuring a custom seat-selection SDK, PCI DSS-compliant payment integrations, and offline persistence.',
description: 'Cinema booking app with a custom seat-selection SDK, PCI DSS-compliant payment integrations, and offline persistence.',
challenge: 'Building a high-performance interactive seat selection UI SDK using UIKit with custom touch handling, and securing transactional pipelines under strict PCI compliance.',
techStack: ['Swift', 'Objective-C', 'UIKit', 'Core Data', 'MapKit', 'PCI DSS'],
imagePath: '/projects/supercines.webp',
Expand All @@ -46,13 +46,33 @@ export class InMemoryProjectRepository implements ProjectRepository {
const msThesis: Project = {
id: 'msc-thesis-ppm-idyot',
title: 'PPM★ vs IDyOT: Statistical Language Modeling',
role: 'MSc Researcher VUB AI Lab',
role: 'MSc Researcher, VUB AI Lab',
description: 'MSc thesis at Vrije Universiteit Brussel comparing PPM★, a compression-based language model, against IDyOT, a cognitive architecture for hierarchical prediction. Implemented both algorithms in Python, validated against established benchmarks, and identified the optimal IDyOT configuration via KL divergence analysis.',
challenge: 'PPM★ achieves high prediction accuracy as a descriptive black box but offers no cognitive explanation. The challenge was formally documenting IDyOT\'s within-layer interactions (implicit in prior literature), implementing a zero-probability smoothing fix, and connecting statistical accuracy to cognitive plausibility.',
techStack: ['Python', 'PPM★', 'IDyOT', 'Word2Vec', 'Statistical NLP', 'Cognitive Architecture', 'Information Theory'],
imagePath: '/projects/msc-thesis.webp',
}

return [iuvibanking, bancolombia, personalSite, msThesis, supercines]
const bscThesis: Project = {
id: 'bsc-thesis-3d-printer',
title: '3D Print Server with Web UI',
role: 'BSc Researcher, Universidad Técnica de Ambato',
description: 'BSc research paper building a RepRap-based 3D printer with an embedded Raspberry Pi print server and OctoPrint web interface for real-time control and video monitoring over LAN.',
challenge: 'Replacing a full PC with a Raspberry Pi embedded inside the printer structure, integrating mjpg-streamer for live video streaming, and assembling a complete CAD-to-print pipeline using entirely open-source tools.',
techStack: ['Raspberry Pi', 'OctoPrint', 'Raspbian', 'mjpg-streamer', 'RepRap', 'Arduino', 'G-code', 'FreeCAD'],
imagePath: '/projects/bsc-thesis-3d-printer.webp',
}

const mlProjects: Project = {
id: 'msc-ml-projects',
title: 'AI/ML Projects at VUB',
role: 'MSc Student — AI Lab, Vrije Universiteit Brussel',
description: 'AI/ML projects at VUB: implemented ESPCN for image super-resolution in PyTorch (29.7 dB PSNR on BSD300), built logistic regression from scratch on three months of personal health data, and separately implemented kNN, CNNs, backpropagation from scratch, PCA, k-Means, DBSCAN, and collaborative filtering.',
challenge: 'Reproducing ESPCN results with 800 training images against a paper trained on 50,000: the 2-3 dB gap traces back to center-crop-only sampling and missing Gaussian pre-blur on LR inputs. For logistic regression, the meaningful feature was not raw calorie intake but daily excess over budget.',
techStack: ['Python', 'PyTorch', 'Keras', 'NumPy', 'scikit-learn'],
imagePath: '/projects/msc-ml-projects.webp',
}

return [iuvibanking, bancolombia, personalSite, msThesis, mlProjects, supercines, bscThesis]
}
}
Loading