What it is
This portfolio is one Angular app with no UI library or CSS framework: every layout, component, and animation is written for it. The contact form sends real email through a small serverless function, and the pages are built to load light and work with a keyboard.
What’s inside
Angular 22 with standalone components, signals, and OnPush change detection. It runs without zone.js.
Motion comes from GSAP (ScrollTrigger, SplitText, and ScrambleText) on the home page and AOS elsewhere. Both switch off for visitors who prefer reduced motion.
Photos and screenshots are WebP in several widths, so a phone downloads a small file and a wide screen gets a sharp one.
Each page sets its own title, description, and social tags. The site also ships JSON-LD, a sitemap, and a skip link for keyboard users.
The contact form posts to a serverless function on Vercel. It validates the message, catches bots with a hidden field, slows down repeat senders, and sends the email with Nodemailer.
Take a look
The home page pairs the headline with a short project-start form, so a visitor can begin a conversation without hunting for a contact page.
The form only asks for what's actually needed to start that conversation, name, project type, and a short description, so filling it out takes under a minute.
Building a form like that, validated, simple, and tied straight into a real workflow, is exactly the kind of custom software this site is built to sell.
The Services page lays out languages and frameworks as a grid of glowing tiles rather than a plain bullet list, since a skills list is more convincing shown than told.
Each tile lights up on hover as a small, deliberate flourish, not because it needed one, but because a page about front-end craft should look like it was actually crafted.
The full breakdown of what each one covers, and what a project built with them actually involves, lives on the Services page itself.
Three maintenance plans sit above a comparison table, so the difference between Basic, Standard, and Priority Care is a scan rather than a reread.
Pricing pages are easy to make confusing. This one tries not to add a row to the table unless it actually changes which plan someone should pick.
The full table, along with one-time build pricing, is on the Pricing page.
On a phone the menu collapses behind a button and the headline stacks into one column, so the page still reads cleanly instead of just shrinking to fit.
If you're looking at this on your own phone right now, that's the same layout doing its job.
Get in touch if you want something built the same way.












