/* global React */
// Hi-fi Portfolio — Minimal Modernist
// Components for the polished single-page site
const HeroAmbient = () => {
// subtle drifting noise/blob field — SVG, low opacity, slow
return (
{/* slow drifting blobs */}
{/* faint horizon line */}
{/* grain overlay */}
);
};
const Hero = () => (
Open to junior full-stack roles · remote-friendly · 2026
@SevenLawless — 101
Zakaria Zaoui,
junior full-stack developer.
A small portfolio. A few projects. Honest notes on what I'm learning,
and a brain to show you how it all connects.
);
const About = () => (
02
about
a paragraph, some facts
A short introduction .
I'm Zakaria Zaoui — a junior full-stack developer based in Morocco
and open to remote work. I build practical web applications, backend APIs,
automation tools, and database-backed systems using technologies like React,
Node.js, Express, Python, SQL, and MySQL.
I care about building software that solves real problems, not just looks
good in screenshots. I like clean workflows, stable backends, clear data,
simple interfaces, and products that are useful enough to become part of
someone's daily routine — especially mine.
Outside of code, I'm into gaming, 3D design, boxing, and hiking. I enjoy
anything that mixes logic and creativity, especially when it helps me
advance in life, learn faster, or build something more useful than
a normal portfolio piece.
{[
['Based in', 'Morocco · open to remote work'],
['Stack', 'React · Vite · Node.js · Express · Python · SQL · MySQL'],
['Status', 'Open to junior developer, Python, backend, full-stack, application support, technical support, freelance, and collaboration opportunities.'],
['Outside', 'Gaming · 3D design · Boxing · Hiking'],
['Years in', 'Since I can remember'],
].map(([k, v]) => (
{k}
{v}
))}
);
// ===== BRAIN =====
const PROJECTS = [
{
id: 1,
title: 'ChioOS',
tag: 'web app',
side: 'L',
desc: 'Private Life OS for expenses, workouts, jobs, documents, media, backups, and personal workflows.',
tags: ['React', 'Vite', 'Node.js', 'Express', 'MySQL'],
repo: 'https://github.com/SevenLawless/ChioOSVP'
},
{
id: 2,
title: 'Sheriff — Doc',
tag: 'AI / OCR',
side: 'L',
desc: 'AI-assisted OCR pipeline for classifying and extracting data from scanned French and Arabic legal files.',
tags: ['Python', 'OCR', 'NLP', 'SQL', 'APIs'],
repo: 'https://github.com/SevenLawless/LegalDocClass'
},
{
id: 3,
title: 'Buggy',
tag: 'support tool',
side: 'L',
desc: 'Bug-tracking dashboard for managing projects, issues, incidents, and resolution workflows.',
tags: ['React', 'Node.js', 'Express', 'MySQL', 'REST APIs'],
repo: 'https://github.com/SevenLawless/Buggy'
},
{
id: 4,
title: 'Poms AI',
tag: 'creative AI',
side: 'R',
desc: 'Creative prompt-building tool for generating richer image prompts using style, mood, lighting, and composition.',
tags: ['React', 'Vite', 'Prompt Engineering', 'UI Design', 'AI Workflows'],
repo: 'https://github.com/SevenLawless/Poms_v2'
},
{
id: 5,
title: 'CaseForge AI',
tag: 'developer tool',
side: 'R',
desc: 'Turns rough project notes into polished case studies, README sections, and resume bullets.',
tags: ['React', 'Vite', 'JavaScript', 'LocalStorage', 'AI Workflows'],
repo: 'https://github.com/SevenLawless/CaseForge-AI'
}
];
// 1240 x 1380 viewBox — taller stage so cards don't collide at any width
const BRAIN = (() => {
const W = 1240, H = 1380;
const cx = W/2, cy = 680;
const bw = 460, bh = 320;
return { W, H, cx, cy, bw, bh };
})();
// Anatomical brain path — top-down view of cerebrum
const brainPathD = (() => {
const { cx, cy, bw, bh } = BRAIN;
return `
M ${cx - bw*0.45} ${cy - bh*0.05}
C ${cx - bw*0.55} ${cy - bh*0.32}, ${cx - bw*0.42} ${cy - bh*0.55}, ${cx - bw*0.28} ${cy - bh*0.55}
C ${cx - bw*0.22} ${cy - bh*0.62}, ${cx - bw*0.08} ${cy - bh*0.6}, ${cx - bw*0.02} ${cy - bh*0.5}
C ${cx + bw*0.02} ${cy - bh*0.62}, ${cx + bw*0.16} ${cy - bh*0.62}, ${cx + bw*0.22} ${cy - bh*0.55}
C ${cx + bw*0.32} ${cy - bh*0.58}, ${cx + bw*0.5} ${cy - bh*0.36}, ${cx + bw*0.48} ${cy - bh*0.1}
C ${cx + bw*0.55} ${cy + bh*0.18}, ${cx + bw*0.42} ${cy + bh*0.42}, ${cx + bw*0.28} ${cy + bh*0.46}
C ${cx + bw*0.18} ${cy + bh*0.58}, ${cx + bw*0.06} ${cy + bh*0.55}, ${cx} ${cy + bh*0.5}
C ${cx - bw*0.06} ${cy + bh*0.55}, ${cx - bw*0.18} ${cy + bh*0.58}, ${cx - bw*0.28} ${cy + bh*0.46}
C ${cx - bw*0.42} ${cy + bh*0.42}, ${cx - bw*0.55} ${cy + bh*0.18}, ${cx - bw*0.45} ${cy - bh*0.05}
Z
`;
})();
// anchor points (where wires meet brain edge) per project
const anchors = {
1: { x: BRAIN.cx - BRAIN.bw*0.5, y: BRAIN.cy - BRAIN.bh*0.45 },
2: { x: BRAIN.cx - BRAIN.bw*0.55, y: BRAIN.cy + BRAIN.bh*0.0 },
3: { x: BRAIN.cx - BRAIN.bw*0.42, y: BRAIN.cy + BRAIN.bh*0.45 },
4: { x: BRAIN.cx + BRAIN.bw*0.5, y: BRAIN.cy - BRAIN.bh*0.4 },
5: { x: BRAIN.cx + BRAIN.bw*0.48, y: BRAIN.cy + BRAIN.bh*0.4 },
};
// card positions (top-left x/y in viewBox space) — spaced ~470px apart for 348px-tall cards
const cardLayout = {
1: { x: 20, y: 30 },
2: { x: 0, y: 510 },
3: { x: 30, y: 990 },
4: { x: 956, y: 80 },
5: { x: 956, y: 920 },
};
const Brain = ({ activeId, setActiveId }) => {
const { W, H, cx, cy, bw, bh } = BRAIN;
const stageRef = React.useRef(null);
// wire color per side
const wireColor = (side) => side === 'L' ? 'var(--red)' : 'var(--blue)';
return (
{/* hemisphere tints */}
{/* connection wires (drawn before card surfaces, after brain tint) */}
{PROJECTS.map(p => {
const a = anchors[p.id];
const c = cardLayout[p.id];
const cardX = p.side === 'L' ? c.x + 264 : c.x;
const cardY = c.y + 60;
const isLeft = p.side === 'L';
const dx = cardX - a.x;
const c1x = a.x + dx * 0.25;
const c1y = a.y;
const c2x = a.x + dx * 0.75;
const c2y = cardY;
const isActive = activeId === p.id;
return (
{/* anchor dot on brain */}
{/* card-side dot */}
{/* gentle pulse along wire when active */}
{isActive && (
)}
);
})}
{/* brain outline */}
{/* longitudinal fissure */}
{/* sulci — left, organic */}
{/* sulci — right */}
{/* cerebellum hint at bottom */}
{/* hemisphere labels */}
L · LOGIC
structure · systems
R · CRAFT
curiosity · feel
{/* tiny scale marks at bottom */}
fig.01 · projects.brain — 5 nodes shown
{/* CARDS */}
{PROJECTS.map(p => {
const c = cardLayout[p.id];
return (
setActiveId(p.id)}
onLeave={() => setActiveId(null)}
/>
);
})}
);
};
const ProjectThumb = ({ id }) => (
);
const ProjectCard = ({ project, xPct, yPct, wPct, hovered, onEnter, onLeave }) => (
0{project.id} / 05
{project.side} · {project.tag}
{project.title}
{project.desc}
{project.tags.map((t, i) => (
{t}
{i < project.tags.length - 1 && · }
))}
view on github
→
);
const Projects = () => {
const [activeId, setActiveId] = React.useState(null);
return (
Half logic. Half feels.
Five projects, sketched as connections from one mind. Hover any thread to follow the wire.
);
};
// ===== SKILLS =====
const SKILL_GROUPS = [
{ label: 'Frontend', items: [
['HTML', 5], ['CSS', 5], ['JavaScript', 5], ['React', 4], ['Vite', 4], ['TypeScript', 4]
]},
{ label: 'Backend', items: [
['Node.js', 5], ['REST APIs', 5], ['Python', 5], ['SQL', 5], ['MySQL', 5], ['Django', 5]
]},
{ label: 'Tools', items: [
['Git / GitHub', 5], ['VS Code', 5], ['Docker', 5], ['VPS hosting', 5], ['Linux / SSH', 5], ['MySQL Workbench', 5], ['Tailscale', 5]
]},
{ label: 'Learning', learning: true, items: [
['Max security VPS', 'learning'], ['Linux server & SSH', 'learning'], ['3D Design', 'learning'], ['Python & SQL depth', 'learning'], ['Data science / ML', 'learning'], ['3D Animation', 'soon']
]},
];
const Skills = () => (
04
skills
tools, honestly rated
What I work with.
Dots are confidence, not years. wip means I'm still learning out loud.
{SKILL_GROUPS.map(g => (
{g.label}
{g.items.length}
{g.items.map(([name, level]) => (
{name}
{typeof level === 'number' ? (
{[...Array(5)].map((_, i) => (
))}
) : (
{level}
)}
))}
))}
);
// ===== JOURNEY =====
const STOPS = [
{ year: '2022', title: 'Specialized Studies', detail: 'Full-stack development and project management fundamentals.' },
{ year: '2024', title: "Bachelor's Degree", detail: 'Applied Computer Science at Mundiapolis University — thesis on AI integration in commerce.' },
{ year: '2025', title: 'Full-Stack Developer', detail: 'Built and maintained client websites, backend API features, and database apps at Creativity E-Marketing.' },
{ year: '2025', title: 'Robotics Trainer', detail: 'Taught robotics, electronics, sensors, and beginner programming at Coin Etudiant.' },
{ year: '2026', title: 'Building ChioOS', detail: 'Building a private full-stack Life OS while improving Docker, VPS, Linux, SSH, and project architecture.', state: 'now' },
{ year: '2026', title: 'Junior dev role', detail: 'Targeting junior full-stack, backend, application support, technical support, freelance, and collaboration.', state: 'next' },
];
const Journey = () => (
05
journey
career & milestones
A timeline of milestones .
From specialized studies to real products, one step at a time.
{STOPS.map((s, i) => (
{s.year}
{s.title}
{s.detail}
))}
);
const Contact = () => (
);
window.PortfolioApp = { Hero, About, Projects, Skills, Journey, Contact };