
Building My First Business Website: Real Lessons from Code, Hosting, and Deployment
Building My First Business Website: Real Lessons from Code, Hosting, and Deployment
When I first set out to build a business website from scratch, I thought the main challenge would be writing good code.
But the reality was broader — building a real-world project meant stepping into decisions about hosting, deployment pipelines, domains, theming, branding, multilingual support, SEO, and user experience.
In this post, I want to share what it was really like — not just the code, but the full-stack thinking that a business website demands.
🛠️ Project Overview
The website I built was for a trading and sourcing company offering services like:
- Agency and brokerage representation
- Product sourcing (food, electronics, furniture, and more)
- Shipping and customs facilitation
- Product inspection and reporting
It needed to:
- Be multilingual (English and Arabic)
- Showcase products and services clearly
- Allow easy inquiries via contact forms
- Build trust through a clean, professional design
- Support light/dark mode cleanly
The stack and infrastructure choices:
- Frontend: Next.js (with App Router and TypeScript)
- Styling: Tailwind CSS (with custom theming)
- Internationalization (i18n): next-i18next
- Hosting: Vercel
- Domain Provider: Hostinger
- Deployment CI/CD: GitHub → Vercel automatic deploys
🎨 Design Simplicity: Choosing Function over Flash
I made a deliberate decision early on:
- Prioritise clarity and speed over heavy animations or flashy design.
- Keep layouts minimalistic, letting content and service offerings be the focus.
- Ensure responsive design for mobile and desktop.
The mission was to build trust through usability, not distract with visual noise.
🌍 Handling Multilingual Requirements (English + Arabic)
Adding Arabic support introduced real complexity:
- Dynamic Right-to-Left (RTL) layouts.
- Language-aware routing using Next.js App Router.
- Adjusted spacing, alignment, and reading order conditionally.
Challenge:
Preserving visual and functional consistency across two completely different reading directions.
Solution:
- Used logical
dir="rtl"
and conditional class switching based onlocale
. - Ensured text expansion/shrinkage between languages didn’t break layouts.
It pushed me to think about accessibility and cultural UX — not just translation.
🛠️ CI/CD: Building an Easy Deployment Pipeline
Challenge:
I needed a deployment flow that wouldn't slow me down or introduce human error.
Solution:
- Connected GitHub to Vercel.
- Set up automatic deploys triggered by pushes to the
main
branch. - Used Vercel preview URLs for branch deployments to test changes safely.
- Managed environment variables like API URLs and domain names in Vercel settings.
CI/CD made updating the project frictionless and professional.
🌐 Hosting and Domain Choices
Hosting (Vercel):
- Seamless for Next.js projects.
- Free for small business scale.
- Automatic SSL and CDN integration.
Domain (Hostinger):
- Managed DNS settings to point domain to Vercel servers.
- Faced some DNS propagation delays — took about 6 hours to fully resolve worldwide.
Lesson:
Always plan some buffer time when switching DNS or setting up new domains.
🌗 Light/Dark Theme Logic and Challenges
Supporting light and dark modes wasn't just a "toggle button" problem:
- Needed full dynamic styling that looked polished in both themes.
- Some components (like tables, card shadows, borders) had to adapt color intelligently.
- Made sure background gradients, text contrasts, and button styles shifted properly.
Implementation Details:
- Used Tailwind’s built-in
dark:
variant system. - Toggled themes via
class="dark"
on<html>
, usingnext-themes
library for easier control. - Stored user theme preferences in
localStorage
for persistence across sessions.
Challenge:
Testing in RTL languages and dark mode simultaneously exposed edge cases (like flipped gradients and icon misalignments).
🎨 Branding and Theming with Tailwind
Instead of hardcoding colors, I wanted dynamic, easy-to-update branding.
Steps I Took:
- Extended Tailwind’s theme in
tailwind.config.ts
with custom colors for primary, secondary, accent, etc. - Built color palettes around warm neutrals and deep blues to create trust and calmness.
- Used semantic classes (e.g.,
bg-primary
,text-accent
) rather than hardcodingtext-blue-500
everywhere.
Benefits:
- If the brand colors ever change, I only need to update Tailwind config — not hundreds of classes across the site.
- Keeps the design consistent, flexible, and scalable.
🧹 Polish: Why the Last 10% Matters
After launch, I focused heavily on polish:
- Added SEO meta tags and OpenGraph tags.
- Built a custom 404 page for missing routes.
- Enhanced form validation for better UX.
- Compressed images and lazy-loaded assets for performance gains.
These small touches aren't always obvious — but they build professionalism and improve real user experience.
🚀 Final Reflection
Building my first real-world business website taught me more than any course or tutorial could.
It wasn’t just about coding pages — it was about building a real system:
- Thinking about infrastructure and deployment.
- Thinking about users from different cultures and device types.
- Thinking about branding, polish, and future-proofing.
This project made me fall in love with the intersection of business and technology — where smart systems meet real human needs.
And this is just the beginning.
This is the end product https://www.gcmcltdco.com/en. Let me know what you think.