Official website for HM Coding, a software studio that builds websites, web apps, mobile apps, AI integrations, and business systems.
Live site: https://hm-coding.vercel.app
Canonical domain: https://hmcoding.com
- React 19
- TypeScript
- Vite 7
- React Router
- Tailwind CSS 3
- Framer Motion
- Supabase Auth + PostgreSQL
- Vercel (static SPA)
There is no Express, MongoDB, or Render backend in this repository.
npm install
cp .env.example .envFill .env with your Supabase project URL and anon key, then:
npm run devOther commands:
npm run lint
npm run build
npm run preview
npm run test:e2eFrontend variables (Vite, must be prefixed with VITE_):
| Variable | Required | Purpose |
|---|---|---|
VITE_SUPABASE_URL |
Yes | Supabase project URL |
VITE_SUPABASE_ANON_KEY |
Yes | Supabase anon/public key |
Never put a Supabase service-role key in frontend code or Vercel VITE_* settings.
For production, set the same variables in the Vercel project.
Supabase tables used by the app:
jobs— public careers listingsreviews— testimonials, shown only when approvedcontact_messages— contact, internship, startup, and demo inquiriesprofiles— admin authorization (role = adminoruser)
Apply SQL from supabase/migrations/20260814_production_security.sql, then promote an Auth user:
update public.profiles
set role = 'admin', updated_at = now()
where id = '<auth-user-uuid>';See supabase/README.md for the access model.
Admin portal: /hm-portal-admin-dashboard
Shortcut on the public site: Ctrl+Shift+H
Route guards are UX only. Row Level Security is authoritative.
Job applications use each listing's external apply_url. Internship and startup inquiries are stored as contact messages.
/Home/about/services/projects/projects/:slugproduct demos or project pages/careers/terms/privacy
Unknown routes render a branded 404 page.
src/ React application
src/admin/ Admin portal
src/components/ Shared UI
src/pages/ Public routes
src/lib/ Supabase client, auth, validation
supabase/migrations Versioned SQL
public/ Static assets, robots.txt, sitemap.xml
Vercel builds with npm run build (tsc -b && vite build) and publishes dist.
vercel.json rewrites all paths to index.html so React Router deep links work.
The site is a dark premium interface. There is no light-mode toggle.
Private project — HM Coding