A modern, responsive single-page portfolio website for David Mani Ibrahim showcasing my work as a Web & Mobile Developer / Tech Enthusiast. Built with React, TypeScript, Tailwind CSS, and a Convex backend that powers the contact form.
- Animated hero with a dynamic typing effect that cycles through
Web Developer→Mobile Developer→Tech Enthusiast. - Sticky, scroll-aware navigation with smooth-scrolling links and a mobile hamburger menu.
- About section with bio, profile image, and three pillar cards (Clean Code, Creative Design, Performance).
- Skills section with scroll-triggered, animated progress bars and a tools/platforms grid.
- Projects showcase featuring a carousel for highlighted projects and a responsive tile grid for the rest.
- Contact form whose submissions persist to a Convex database (searchable by email, indexed by creation time).
- Fully responsive, mobile-first design with gradient accents, glassmorphism touches, and subtle background animations.
- Lightning-fast Vite build with TypeScript strict mode and ESLint enforced.
Frontend
Backend
- Convex — serverless database & functions for the contact-form mutation
Tooling
- ESLint 9 +
typescript-eslint+eslint-plugin-react-hooks+eslint-plugin-react-refresh - PostCSS + Autoprefixer
webDev-portfolio/
├── convex/ # Convex backend
│ ├── messages.ts # sendMessage mutation (writes to the messages table)
│ └── schema.ts # messages table definition + indexes
├── public/ # Static assets (profile image, project screenshots, resume)
├── src/
│ ├── components/
│ │ ├── Header.tsx # Sticky nav + mobile menu
│ │ ├── Hero.tsx # Landing section with typing animation
│ │ ├── About.tsx # Bio + feature cards
│ │ ├── Skills.tsx # Progress bars + tools grid
│ │ ├── Projects.tsx # Featured carousel + project grid
│ │ ├── Contact.tsx # Form wired to Convex mutation
│ │ └── Footer.tsx
│ ├── App.tsx # Section composition
│ ├── main.tsx # ConvexProvider + React entry point
│ └── index.css # Tailwind base + global styles
├── index.html
├── tailwind.config.js
├── vite.config.ts
└── tsconfig*.json
- Node.js 18+ and
npm(orpnpm/yarn). - A free Convex account.
npm installCreate a .env.local at the project root:
VITE_CONVEX_URL=https://your-deployment.convex.cloudnpx convex devFollow the prompts to log in and link/create a project, then copy the generated VITE_CONVEX_URL into .env.local.
This deploys:
- the
messagestable (name,email,subject,message,createdAt) with a search index onemailand a regular index oncreatedAt, - the
sendMessagemutation used by the contact form.
npm run devOpen http://localhost:5173 to view the portfolio.
| Script | Description |
|---|---|
npm run dev |
Start the Vite dev server with HMR. |
npm run build |
Type-check and produce a production build. |
npm run preview |
Preview the production build locally. |
npm run lint |
Run ESLint across the project. |
The app is a static SPA once built (npm run build → dist/), so any static host works:
- Run
npx convex deployto push your backend to production and grab the production deployment URL. - Update
VITE_CONVEX_URLin your hosting provider's environment to that production URL. - Deploy
dist/to Vercel, Netlify, Render, GitHub Pages, etc.
Built and maintained by David Mani Ibrahim.
- Email — ibrahimmanidavid@gmail.com
- Phone — +234 803 0488 805
- Location — Adamawa State, Nigeria
- GitHub — @DavidManiIbrahim
- LinkedIn — linkedin.com