Ekime Digital Service
CMS-driven marketing site for a Nigerian digital agency. Fast pages with a blog/portfolio the client can publish, and a contact pipeline that stores + emails leads.
React 19 (Vite)React RouterPlain CSSSanity CMSVercel FunctionsMongoDB Atlas
Context
- Solo dev — UX, frontend, serverless API, CMS, deployment, DNS
- Timeline: ~4 weeks (2025)
- Team: Solo (client collab for content/brand)
- React 19 (Vite)
- React Router
- Plain CSS
- Sanity CMS
- Vercel Functions
- MongoDB Atlas
- Nodemailer
- GA4 / AdSense
Problem → Goals
Problem
- Client needed a modern site to showcase services, publish content quickly, and capture inquiries reliably.
Goals
- Ship a fast, responsive site with solid meta foundations.
- Non-technical publishing via CMS for Blog & Portfolio.
- Contact form that stores in DB and sends email.
- Add monetization (AdSense) + analytics (GA4).
Solution
React 19 (Vite) SPA with route-level code splitting and plain CSS. Content in Sanity fetched via GROQ; images via Sanity CDN with responsive variants. Contact flow hits a Vercel serverless function that validates input, writes to MongoDB Atlas, and emails via Nodemailer. Deployed on Vercel with custom domain.
Highlights
- Sanity schemas (blogPost, portfolioItem) with alt text + hotspot.
- GROQ queries + @sanity/image-url for responsive images.
- Serverless /api/contact with connection reuse and error handling.
- Honeypot anti-spam, clear success/error UX.
- AdSlot component with safe placements; GA4 route tracking.
- Lighthouse-friendly image strategy (WebP, fixed dims, lazy).
Screenshots
Results & Impact
- Client publishes blog/portfolio without developer involvement.
- Leads stored in Mongo and emailed instantly.
- Shareable pages with consistent metadata.
- Code-split routes and optimized images improve load time.
What I’d improve next
- Categories/Tags + per-post OG image in Sanity.
- Consent Mode v2 + cookie banner for GA/Ads.
- Accessibility pass and unit tests for the API.