Live: ehasanlive.com · Features
Personal website of S M Ehasanul Haque — Odoo & full-stack developer at DUPNO International, Dhaka. It shows the SaaS products I've shipped (Hajj Tracking, Taka Tracker, Trade ERP, MY-Card), the Odoo 12 modules I built for DUPNO, my stack, my journey, and a way for clients to start a project.
- Bangla + English — every line of content switches language, including the chat assistant.
- Dark / light / system theme and five accent colors (Emerald, Gold, Ocean, Violet, Rose), saved per device and applied before first paint.
- Command palette — ⌘K / Ctrl K jumps to any section or project, copies the email, downloads the CV, switches theme or language.
- Case studies — each product and Odoo module opens in a modal with screenshots, highlights, stack and links.
- Fabrito, the chat assistant — answers questions about projects, Odoo work, stack and hiring from the site's own data (no external API), in Bangla or English, with quick-reply chips and action buttons.
- Motion — Lenis smooth scrolling, stacking product cards, letter-by-letter hero, orbiting stack, magnetic buttons, pointer-following spotlights. A "Reduced motion" setting (and the OS preference) turns it all down.
- Contact form — sends through EmailJS when configured, otherwise opens the visitor's email app with the message filled in; one-tap WhatsApp too.
- SEO — Open Graph / Twitter cards, JSON-LD
Personschema, sitemap and robots.txt.
React 19 · Vite 7 · Tailwind CSS 3 · Framer Motion · Lenis · react-icons / lucide-react · EmailJS (optional). Fonts: Bricolage Grotesque, Geist, Geist Mono and Anek Bangla.
src/
├── data/ # all content — edit these to update the site
│ ├── profile.js # name, contact, bio, stats, principles
│ ├── projects.js # SaaS products, Odoo modules, other projects
│ ├── skills.js # stack groups + Odoo capabilities
│ ├── services.js # services + working process
│ └── journey.js # experience, education, timeline
├── i18n/strings.js # interface text in English and Bangla
├── context/ # SettingsContext (theme, accent, language, motion), UIContext (overlays, toast)
├── sections/ # Hero, About, Services, Work, Skills, Journey, Contact
├── components/
│ ├── layout/ # Navbar, Footer, background, smooth scroll, intro
│ ├── work/ # product cards, case-study modal
│ ├── chat/ # Fabrito widget + its answer engine
│ └── ui/ # Reveal, SpotlightCard, Magnetic, CountUp, TechIcon, Logo…
├── hooks/ lib/
public/
├── work/ # project screenshots (WebP)
├── resume.pdf profile.webp og-image.jpg favicon.svg
└── CNAME _headers robots.txt sitemap.xml
Text is written as { en: "...", bn: "..." }; components pick the right one with tr() from useSettings().
git clone https://github.com/Ehasan07/Protfolio.git
cd Protfolio
npm install
npm run dev # http://localhost:5173npm run build writes the production site to dist/; npm run lint checks the code.
Copy .env.example to .env and fill in your EmailJS service, template and public key.
Without them the form falls back to mailto: — nothing breaks.
The site is hosted on Cloudflare Pages (project ehasanlive) as a direct upload:
npm run deploy # vite build + wrangler pages deploy dist --project-name ehasanliveWrangler asks you to log in to Cloudflare the first time. If you use EmailJS, set the VITE_EMAILJS_*
variables in .env before deploying — Vite bakes them in at build time.
S M Ehasanul Haque — shiplulink2003@gmail.com · ehasanlive.com · GitHub
