Demo Script: Open Service Portal Platform MVP
Date: August 29, 2025
Duration: 30-45 minutes
Audience: Technical stakeholders, Platform team, DevOps engineers
Executive Summary​
In the past two weeks, we've transformed the Open Service Portal from a proof-of-concept into a functional MVP that combines Backstage's developer portal capabilities with Crossplane's infrastructure automation, creating a true self-service platform for developers.
Key Achievements​
- ✅ Full GitOps workflow with Flux (catalog → deploy → monitor)
- ✅ 10+ ready-to-use templates (5 infrastructure, 6+ services)
- ✅ Automated XRD form generation with Kubernetes Ingestor
- ✅ Production-ready Cloudflare DNS integration
- ✅ Unified setup script for any Kubernetes distribution
- ✅ Namespace provisioning with quotas, policies, and RBAC
- ✅ GitHub Container Registry packaging for versioned releases
Demo Flow​
Part 1: Platform Architecture Overview (5 min)​
1.1 Repository Structure​
# Show the workspace structure
cd /Users/felix/work/open-service-portal/portal-workspace
tree -L 1 -d
# Explain the repository types:
# - app-portal: Backstage application
# - catalog: XRD/Composition definitions (what CAN be created)
# - catalog-orders: XR instances (what HAS been created)
# - template-*: Crossplane infrastructure templates
# - service-*: Backstage service scaffolding templates
Talking Points:
- Separation of concerns: definitions vs instances
- GitOps-driven deployment via Flux
- Template marketplace concept
1.2 GitOps Workflow Visualization​
Part 2: Platform Setup - Zero to Platform in 5 Minutes (10 min)​
2.1 Unified Cluster Setup​
# Show the setup script capabilities
cat scripts/setup-cluster.sh | grep "^install_" | head -10
# Run the setup (or show it's already done)
./scripts/setup-cluster.sh
# Show what was installed
kubectl get pods -A | grep -E "flux|crossplane|ingress"
Key Points:
- Works with ANY Kubernetes distribution (Kind, Rancher, EKS, GKE, AKS)
- Installs complete platform stack in one command
- Includes NGINX Ingress, Flux, Crossplane v2, all providers
2.2 Environment Switching​
# Show environment configuration capabilities
./scripts/config-local.sh # Local development
# ./scripts/config-openportal.sh # Production (OpenPortal)
# Show the generated Backstage config
cat app-portal/app-config.local.yaml | head -20
Part 3: Template Marketplace - What Can We Build? (10 min)​
3.1 Infrastructure Templates (Crossplane)​
# Show available XRDs
kubectl get xrd | grep openportal
# Show a template definition
cat template-whoami/xrd.yaml | head -50
Live Demo - Browse Templates:
- Open http://localhost:3000/create
- Show the auto-generated forms from XRDs:
- Namespace - Full namespace provisioning with quotas & RBAC
- DNSRecord - Mock DNS for testing
- CloudflareDNSRecord - Real DNS management
- WhoAmIApp - Demo application with auto-DNS
- WhoAmIService - Composite (App + DNS)
3.2 Service Templates (Backstage Scaffolder)​
# Show service templates
ls -la service-*-template/
Template Categories:
- service-nodejs-template - Express.js microservices
- service-mongodb-template - Database services
- service-firewall-template - Network security rules
- service-cluster-template - Full cluster provisioning
Part 4: Live Demo - Create Real Infrastructure (10 min)​
4.1 Create a Namespace First​
- Navigate to http://localhost:3000/create
- Select "Namespace" template
- Fill the form:
name: demo-namespace
team: platform-team
environment: dev
quotas:
enabled: true
limits:
cpu: "10"
memory: "16Gi" - CREATE and watch GitOps deploy it
- Verify:
kubectl get namespace demo-namespace
kubectl get resourcequota -n demo-namespace
4.2 Create a WhoAmI Application​
- Navigate to http://localhost:3000/create
- Select "WhoAmIApp" template
- Fill the form:
name: demo-app-aug29
namespace: demo-namespace # Use our new namespace!
replicas: 2 - Show the publish step:
- Target repo:
catalog-orders(auto-configured!) - Branch:
main
- Target repo:
- CREATE the application
4.2 Watch the GitOps Magic​
# Terminal 1: Check GitHub
cd ../catalog-orders
git pull origin main
ls -la
cat */demo-app-aug29.yaml # Show the generated XR
# Terminal 2: Watch Flux sync
kubectl get gitrepository,kustomization -n flux-system | grep catalog-orders
flux logs --follow --tail=10
# Terminal 3: See the XR created
kubectl get whoamiapps -A
kubectl get whoamiapp demo-app-aug29 -n default -o yaml | head -30
# Terminal 4: Check actual deployment
kubectl get pods -n default | grep demo-app
kubectl get ingress -n default
4.3 Access the Application​
# Get the URL (if DNS is configured)
kubectl get whoamiapp demo-app-aug29 -n default -o jsonpath='{.status.domain}'
# Or port-forward for local access
kubectl port-forward -n default svc/demo-app-aug29 8080:80
# Open http://localhost:8080
Part 5: Advanced Features Showcase (5 min)​
5.1 Kubernetes Ingestor - Auto-Generated Forms​
# Show how forms are generated from XRDs
kubectl describe xrd whoamiapps.openportal.dev | grep -A20 "Spec:"
# In Backstage, show the corresponding form fields
# Each OpenAPI schema property becomes a form field!
5.2 Template Versioning​
# Show version labels
kubectl get xrd -o yaml | grep -A2 "openportal.dev/version"
# In Backstage UI, show version in template cards
# "WhoAmIApp v1.0.2"
5.3 Container Registry Packaging​
# Show the published package
gh release view v1.0.0 --repo open-service-portal/template-namespace
# Show automatic catalog update PR
gh pr view 10 --repo open-service-portal/catalog
# Package is available at:
# ghcr.io/open-service-portal/configuration-namespace:v1.0.0
5.4 Cloudflare DNS Integration (Production Ready)​
# Show the Cloudflare provider setup
kubectl get provider provider-cloudflare
kubectl get providerconfig cloudflare -o yaml | grep -A5 "zone"
# Create a real DNS record (if configured)
# Select CloudflareDNSRecord template
# Creates actual DNS in Cloudflare!
Part 6: Developer Experience Improvements (5 min)​
6.1 Custom Template Card with Versions​
- Show template cards displaying versions
- Explain the custom scaffolder plugin approach
- Show how it helps developers choose the right version
6.2 Permission System​
# Show guest access configuration
cat app-portal/packages/backend/src/permissions/customPermissionPolicy.ts | head -30
# Demo: Access as guest user
# - Can browse catalog
# - Can view templates
# - Can create resources (configurable)
6.3 Documentation Integration​
- Show CLAUDE.md for AI-assisted development
- Show integrated docs in
/docsfolder - Show troubleshooting guides
Part 7: Production Readiness (5 min)​
7.1 Security Features​
# SOPS encryption for secrets
ls -la app-portal/.env.enc
cat app-portal/.sops.yaml
# RBAC for Kubernetes
kubectl get clusterrolebinding | grep backstage
7.2 Monitoring & Observability​
# Show Flux monitoring
flux get all -A
# Show Crossplane resource health
kubectl get managed -A
# Show Backstage logs
# (In the terminal running yarn start)
7.3 GitOps Compliance​
- Every change tracked in Git
- PR-based workflow for production
- Flux ensures cluster matches Git state
- Full audit trail
Key Metrics & Achievements​
Development Velocity​
- 14 days: From zero to functional platform
- 11 templates: Ready for immediate use (including Namespace)
- 3 providers: Kubernetes, Helm, Cloudflare
- 3 GitOps repos: catalog, catalog-orders, templates
- v1.0.0 releases: Production-ready packages in ghcr.io
Platform Capabilities​
| Feature | Status | Business Value |
|---|---|---|
| Self-service infrastructure | ✅ Live | 10x faster provisioning |
| GitOps workflow | ✅ Live | Full audit trail |
| Auto-generated forms | ✅ Live | No manual form creation |
| Namespace provisioning | ✅ Live | Complete with quotas & policies |
| Container registry | ✅ Live | Versioned template packages |
| Multi-cloud ready | ✅ Ready | AWS/GCP/Azure support |
| RBAC & Security | ✅ Live | Enterprise-ready |
Lines of Code Saved​
- XRD → Form: ~500 lines per template
- GitOps setup: ~1000 lines of scripts
- Total automation: ~5000+ lines
Q&A Topics​
Anticipated Questions:​
Q: How does this compare to other platforms? A: We combine the best of both worlds:
- Backstage's superior UX and extensibility
- Crossplane's cloud-native infrastructure management
- GitOps for compliance and auditability
Q: What's the learning curve for developers? A: Near zero - they just fill forms. Platform team handles the complexity.
Q: Can we integrate with existing tools? A: Yes - Backstage has 100+ plugins, Crossplane supports any API
Q: What about disaster recovery? A: Everything in Git = instant recovery. Flux ensures desired state.
Q: Performance at scale? A: Proven architectures - both Backstage and Crossplane run at massive scale
Next Steps & Roadmap​
Immediate (Next Sprint):​
- AWS provider integration
- ArgoCD alternative to Flux
- Advanced RBAC policies
- Template testing framework
Near Term (Next Month):​
- Cost management integration
- AI-assisted template creation
- Multi-cluster support
- Terraform provider bridge
Long Term (Q4 2025):​
- Full FinOps integration
- Compliance automation (SOC2, ISO27001)
- Marketplace for community templates
- SaaS offering
Demo Cleanup​
# Remove demo resources
kubectl delete whoamiapp demo-app-aug29 -n demo-namespace
kubectl delete namespace demo-namespace -n default # XR
kubectl delete namespace demo-namespace # Actual namespace
# Remove from Git
cd ../catalog-orders
git rm -r */demo-app-aug29.yaml
git commit -m "cleanup: remove demo resources"
git push origin main
Resources & Links​
Documentation​
- CLAUDE.md - AI-assisted development guide
- Cluster Setup - Complete setup guide
- Template Development - Create new templates
Repositories​
External Resources​
Speaker Notes​
Energy & Pacing​
- Start high energy - this is exciting technology!
- Slow down for technical deep dives
- Speed up during navigation/clicking
- Leave time for questions after each section
Key Messages to Emphasize​
- Speed of Development: 2 weeks to MVP
- Developer Experience: Self-service, no tickets
- Production Ready: Security, GitOps, monitoring built-in
- Extensibility: Easy to add new templates and providers
Potential Objections & Responses​
- "Too complex" → Show the simple developer experience
- "Another tool to learn" → It replaces multiple tools
- "What about our existing setup?" → It integrates, doesn't replace
Technical Issues Backup​
If demos fail:
- Have screenshots ready
- Show the generated YAML files
- Explain the concept without live demo
- Reference the recorded demo video (prepare one)
Demo Success Criteria:
- Audience understands the platform value
- At least one "wow" moment (auto-form generation)
- Clear next steps identified
- Stakeholder buy-in achieved
Good luck with the demo! 🚀