A micro-frontend management platform that lets you register, deploy, and orchestrate independent web applications from a single admin interface. Built with wujie for sandbox isolation and Supabase as the backend.
Problem it solves: In organizations running multiple frontend projects, each team ships independently but there's no unified way to register apps, manage multi-environment deployments, or compose them into a single user-facing portal. WLP fills that gap.
🔗 Live demo: coming soon
┌─────────────────────────────────────────────────────────┐
│ Browser │
│ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Main App (WLP) │ │
│ │ ┌──────────┐ ┌──────────────────────────────┐ │ │
│ │ │ Sidebar │ │ Content Area │ │ │
│ │ │ │ │ ┌─────────────────────────┐ │ │ │
│ │ │ Home │ │ │ Sub-App (wujie sandbox)│ │ │ │
│ │ │ Apps │ │ │ │ │ │ │
│ │ │ Admin │ │ │ Independent React/Vue/ │ │ │ │
│ │ │ ... │ │ │ Angular app loaded via │ │ │ │
│ │ │ │ │ │ URL from any Git repo │ │ │ │
│ │ │ │ │ └─────────────────────────┘ │ │ │
│ │ └──────────┘ └──────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────┘ │
│ │
└──────────────────────────┬──────────────────────────────┘
│ /api/*
▼
┌───────────────────────┐
│ Vercel Serverless │
│ Functions (API) │
│ │
│ POST /api/apps │
│ POST /api/upload │
│ POST /api/webhooks │
│ GET /api/deploy... │
└───────────┬───────────┘
│
▼
┌───────────────────────┐
│ Supabase │
│ │
│ PostgreSQL (registry)│
│ Storage (static dist)│
└───────────────────────┘
- Sub-apps register in the
appstable with a name, route rule, and entry URLs per environment (dev / test / staging / production). - Main app fetches the registry at startup via
GET /api/appsand renders the sidebar dynamically. - When a user navigates to a sub-app route, wujie loads the sub-app inside an isolated sandbox (JS sandbox + shadow DOM), fetching its HTML/JS from the registered entry URL.
- Deployment can happen via zip upload through the admin UI or automatically via Vercel webhook — both update the entry URL and record deployment history.
webapp-lifecycle-platform/
├── apps/
│ ├── main-app/ # Host app + admin UI + API
│ │ ├── src/ # React frontend (Vite)
│ │ │ ├── admin/ # Admin pages (apps, deployments, environments)
│ │ │ ├── layout/ # Shell layout + sidebar
│ │ │ ├── micro/ # Sub-app loading (SubAppsContext, loader)
│ │ │ └── router/ # Route components (Home, SubAppContainer)
│ │ └── api/ # Vercel serverless functions
│ │ ├── apps/ # CRUD for app registry
│ │ ├── deployments/ # Deployment records
│ │ ├── environments/# Environment management
│ │ ├── upload/ # Zip upload deployment
│ │ └── webhooks/ # Vercel deploy webhook
│ ├── sub-supplier/ # Example sub-app (Supplier Management)
│ └── sub-goods/ # Example sub-app (Goods Management)
├── packages/
│ └── shared/ # Shared TypeScript types
├── templates/
│ └── sub-app-template/ # Starter template for new sub-apps
├── scripts/
│ └── supabase-schema.sql # Database schema + seed data
└── config/
└── environments.json # Environment definitions
| Layer | Technology |
|---|---|
| Host App | React 18 + React Router + Vite |
| Micro-frontend | wujie (JS sandbox + shadow DOM) |
| API | Vercel Serverless Functions |
| Database | Supabase (PostgreSQL) |
| Storage | Supabase Storage (for uploaded static builds) |
| Deployment | Vercel (host) + zip upload / webhook (sub-apps) |
| Monorepo | pnpm workspaces |
- Node.js >= 18
- pnpm >= 8
- A Supabase project (free tier works)
git clone https://github.com/cindyzhu/webapp-lifecycle-platform.git
cd webapp-lifecycle-platform
pnpm install- Create a new Supabase project.
- Run
scripts/supabase-schema.sqlin the SQL Editor to create tables. The script includes seed data at the bottom for local development — skip theINSERTstatements for production, as sub-apps are registered through the admin UI. - Go to Settings → Storage and create a bucket named
sub-app-assets(set to public).
Create apps/main-app/.env.local:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key# Terminal 1 — API dev server
cd apps/main-app && pnpm dev:api
# Terminal 2 — Main app
pnpm dev
# Terminal 3 & 4 — Sub-apps (optional)
pnpm dev:supplier # http://localhost:5174
pnpm dev:goods # http://localhost:5175Open http://localhost:5173 — the main app loads sub-apps dynamically from the registry.
A sub-app can live in any Git repository with any framework. It only needs two things:
// src/main.tsx
if (window.__POWERED_BY_WUJIE__) {
let root = null;
window.__WUJIE_MOUNT = () => {
const container = window.$wujie.shadowRoot.querySelector('#root');
if (!container) return;
root = ReactDOM.createRoot(container);
root.render(<App />);
};
window.__WUJIE_UNMOUNT = () => {
root?.unmount();
};
window.__WUJIE.mount();
} else {
// Standalone mode
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
}// vite.config.ts
export default defineConfig({
server: { port: 5176, cors: true },
});Then register it in the admin UI (/#/admin/apps → + Add App).
See templates/sub-app-template/ for a complete starter.
- Import the repo in Vercel.
- Set Root Directory to
apps/main-app. - Add environment variables:
SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY. - Push to
mainto trigger deployment.
Two options:
| Method | How |
|---|---|
| Zip upload | pnpm build → zip the dist/ folder → upload in admin UI (App Detail → Upload Static Build) |
| Vercel webhook | Deploy sub-app to Vercel → configure webhook to POST /api/webhooks/vercel with { app_name, url, branch } |
Both methods auto-update the entry URL for the target environment and record deployment history.
- App Registry — Register, edit, activate/deactivate sub-apps
- Multi-environment URLs — Separate entry URLs for dev / test / staging / production
- Deployment History — Track every deployment with version, status, and deployer
- Environment Management — Configure deployment targets
- Zip Upload — Drag-and-drop
dist.zipdeployment to Supabase Storage
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/apps |
List all registered apps |
| POST | /api/apps |
Register a new app |
| GET | /api/apps/:id |
Get app details |
| PUT | /api/apps/:id |
Update app |
| DELETE | /api/apps/:id |
Delete app |
| POST | /api/upload |
Upload dist.zip and deploy |
| POST | /api/webhooks/vercel |
Auto-deploy via Vercel webhook |
| GET | /api/deployments |
List deployment history |
| GET/POST | /api/environments |
Manage environments |
MIT