Flutter app
Collects user input and sends an authenticated HTTPS request.
Zero to MVP AI Bootcamp
Move the Flutter app and NestJS API from GitHub into a secure, observable Azure environment with an automated delivery pipeline.
Today you ship
An installable Flutter build and production-ready NestJS container on Azure, connected safely to Supabase and Stripe and deployed through GitHub Actions.
Scroll to move through the presentation.
Build, test, checkpoint, and ship.
Deployment begins with a map of responsibilities and trust boundaries. The Flutter app is installed on a user's device and calls the public NestJS API. Azure runs the protected API, Supabase stores marketplace records, and Stripe processes test payments and sends signed events back to the backend.
The customer taps Pay deposit in Flutter. NestJS creates the Stripe checkout request, Stripe handles payment, a signed webhook reaches NestJS, and Supabase records the verified result before the app displays confirmation.
The mobile client uses one public backend boundary while protected integrations remain on the server.
Collects user input and sends an authenticated HTTPS request.
Receives traffic at the public Container App address.
Validates identity and input, then applies business rules.
Stores users, services, bookings, and verified payment state.
Processes the test payment and signs the completion webhook.
Verifies the event before changing booking state.
The app refreshes trusted status and displays confirmation or recovery.
The phone never receives database administrator credentials, the Stripe secret key, or webhook signing secret.
Apply the concept
Success looks like
A teammate can trace the live booking journey and identify where each component runs, which party initiates each request, and where credentials are allowed.
Watch for
Azure resources need an intentional home before deployment. A subscription is the billing and policy scope. A resource group is the lifecycle boundary for this application. Region, names, tags, access roles, and budgets make the environment understandable and controllable.
The marketplace uses one workshop resource group in a selected region. Its registry, Container Apps environment, backend, and monitoring resources share consistent names and ownership tags.
| Concept | Purpose | Marketplace decision |
|---|---|---|
| Tenant | Identity and organizational directory | Use the approved organization or workshop tenant |
| Subscription | Billing, quota, and policy boundary | Confirm the subscription before deployment |
| Resource group | Application lifecycle and cost grouping | Keep workshop cloud resources together |
| Region | Physical service location | Choose one supported region deliberately |
| RBAC role | Permitted Azure operations | Grant least privilege at the smallest useful scope |
| Budget | Spend visibility and alerts | Set thresholds before the first deployment |
Apply the concept
Success looks like
Every resource has a known subscription, resource group, region, owner, purpose, and cost boundary.
Watch for
A backend that works in a local development process is not automatically ready for a managed container. Production readiness means a repeatable image, validated runtime configuration, correct network binding, a health endpoint, safe logs, and predictable startup and shutdown.
Azure chooses the container's runtime settings. NestJS reads the assigned port, listens on all interfaces, validates required Supabase and Stripe values at startup, and reports health without revealing secrets.
Apply the concept
Use this prompt
Review this NestJS backend for Azure Container Apps readiness. Check its Docker stages, production command, host and port binding, environment validation, health endpoint, graceful shutdown, logs, and secret handling. Explain blockers first, then propose the smallest changes. Do not place secrets in the Dockerfile or image.
Success looks like
The production image starts from a clean environment, responds to health checks, reaches required dependencies, and logs useful failures without exposing private values.
Watch for
Azure Container Registry stores versioned application images. Azure Container Apps runs a selected image as a managed HTTPS service, creates a revision for configuration or image changes, and can scale replicas within explicit limits.
The class publishes a NestJS image tagged with the release identifier, creates the marketplace API Container App, exposes only HTTPS ingress, and verifies the active revision before connecting Flutter.
Apply the concept
Use this prompt
Create a deployment checklist for this Dockerized NestJS API using Azure Container Registry and Azure Container Apps. Include placeholders for subscription, resource group, region, registry, image tag, environment, app name, target port, health URL, and replica limits. Explain every command before it runs and stop if the active Azure context is unexpected.
Success looks like
A traceable backend revision is healthy at an Azure HTTPS address and its image, configuration, and resource ownership can be identified.
Watch for
GitHub is the shared source of truth for code, review, and release history. GitHub Actions turns repository events into repeatable checks and deployments. A pull request proves the change is safe to merge; an approved main-branch commit builds one traceable image, publishes it to Azure Container Registry, and deploys that same artifact to Azure Container Apps.
A developer opens a pull request for the NestJS API. GitHub Actions installs locked dependencies, runs lint, tests, type checks, and a container build. After review and merge, the deployment job authenticates to Azure with a short-lived identity, publishes an image tagged with the commit SHA, deploys it, and verifies the health endpoint.
| Concept | Do | Do not |
|---|---|---|
| Source control | Use branches, small commits, pull requests, and review | Push unreviewed production changes directly to main |
| Validation | Require lint, tests, type checks, and container validation | Deploy merely because the code compiled on one laptop |
| Identity | Use OpenID Connect and least-privilege Azure roles | Store a permanent Azure password or broad owner credential |
| Secrets | Limit secrets to approved environments and runtime services | Expose production secrets to pull-request jobs or logs |
| Artifact | Tag one image with the commit SHA and deploy that exact image | Rely only on a mutable latest tag or rebuild unknown code |
| Release | Require approval, health verification, and rollback evidence | Assume a green workflow means the user journey works |
Repository checks protect code quality. Azure runtime secrets still belong in the deployment platform, not in workflow YAML.
Review first, then build and deploy one traceable artifact through controlled identities and environments.
A focused code change is committed without secrets.
Reviewers inspect the change, purpose, and risk.
GitHub Actions runs lint, tests, types, and container validation.
Required review and green checks permit main to advance.
The approved workflow receives short-lived, scoped Azure access.
One image tagged with the commit SHA enters Azure Container Registry.
Azure Container Apps runs that exact image as a new revision.
Health and journey checks accept the release or restore the healthy revision.
The pipeline can deploy the backend automatically. Mobile store distribution needs its own signing, review, and release workflow.
Apply the concept
Use this prompt
Design a secure GitHub Actions pipeline for this Dockerized NestJS API and Azure Container Apps. Separate pull-request validation from production deployment. Include locked dependency installation, lint, tests, type checks, container build, immutable commit-SHA image tag, Azure Container Registry push, GitHub environment approval, OpenID Connect authentication, Container App deployment, health smoke test, concurrency control, and rollback evidence. Explain required repository settings and permissions before writing YAML. Do not use long-lived Azure credentials or expose application secrets to pull-request jobs.
Success looks like
An invalid pull request is blocked, while an approved main-branch commit produces one traceable image and a healthy Azure revision with visible GitHub deployment history.
Watch for
Deployment separates public client configuration from server secrets. Flutter may know the public API address and publishable Stripe key. NestJS alone receives privileged Supabase and Stripe values through runtime secret references.
The Stripe secret key and webhook signing secret are configured on the Container App. Stripe sends test events to the Azure webhook URL, and NestJS verifies the signature before updating Supabase.
Apply the concept
Use this prompt
Audit this Flutter, NestJS, Supabase, Stripe, and Azure configuration. Create a table with value, owner, public-or-secret classification, allowed location, rotation action, and exposure test. Treat service-role keys, Stripe secret keys, and webhook signing secrets as server-only.
Success looks like
The live integrations work, every sensitive value has one approved runtime location, and no privileged credential appears in Git, image history, logs, or the Flutter package.
Watch for
A mobile app is not hosted like the API. Flutter produces signed Android or iOS artifacts that are installed or distributed. Build-time environments keep local and production API addresses separate, while server credentials remain outside the package.
The production flavor points to the Azure HTTPS API. The signed build is installed on a physical phone and completes login, booking, and Stripe test payment without referring to localhost.
Apply the concept
Use this prompt
Review this Flutter app for a production build that calls the Azure NestJS API. Check environment selection, API URL, public versus secret values, Android/iOS network settings, signing requirements, error states, and release commands. Identify any value that must not be compiled into the app.
Success looks like
An installable production build uses the Azure API and completes the core journey on a physical device without containing server credentials.
Watch for
A deployment is complete only when the team can see its health and recover from failure. Azure revision status, container logs, request evidence, metrics, replica settings, and budgets provide the operational picture.
A revision starts with a missing Supabase value and fails health checks. The team finds the startup error, restores traffic to the healthy revision, corrects the configuration, and retests from the phone.
Apply the concept
Use this prompt
Create an Azure Container Apps incident worksheet with time, active revision, image, symptom, health state, relevant logs, suspected cause, safe rollback, verification, and follow-up. Exclude secrets and private customer content.
Success looks like
The team can identify the live revision, explain a controlled failure from evidence, restore service, and prove the mobile journey works afterward.
Watch for
Build brief
Deploy the working NestJS backend from GitHub to Azure through GitHub Actions and connect an installable Flutter release to the live environment.
User story
As a mobile user, I can complete the existing booking and test-payment journey against a secure, observable cloud backend.
Document each request, trust boundary, public endpoint, secret, and external dependency.
Set the resource group, region, names, tags, access, budget, and required providers.
Validate configuration, expose health, emit safe logs, and build the production container.
Push the tagged image to Azure Container Registry and run it on Azure Container Apps.
Validate pull requests and deploy approved main-branch commits using short-lived Azure access.
Set runtime secrets, allowed URLs, and the signed Stripe test webhook.
Use the production API environment, sign the app, and install it on a physical device.
Complete the live journey, inspect logs, trigger a safe failure, and restore the healthy revision.