AI Engineer based in Riyadh, Saudi Arabia. This repository is the source of my portfolio site.
Live site: www.tayyabsajjad.com
I build AI products, compete internationally, and mentor other engineers. My work has shipped to teams in the US, UK, and Netherlands, mostly around LLM integration, conversational AI, and intelligent automation. Currently AI Engineer at SAJCO.
- Hackathon track record across LabLab.ai and Pak Angels. Four featured projects: Human to Mars, Period Care, Dr. Well, and Wordsprint Hackathon 5.0.
- CS50x Puzzle Day 2025, Harvard University. Team lead, 1st place, 9 of 9 puzzles solved.
- Advent of Code 2024. Ranked 36th globally out of 252,800+ participants, all 50 stars.
- MIT Coding Contest 2025. 66th worldwide among 500+ teams.
- CALICO Coding Competition 2024, UC Berkeley. Bronze medal, 133rd globally.
- 200+ students mentored, with a Top 1% global mentor ranking on Topmate.
- Featured on a Times Square billboard in NYC.
| Role | Company | Where | When |
|---|---|---|---|
| AI Engineer | SAJCO | Riyadh, Saudi Arabia | Nov 2025 to present |
| AI Engineer | Bluwhale | United States, remote | Sep 2025 to Nov 2025 |
| AI Software Engineer | ReimagineWeb.dev | Netherlands, remote | May 2025 to Sep 2025 |
| Software Engineer, Full Stack and AI | Workedge UK Ltd | United Kingdom, remote | Jan 2025 to May 2025 |
Education: BS in Information Technology, University of Agriculture Faisalabad, 2020 to 2024.
One page, fifteen sections, in render order: Hero, Times Square feature, Hackathon Winners, International Coding Competitions, About, Experience, Volunteer Experience, Education, Research and Publications, Skills, Projects, Achievements and Certifications, Testimonials, Mentorship, and Contact.
Featured projects, each with a GitHub link on the site: Human to Mars, Period Care, Dr. Well, EduNexus 2.0, BizNexus AI, and Sehat Connect.
The nav is a fixed pill with active-section highlighting driven by a scroll listener, plus a "More"
dropdown and a full mobile panel. Section reveals come from a single IntersectionObserver in
app/components/ScrollAnimations.tsx, and the CSS respects prefers-reduced-motion.
Versions below are the ones resolved in package-lock.json.
- Next.js 15.5 with the App Router
- React 19
- TypeScript 5.9
- Tailwind CSS 3.4, with custom animations and scroll-reveal utilities in
app/globals.css - lucide-react for icons
- Resend and zod, server side only, in the contact route
That is the whole stack that runs the site. The repo also carries an unused shadcn/ui scaffold under
components/ui/ and its Radix dependencies. Nothing in app/ imports it.
Images are served straight from public/ with images.unoptimized: true, and next.config.mjs
adds X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, and Referrer-Policy headers
on every route.
The form is the one piece of real backend work in the repo, and it is deliberately all server side.
The client (app/components/Contact.tsx) is plain useState, no form library, and it does nothing
more than POST JSON to /api/contact. The API key never reaches the browser.
app/api/contact/route.ts handles the rest, in this order:
- Per-IP throttle before anything else: 5 messages per hour, tracked in an in-process
Mapkeyed on the firstx-forwarded-forentry, returning 429 over the limit. The route is explicit in its own comments that this is best effort, since serverless instances do not share memory. It slows floods that reuse a warm instance rather than enforcing a global cap. Only successful sends count against the quota, so a validation error costs the sender nothing. - Guarded JSON parse, returning 400 on a malformed body.
- zod validation with trimmed strings and hard length caps: name 1 to 100, email up to 200, subject 1 to 150, message 1 to 5000.
- Honeypot. A hidden
websitefield is rendered off screen withtabIndex={-1}andaria-hidden. If it is filled, the route returns a normal success and sends nothing, so bots never learn they were caught. - Env guard, returning 500 if the Resend config is missing.
- Per-request Resend client. Constructing it at module scope would break the build, because Resend throws on a missing key and Next evaluates route modules at build time.
- HTML escaping on every user value before it reaches the email body.
- Notification email to my inbox with
replyToset to the sender, then a fixed-text auto reply to the sender. The auto reply echoes none of their input on purpose: reflecting a caller-supplied name, subject, or message would turn the endpoint into a relay for sending arbitrary content from a domain that passes SPF, DKIM, and DMARC. An auto-reply failure is logged and does not fail the request.
git clone https://github.com/devtayyabsajjad/Portfolio.git
cd Portfolio
npm install
npm run devThe site runs at http://localhost:3000. An .npmrc in the repo sets legacy-peer-deps=true, so a
plain npm install resolves correctly. Next.js 15 needs Node 18.18 or newer.
Copy .env.example to .env.local and fill it in. All three are server side, so never prefix them
with NEXT_PUBLIC_.
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxxxx
CONTACT_FROM_EMAIL="Your Name <hello@yourdomain.com>"
CONTACT_TO_EMAIL=you@example.comCONTACT_FROM_EMAIL has to be a verified sender on a domain you own in Resend. Without these three
set, the rest of the site works fine and the form returns "Email is not configured."
| Script | What it does |
|---|---|
npm run dev |
Development server |
npm run build |
Production build |
npm run start |
Serve the production build |
There is also a lint script, but the repo has no ESLint dependency or config yet, so running it
would start Next's ESLint setup rather than lint anything. Note that next.config.mjs sets
eslint.ignoreDuringBuilds, so a passing build skips linting; type errors do fail the build, and
npx tsc --noEmit runs the same check standalone.
Deployed on Vercel. vercel.json pins the install and build commands:
{
"installCommand": "npm install --legacy-peer-deps",
"buildCommand": "npm run build"
}The three contact variables live in the Vercel project settings. The apex to www redirect is domain configuration, not code. Dependabot runs weekly on Mondays and groups minor and patch updates into a single PR, with a cap of five open PRs.
- Email: devtayyabsajjad@gmail.com
- GitHub: github.com/devtayyabsajjad
- LinkedIn: linkedin.com/in/devtayyabsajjad
- Book a call: topmate.io/tayyabsajjad
Open to contract work, startup ideas, and hackathon teams.
This repository has no license file, so the code, copy, and images are not licensed for reuse. Read it, learn from it, and ask me first if you want to use any of it.