import React, { useState, useEffect, useRef } from "react"; import { Github, Linkedin, Facebook, Twitter, Mail, Phone, MapPin, ArrowUpRight, ArrowUp, Moon, Sun, Menu, X, Sparkles, Code2, Server, Cloud, Database, Wrench, Cpu, Search, Send, GraduationCap, Award, ChevronDown, Bot, Building2, TrendingUp, Rocket, Landmark, ExternalLink, Briefcase, Headphones, Users } from "lucide-react"; /* ------------------------------------------------------------------ */ /* Jiwan Pokhrel — portfolio (light-first) */ /* Display: Space Grotesk · Body: Inter · Mono: JetBrains Mono */ /* Accent: violet #7C5CFF → teal #14B8A6 */ /* ------------------------------------------------------------------ */ const FONTS = "https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap"; const THEMES = { light: { bg: "#F6F7FB", bgSoft: "#FFFFFF", text: "#111327", sub: "#535A72", glass: "rgba(255,255,255,0.72)", glassBorder: "rgba(17,19,39,0.09)", navBg: "rgba(246,247,251,0.8)", chip: "rgba(17,19,39,0.05)", shadow: "0 22px 55px rgba(17,19,39,0.12)", blobOp: 0.4, }, dark: { bg: "#070B14", bgSoft: "#0B1120", text: "#E8EAF2", sub: "#9AA3B8", glass: "rgba(255,255,255,0.045)", glassBorder: "rgba(255,255,255,0.09)", navBg: "rgba(7,11,20,0.72)", chip: "rgba(255,255,255,0.06)", shadow: "0 20px 60px rgba(0,0,0,0.45)", blobOp: 0.55, }, }; const ACCENT_A = "#7C5CFF"; const ACCENT_B = "#14B8A6"; const GRAD = `linear-gradient(100deg, ${ACCENT_A}, ${ACCENT_B})`; /* ----------------------------- data ------------------------------- */ const CONTACT = { name: "Jiwan Pokhrel", emails: ["jiwanpokhrel143@gmail.com", "info@techolation.com"], phones: [ { label: "+61 0406 688 975 (AU)", tel: "+610406688975" }, { label: "+977 984 674 2075 (NP)", tel: "+9779846742075" }, ], address: "Manly Vale, Sydney NSW 2093, Australia", socials: [ { icon: Linkedin, href: "https://www.linkedin.com/in/jiwan-pokh/", label: "LinkedIn" }, { icon: Github, href: "https://github.com/jiwanpokh", label: "GitHub" }, { icon: Facebook, href: "https://www.facebook.com/jiwan.pokh/", label: "Facebook" }, { icon: Twitter, href: "https://x.com/jiwanpokh", label: "X (Twitter)" }, ], }; const TYPED_ROLES = [ "Software Developer", "Laravel Developer", "React Developer", "AI Solutions Developer", "IT Support Engineer", "SEO Executive", "Problem Solver", ]; const SUMMARY = "Software developer with 3+ years of hands-on experience building production web applications with object-oriented programming, REST APIs, SQL databases and Git — complemented by ongoing IT support experience across Microsoft Azure and Office 365. Comfortable across the full SDLC in Agile teams, with a strong OOP and MVC foundation that transfers to modern frameworks, and an enthusiast of AI-assisted development to accelerate coding, testing and documentation."; const STATS = [ { value: 3, suffix: "+", label: "Years production experience" }, { value: 4, suffix: "", label: "Companies across AU, US & NP" }, { value: 3, suffix: "", label: "Live products shipped" }, { value: 20, suffix: "+", label: "Technologies used" }, ]; const SKILLS = [ { cat: "Core Development", icon: Code2, items: ["OOP", "MVC & Design Patterns", "REST APIs", "SDLC", "Agile / Scrum", "JIRA"] }, { cat: "Languages & Frameworks", icon: Server, items: ["PHP (Laravel)", "JavaScript", "React", "Vue.js", "C / C++", "Java", "HTML5 / CSS3", "Bootstrap", "Tailwind", "jQuery"] }, { cat: "Databases", icon: Database, items: ["MySQL", "Oracle Database", "SQL Server", "Relational DB design"] }, { cat: "Cloud & IT", icon: Cloud, items: ["Microsoft Azure", "Office 365", "Active Directory", "VMware / Hyper-V", "Network Administration"] }, { cat: "Version Control & Tools", icon: Wrench, items: ["Git / GitHub", "VS Code", "cPanel", "GitHub Copilot", "Claude"] }, { cat: "SEO & Analytics", icon: Search, items: ["Google Analytics", "Search Console", "SEMrush", "Ahrefs", "AdWords"] }, ]; const PROJECTS = [ { title: "AI Receptionist", cat: "AI", icon: Bot, status: "In development · 2026", blurb: "AI-powered phone answering system integrating Twilio for call handling with an LLM for natural conversation — automatically takes customer orders and answers FAQs in real time.", stack: ["Twilio", "LLM", "Laravel", "Voice AI"], link: null, }, { title: "Investnestly", cat: "Web", icon: TrendingUp, status: "Live", blurb: "Investment syndicate platform for collecting monthly investor contributions, tracking project profit & loss, and managing multiple concurrent projects and new concept submissions. Multi-role investor/admin login with OAuth-based authentication.", stack: ["Laravel", "OAuth", "MySQL", "Multi-role Auth"], link: "https://investnestly.com", }, { title: "Topifyglobe", cat: "Web", icon: Rocket, status: "Live", blurb: "Vite + React web application deployed to cPanel hosting with a custom GitHub-webhook CI/CD pipeline that builds and deploys automatically on every push.", stack: ["Vite", "React", "CI/CD", "cPanel"], link: "https://topifyglobe.com", }, { title: "Ward Office Web App", cat: "Web", icon: Landmark, status: "Delivered", blurb: "Laravel-based web application built for a local ward office in Pokhara, alongside responsive websites for local organisations — with accessibility and cross-browser improvements.", stack: ["Laravel", "Bootstrap", "Accessibility"], link: null, }, ]; const EXPERIENCE = [ { role: "Website Developer & Administrator", org: "Totteri LLC — Texas, USA (Remote)", period: "May 2024 – Present", icon: Briefcase, points: [ "Develop and maintain multiple Laravel, WordPress and Drupal web applications, including database design and REST API integrations with backend services.", "Build UI pages with Vue.js, HTML5, CSS3, JavaScript and Bootstrap; created admin tools that streamline content add/update/delete workflows.", "Manage content migration and SEO/metadata optimisation for global client websites; migrate and maintain Laravel apps on cPanel with QA and deployment support.", ], stack: ["Laravel", "Vue.js", "WordPress", "Drupal", "REST APIs"], }, { role: "IT Support (Part-Time)", org: "Ricoh — Sydney, Australia", period: "Mar 2023 – Present", icon: Headphones, points: [ "Provide technical support for Office 365, Active Directory and Azure cloud services — deployment, monitoring and troubleshooting.", "Resolve end-user tickets and hardware/software issues across desktops, laptops and mobile devices via ticketing systems.", "Support network administration (router/switch config), VMware/Hyper-V virtualisation, backup & disaster recovery, and system security audits.", ], stack: ["Azure", "Office 365", "Active Directory", "VMware"], }, { role: "Web Developer & SEO Executive", org: "Swayanj Solution — Kathmandu, Nepal", period: "Feb 2021 – Apr 2022", icon: Search, points: [ "Developed and maintained responsive websites with HTML, CSS, JavaScript and PHP; built an internal reporting web app for weekly departmental performance reports.", "Customised WordPress themes and plugins; managed Google Analytics/AdWords campaigns to grow traffic and conversions.", "Ran keyword research and on/off-page SEO, monitored performance via SEMrush and built quality backlinks.", ], stack: ["PHP", "WordPress", "SEO", "Google Analytics"], }, { role: "Web Developer Intern", org: "CodeSastra Pvt. Ltd. — Pokhara, Nepal", period: "Sep 2017 – Oct 2020", icon: Code2, points: [ "Built responsive websites for local organisations using WordPress, Bootstrap, HTML, CSS and JavaScript, plus a Laravel web app for a local ward office.", "Assisted senior developers with coding, testing and debugging; contributed to UAT, accessibility improvements and cross-browser compatibility.", ], stack: ["WordPress", "Laravel", "Bootstrap"], }, { role: "Customer Service Representative", org: "Woolworths, Warringah Mall · Valentine Woodfire Pizzeria, Narrabeen", period: "Dec 2022 – May 2023", icon: Users, points: [ "Delivered frontline customer service, resolved complaints and managed high volumes of phone, email and in-person enquiries.", ], stack: ["Communication", "Customer Service"], }, ]; const EDUCATION = [ { title: "Bachelor of Software Engineering — 2019, Nepal", org: "Coursework: Data Structures & Algorithms, DBMS, OOP & UML Design, Software Testing & QA, Cloud Computing, Enterprise Application Development.", extra: "Capstone: led a 3-person team building a student enrollment web app with online payment and admin document verification.", icon: GraduationCap, }, { title: "Core Strengths", org: "Teamwork & collaboration across cross-functional, cross-cultural teams · Problem-solving with practical, efficient solutions · Leadership & clear communication with technical and non-technical stakeholders.", extra: null, icon: Award, }, ]; const NAV = ["About", "Skills", "Experience", "Projects", "Contact"]; /* Formspree — submissions are emailed to you and stored in your Formspree dashboard (https://formspree.io/forms). */ const FORMSPREE_URL = "https://formspree.io/f/mykryrov"; /* ----------------------------- hooks ------------------------------- */ function useTyping(words, speed = 70, pause = 1600) { const [text, setText] = useState(""); const [i, setI] = useState(0); const [del, setDel] = useState(false); useEffect(() => { const word = words[i % words.length]; let t; if (!del && text === word) t = setTimeout(() => setDel(true), pause); else if (del && text === "") { setDel(false); setI(v => v + 1); } else t = setTimeout(() => { setText(word.slice(0, text.length + (del ? -1 : 1))); }, del ? speed / 2 : speed); return () => clearTimeout(t); }, [text, del, i, words, speed, pause]); return text; } function useReveal() { useEffect(() => { const io = new IntersectionObserver( es => es.forEach(e => e.isIntersecting && e.target.classList.add("in")), { threshold: 0.1 } ); document.querySelectorAll(".rv").forEach(el => io.observe(el)); return () => io.disconnect(); }, []); } function useScrollSpy(ids) { const [active, setActive] = useState(""); useEffect(() => { const io = new IntersectionObserver( es => es.forEach(e => e.isIntersecting && setActive(e.target.id)), { rootMargin: "-40% 0px -55% 0px" } ); ids.forEach(id => { const el = document.getElementById(id); if (el) io.observe(el); }); return () => io.disconnect(); }, [ids]); return active; } function Counter({ value, suffix }) { const [n, setN] = useState(0); const ref = useRef(null); const started = useRef(false); useEffect(() => { const io = new IntersectionObserver(es => { if (es[0].isIntersecting && !started.current) { started.current = true; const t0 = performance.now(); const tick = now => { const p = Math.min((now - t0) / 1200, 1); setN(Math.round(value * (1 - Math.pow(1 - p, 3)))); if (p < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); } }, { threshold: 0.5 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, [value]); return {n}{suffix}; } /* --------------------------- components --------------------------- */ /* 3D tilt wrapper — cards lean toward the cursor */ function Tilt({ children, max = 7, style }) { const ref = useRef(null); const onMove = e => { const el = ref.current; if (!el || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const r = el.getBoundingClientRect(); const x = (e.clientX - r.left) / r.width - 0.5; const y = (e.clientY - r.top) / r.height - 0.5; el.style.transform = `perspective(800px) rotateY(${x * max}deg) rotateX(${-y * max}deg) translateY(-4px)`; el.style.setProperty("--mx", `${(x + 0.5) * 100}%`); el.style.setProperty("--my", `${(y + 0.5) * 100}%`); }; const onLeave = () => { if (ref.current) ref.current.style.transform = ""; }; return (
{children}
); } /* Magnetic button — nudges toward the cursor */ function Magnetic({ children }) { const ref = useRef(null); const onMove = e => { const el = ref.current; if (!el || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const r = el.getBoundingClientRect(); const x = e.clientX - r.left - r.width / 2; const y = e.clientY - r.top - r.height / 2; el.style.transform = `translate(${x * 0.18}px, ${y * 0.18}px)`; }; const onLeave = () => { if (ref.current) ref.current.style.transform = ""; }; return ( {children} ); } /* Cursor spotlight that follows the pointer across the whole page */ function Spotlight({ dark }) { const ref = useRef(null); useEffect(() => { const move = e => { if (ref.current) ref.current.style.background = `radial-gradient(560px circle at ${e.clientX}px ${e.clientY}px, ${dark ? "rgba(124,92,255,0.10)" : "rgba(124,92,255,0.08)"}, transparent 70%)`; }; window.addEventListener("pointermove", move); return () => window.removeEventListener("pointermove", move); }, [dark]); return
; } function Aurora({ T }) { const a = useRef(null), b = useRef(null), c = useRef(null); useEffect(() => { const move = e => { const x = e.clientX / window.innerWidth - 0.5; const y = e.clientY / window.innerHeight - 0.5; if (a.current) a.current.style.transform = `translate(${x * 60}px, ${y * 60}px)`; if (b.current) b.current.style.transform = `translate(${x * -45}px, ${y * -45}px)`; if (c.current) c.current.style.transform = `translate(${x * 25}px, ${y * -25}px)`; }; window.addEventListener("pointermove", move); return () => window.removeEventListener("pointermove", move); }, []); return (
); } function Eyebrow({ children }) { return (
{children}
); } function H2({ children, T }) { return (

{children}

); } function Card({ children, T, style, glow = true }) { return (
{children}
); } /* ------------------------------ app ------------------------------- */ export default function App() { const [dark, setDark] = useState(false); // light mode first const [menu, setMenu] = useState(false); const [filter, setFilter] = useState("All"); const [form, setForm] = useState({ name: "", email: "", msg: "" }); const [status, setStatus] = useState("idle"); // idle | sending | sent | error const T = dark ? THEMES.dark : THEMES.light; const typed = useTyping(TYPED_ROLES); const active = useScrollSpy(NAV.map(n => n.toLowerCase())); useReveal(); useEffect(() => { if (!document.getElementById("gf")) { const l = document.createElement("link"); l.id = "gf"; l.rel = "stylesheet"; l.href = FONTS; document.head.appendChild(l); } }, []); const go = id => { setMenu(false); document.getElementById(id)?.scrollIntoView({ behavior: "smooth" }); }; const cats = ["All", "AI", "Web"]; const shown = PROJECTS.filter(p => filter === "All" || p.cat === filter); const submitForm = async () => { if (!form.name || !form.email || !form.msg || status === "sending") return; setStatus("sending"); try { const res = await fetch(FORMSPREE_URL, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json" }, body: JSON.stringify({ name: form.name, email: form.email, message: form.msg, _subject: `Portfolio enquiry from ${form.name}`, }), }); if (res.ok) { setStatus("sent"); setForm({ name: "", email: "", msg: "" }); } else { setStatus("error"); } } catch { setStatus("error"); } }; return (
{/* NAV */}
{menu && (
{NAV.map(n => ( ))}
)}
{/* HERO */}
~ manly vale, sydney · open to opportunities

Hi, I'm Jiwan Pokhrel.

> {typed}

{SUMMARY}

{CONTACT.socials.map(s => ( ))}
{/* ABOUT */}
about me

Building for the web,
learning for the future.

I'm a software developer based in Sydney, working remotely with{" "} Totteri LLC (Texas, USA) on Laravel, WordPress and Drupal applications, while providing part-time IT support at{" "} Ricoh across Azure, Office 365 and Active Directory. Before Australia, I built websites and ran SEO campaigns in Nepal — from an internship in Pokhara to an SEO executive role in Kathmandu.

I'm comfortable across the full software development lifecycle in Agile teams, and genuinely enthusiastic about AI-assisted development — I use tools like GitHub Copilot and Claude daily to move faster on coding, testing and documentation. My goal: keep learning and grow into a SaaS engineering team.

{STATS.map(s => (
{s.label}
))}
{/* SKILLS */}
technical skills

What my toolbox includes

A strong OOP and MVC foundation, production frameworks, and the cloud & IT skills to keep everything running — plus the SEO know-how to make it visible.

{SKILLS.map(g => (
{g.cat}
{g.items.map(i => {i})}
))}
{/* EXPERIENCE */}
experience

Where I've worked

{EXPERIENCE.map(e => (
{e.role}
{e.org}
{e.period}
    {e.points.map(p =>
  • {p}
  • )}
{e.stack.map(s => {s})}
))} {EDUCATION.map(e => (
{e.title}
{e.org}
{e.extra &&
{e.extra}
}
))}
{/* PROJECTS */}
key projects

Things I've shipped (and am shipping)

{cats.map(c => ( ))}
{shown.map(p => (
{p.title} {p.status}

{p.blurb}

{p.stack.map(s => {s})}
{p.link && ( Visit site )}
))}
{/* CONTACT */}
contact

Have a project or a role in mind?
Please drop a message.

Get in touch and let me know how I can help — I'll be in touch as soon as possible.

Address
{CONTACT.address}
Phone {CONTACT.phones.map(p => ( ))}
Email {CONTACT.emails.map(e => ( ))}
{status === "sent" ? (

Message sent!

Thanks for reaching out — I'll get back to you as soon as possible.

) : (