You: Hey bro, I just finished building my Orbital app! Check it out at http://localhost:5173/ Friend: Damn, your project looks exactly like my Orbital project 💀
You've built your app. Only problem? It's stuck on your laptop.
In this two-part workshop, we'll take an app from localhost to the real internet. You'll learn how to deploy your project, set up a database, store files, and manage secrets properly. Then we'll set up CI/CD with GitHub Actions, automated testing, and monitoring so you can ship with confidence instead of crossing your fingers after every push.
| Resource | Link |
|---|---|
| Starter repo | hckr.cc/orbital-deployment-26 |
| Slide deck | hckr.cc/orbital-deployment-slides |
| Part 1 step-by-step | part-1/WORKSHOP.md |
| Part 2 step-by-step | part-2/WORKSHOP.md |
- Part 1: Saturday, 30 May 2026, 1:00pm to 3:00pm. Deploy from localhost to the internet (
part-1/WORKSHOP.md) - Part 2: Saturday, 6 June 2026, 10:00am to 12:00pm. Testing, CI/CD, Docker, and monitoring (builds on Part 1)
Missed Part 1 live? Catch up via part-1/WORKSHOP.md before Part 2.
If you forked during Part 1, sync your fork with upstream so you have the latest part-2/ materials. See Get Part 2 updates.
For Part 1 of the workshop, we will focus on deploying a web application from localhost to the internet. You will deploy and extend the pre-built Color Swipe app.
We will cover:
- Introduction to deployment concepts
- Cloudflare Workers and serverless deployment
- Deploying a React app (starter provided)
- Hono API backend (already in starter)
- Supabase database and storage
Hands-on guide: part-1/WORKSHOP.md
Part 2 builds on your deployed Color Swipe app from Part 1. You keep the Cloudflare Worker + Supabase stack, then add automated testing, CI/CD, a containerised Python microservice, and error monitoring.
We will cover:
- Testing: Vitest unit tests, Playwright E2E smoke tests
- CI/CD: GitHub Actions to test and deploy on every push
- Containers: Docker images for a FastAPI vibe-search service
- Deploy: Render for the Python service, Worker proxy for the frontend
- Local dev: Docker Compose for multiple services
- Monitoring: Sentry for Worker and FastAPI errors
Browser -> Cloudflare Worker (React + Hono API) -> Supabase
|
Render (FastAPI vibe-search + ML model)
part-2/apps/web/-- Color Swipe with tests, GitHub Actions workflow template, Vibe Search UI, and Sentry on the Workerpart-2/apps/vibe-search/-- FastAPI service that ranks colors by sentence similarity (all-MiniLM-L6-v2)part-2/docker-compose.yaml-- run vibe-search + local Postgres together
Hands-on guide: part-2/WORKSHOP.md
You must complete Part 1 on your own fork before Part 2.
- Git and a GitHub account
- Node.js
- pnpm
- Cloudflare account
- Supabase account
wrangler is installed via pnpm install in part-1/; no separate global install needed.
- Completed Part 1 on your fork (deployed Worker + Supabase wired up)
- Synced your fork with upstream so
part-2/is present locally (see Get Part 2 updates) - Docker Desktop or OrbStack installed
- Render account (free tier) for deploying vibe-search
- Sentry account (free tier) for error monitoring
- Same fork from Part 1 (CI/CD pushes to your GitHub repo)
Optional for local Python dev: uv (curl -LsSf https://astral.sh/uv/install.sh | sh). Docker covers the container sections without a local Python install.
- Open hckr.cc/orbital-deployment-26
- Click Fork (create your own copy under your GitHub account)
- Uncheck "Copy the
mainbranch only" - Do not clone the upstream workshop repo directly; you need your fork so Part 2 CI/CD can push to your GitHub repo
Not sure how to fork? Follow the GitHub fork guide.
Checkpoint: You see github.com/<your-username>/orbital-26-deployment-workshop.
Copy the clone URL from the green Code button on your fork, then run:
git clone https://github.com/<your-username>/orbital-26-deployment-workshop.git
cd orbital-26-deployment-workshopCheckpoint: git remote -v shows your fork as origin.
part-1/-- Color Swipe app and all Part 1 commands (pnpm dev,pnpm deploy, etc.)part-2/apps/web/-- Part 2 Color Swipe app (tests, CI/CD, Vibe Search proxy)part-2/apps/vibe-search/-- FastAPI container servicepart-2/docker-compose.yaml-- local multi-container setupslides/-- Slidev deck (presenters only; participants use the hosted deck)part-1/WORKSHOP.md-- follow this during Part 1part-2/WORKSHOP.md-- follow this during Part 2
cd part-1
pnpm install
pnpm devOpen the local URL Vite prints (typically http://localhost:5173).
Checkpoint: App loads (empty state is expected until Supabase is set up).
Continue with part-1/WORKSHOP.md for deploy, Supabase, and storage steps.
After Part 1 and a fork sync, set up the Part 2 web app:
cd part-2/apps/web
pnpm install
pnpm devRun tests:
pnpm test # Vitest (12 tests in the completed repo)
pnpm exec playwright install --with-deps chromium
pnpm test:e2e # Playwright smoke testFor the vibe-search service (containers section):
cd part-2/apps/vibe-search
docker build -t color-vibe-search .
docker run -p 8000:8000 color-vibe-searchOr start vibe-search + Postgres together:
cd part-2
docker compose upCheckpoint: App loads at http://localhost:5173, pnpm test passes, and http://localhost:8000/docs loads after the container starts.
Continue with part-2/WORKSHOP.md for the full Part 2 walkthrough.
Part 2 lives in part-2/ on the upstream workshop repo (nushackers/orbital-26-deployment-workshop). Your fork does not update automatically.
Sync before Part 2 (and again if the presenter announces a last-minute push during the session).
Option 1: Sync on GitHub (easiest)
- Open your fork on GitHub (
github.com/<your-username>/orbital-26-deployment-workshop) - If GitHub shows "This branch is X commits behind nushackers/orbital-26-deployment-workshop", click Sync fork > Update branch
- On your machine, pull the updated fork:
cd orbital-26-deployment-workshop
git pull origin mainOption 2: Sync from the terminal
One-time setup (add the workshop repo as upstream):
git remote add upstream https://github.com/nushackers/orbital-26-deployment-workshop.gitBefore Part 2 (repeat whenever we publish new materials):
git fetch upstream
git merge upstream/main
git push origin mainSlides: Part 2 slides are on the hosted deck at hckr.cc/orbital-deployment-slides. You do not need to run the slides locally unless you want to.
Checkpoint: After syncing, you see part-2/apps/web/, part-2/apps/vibe-search/, and part-2/WORKSHOP.md.
Reference: GitHub: Syncing a fork
During the live session:
- Slides: hckr.cc/orbital-deployment-slides (or scan the QR above)
- Code: terminal open in your cloned fork (
part-1/for Part 1,part-2/apps/web/for Part 2) - Steps:
part-1/WORKSHOP.md(Part 1) orpart-2/WORKSHOP.md(Part 2) - Before Part 2: sync your fork with upstream (Get Part 2 updates)
- Help: Zoom chat during session; Padlet after
Keep .dev.vars, .env, and API keys out of Git.
If you get stuck, we recommend the following:
- If you are currently in the workshop, ask for help in the Zoom chat
- Otherwise, add a question to our Padlet; we monitor it after each session and answer asynchronously
- Part 1 feedback: hckr.cc/orb26-deployment-p1-feedback
Built with Love by NUS Hackers 🦆
