0XVINCE
- 8 Devlogs
- 45 Total hours
It's very personal to me :D
It's very personal to me :D
Refactored the codebase after review feedback — real types, shared components, and copy that actually sounds like me
Got flagged for overusing AI in the submission, so I went back through the whole thing file by file instead of just tweaking the surface. Turned into a proper refactor pass.
Project and ExperienceItem in lib/data.ts were missing fields (status, link, impact, highlights), so every component consuming them was littered with as any. Extended the actual types and removed every cast.Badge and TerminalWindow — the same colored-badge markup was copy-pasted near-identically across Projects.tsx, Experience.tsx, CTF.tsx, and Contact.tsx, and the terminal-window mock was duplicated in two more places. Pulled both into shared components.lib/brevo.ts had a full HTML “email card” builder with its own design-token constants and a hand-rolled escapeHtml, for an email that only ever lands in my own inbox. Cut it down to what the contact form actually needs.color.replace("1)", "0.2)") to derive a lighter shade from an rgba string was showing up in three different files. Replaced with actual stored bg values.data.ts and About.tsx all had the same over-polished, bolded-keyword rhythm you get from one AI pass. Rewrote it to sound like how I'd actually describe this stuff./public and a stale implementation.md that no longer matched the site.scroll-behavior build warning while I was in there.The flag wasn’t wrong to catch — a lot of this genuinely read as generated: duplicated markup that was never refactored, any-casts instead of fixed types, an over-engineered email builder for a one-off form, and bio copy that hit every AI-bio beat (bolded keywords, tidy aphoristic closers). Going through it properly meant fixing the root causes — bad types, real duplication — not just rewording things. Ended up being a better codebase either way, not just a resubmission.
Rewrote the README to actually tell the story — from “way too extra” to stripped down and fast
Went back through and rewrote the whole README instead of just patching the stack table. The old version was still describing the Framer Motion / matrix rain / glitch loader era even after most of that got ripped out — docs had drifted from what the site actually does.
/uses page and dropped references to features that no longer exist.pnpm install / pnpm dev / pnpm check instead of npm, matching the actual workspace config.src/app, src/components, src/lib layout instead of the old flat structure.pnpm check from day one instead of relying on build to catch mistakes.Docs that describe features you already deleted are worse than no docs — anyone landing on the repo (recruiter, hiring manager, another dev) would’ve read about a matrix-rain loader that doesn’t exist anymore. Rewriting it to match reality, and being upfront about the “too extra” phase instead of hiding it, is the same instinct as the frontend rework itself: cut what doesn’t need to be there.
Reworked the frontend performance by stripping out Framer Motion and eliminating heavy UI animations to fix site bloat and maximize loading speed.
What’s in it
prefers-reduced-motion settings.:hover, :focus-visible).Why this fits
Refactored directly in response to submission feedback (“your project has heavy UI usage, please rework the frontend and resubmit”). Stripping unnecessary motion bloat aligns the portfolio with a core cybersecurity principle: prioritizing speed, efficiency, and zero-fluff performance over visual bloat.
Added a custom 404 page styled as a hacker terminal — fitting the cybersecurity theme instead of using a generic “page not found.”
nmap scan output styled to look like a real terminal sessionvincentiwuno.me/???) as if probing it404 (echo $?) — a small detail that doubles as both a joke and the actual HTTP statusKeeps the visitor inside the site’s aesthetic even when they hit a broken link, instead of dropping them into a default framework error page. Small detail, but it’s the kind of thing that reinforces the whole cybersecurity-portfolio identity rather than breaking it.
Wired up email sending with Brevo so contact form submissions land straight in my inbox.
Built out the /contact page with a subject dropdown (security consultation, pentesting inquiry, CTF collaboration, job opportunity, etc.) and a message field, backed by Brevo to actually deliver the emails instead of just sitting in a form with nowhere to go.
Ran into domain/IP verification issues with Brevo — emails weren’t sending properly until the sending domain was correctly verified. Had to go through and set up the DNS/domain verification properly on Brevo’s side before delivery actually started working.
Added Hacker style Art loading
writing up blogs
My personal website portfolio