This project deploys as two separate Render Static Sites.
A render.yaml file at the repo root defines both services. Render can auto-detect it when you connect the repository, or you can create the services manually using the exact settings below.
Deploy in this order to ensure the landing page CTA links are live and correct from the first publish:
- Deploy Service 2 — Modern App → copy the live URL (e.g.
https://uiux-modern-app.onrender.com) - Update
index.html→ replace everyYOUR_MODERN_APP_URLplaceholder with the real subdomain - Commit and push the change to
main - Create/deploy Service 1 — Root + Legacy → auto-deploy triggers on push, or create manually
Deploy second (after updating
index.htmlwith the modern-app URL).
| Setting | Value |
|---|---|
| Service Type | Static Site |
| Service Name | uiux-modernization-demo |
| Repository | RocketDelivery2/uiux-modernization-demo |
| Branch | main |
| Root Directory | (leave blank — use repo root) |
| Build Command | (leave blank — no build needed) |
| Publish Directory | . |
| Auto-Deploy | Yes |
| Environment Variables | None |
| Redirect/Rewrite Rules | None |
Render serves the repo root as plain static files — no build step needed.
The landing page (index.html) and the legacy app (legacy-app/) share the same service, so relative links between them work natively:
| Live URL path | File served |
|---|---|
/ |
index.html (case study landing page) |
/landing.css |
landing.css |
/legacy-app/ |
legacy-app/index.html (legacy dashboard) |
/legacy-app/customers.html |
legacy-app/customers.html |
/legacy-app/orders.html |
legacy-app/orders.html |
/legacy-app/reports.html |
legacy-app/reports.html |
/legacy-app/settings.html |
legacy-app/settings.html |
This is a traditional multi-page site. Real files exist at every path — no redirect rules are required.
Deploy first so you have the live URL to paste into
index.html.
| Setting | Value |
|---|---|
| Service Type | Static Site |
| Service Name | uiux-modern-app |
| Repository | RocketDelivery2/uiux-modernization-demo |
| Branch | main |
| Root Directory | modern-app |
| Build Command | npm install && npm run build |
| Publish Directory | dist |
| Auto-Deploy | Yes |
| Environment Variables | NODE_VERSION=20 |
In the Render dashboard, under Advanced → Environment Variables:
| Key | Value |
|---|---|
NODE_VERSION |
20 |
Render runs npm install && npm run build inside modern-app/, which:
- Installs all dependencies from the lock file
- Runs TypeScript type checking via
tsc - Builds with Vite 8 → outputs to
modern-app/dist/
Render then serves the dist/ directory as the site root.
Important: The
Publish Directoryfield isdist— relative to the Root Directorymodern-app. Do not entermodern-app/dist.
This is a React single-page application with client-side routing. All paths must rewrite to /index.html so React Router can handle navigation.
The render.yaml file includes this rule automatically. If configuring manually in the dashboard:
Settings → Redirects/Rewrites → Add Rule
| Source | Destination | Action |
|---|---|---|
/* |
/index.html |
Rewrite |
After Service 2 is live, replace the placeholder URLs in index.html.
Search index.html for:
YOUR_MODERN_APP_URL
It appears in 3 places (nav CTA, hero button, bottom CTA button).
# Run from repo root — replace uiux-modern-app with your actual Render subdomain if different
(Get-Content index.html) -replace 'YOUR_MODERN_APP_URL', 'uiux-modern-app' | Set-Content index.htmlsed -i 's|YOUR_MODERN_APP_URL|uiux-modern-app|g' index.htmlgit add index.html
git commit -m "Update modern-app URL to live Render deployment"
git push origin mainService 1 auto-deploys on push and will immediately serve the updated landing page.
| Service | URL |
|---|---|
| Landing page + Legacy app | https://uiux-modernization-demo.onrender.com (confirm after deploy) |
| Modern app | https://uiux-modern-app.onrender.com (confirm after deploy) |
- Go to render.com → New → Static Site
- Connect your GitHub account → select
RocketDelivery2/uiux-modernization-demo - Fill in:
- Name:
uiux-modern-app - Branch:
main - Root Directory:
modern-app - Build Command:
npm install && npm run build - Publish Directory:
dist
- Name:
- Click Advanced → Add Environment Variable:
NODE_VERSION=20
- Click Create Static Site and wait for the build (~60–90 s)
- Copy the live URL from the top of the dashboard page
- In the service dashboard → Settings → Redirects/Rewrites → Add Rule
- Source:
/* - Destination:
/index.html - Action: Rewrite
- Source:
- Click Save
- In your local repo (PowerShell):
(Get-Content index.html) -replace 'YOUR_MODERN_APP_URL', 'uiux-modern-app' | Set-Content index.html
- Commit and push:
git add index.html git commit -m "Update modern-app URL to live Render deployment" git push origin main
- Go to render.com → New → Static Site
- Select the same repo:
RocketDelivery2/uiux-modernization-demo - Fill in:
- Name:
uiux-modernization-demo - Branch:
main - Root Directory: (leave blank)
- Build Command: (leave blank)
- Publish Directory:
.
- Name:
- No environment variables or redirect rules needed
- Click Create Static Site
- Once live, open the URL and verify the landing page loads with working links
- Static Sites are always free on Render (no sleep, no usage caps for static hosting)
- Build time for the modern app is typically 60–90 seconds on first deploy
- Subsequent builds are faster due to npm cache
- Auto-deploy is triggered on every push to
main - Both services share the same repo — pushes to
maintrigger both services to redeploy
After deployment, confirm:
-
https://uiux-modernization-demo.onrender.com/→ landing page loads correctly -
https://uiux-modernization-demo.onrender.com/legacy-app/→ legacy dashboard loads - Legacy app internal navigation works (Customers, Orders, Reports, Settings)
- Landing page "View Modern App" button opens the correct Render URL
-
https://uiux-modern-app.onrender.com/→ React app loads and shows the dashboard - Navigating to a deep route (e.g.
/customers) then hard refreshing the page still works (SPA rewrite rule) - All 5 pages work in the modern app (Dashboard, Customers, Orders, Reports, Settings)
- Modern app is responsive on mobile viewport