Build, demo and ship GFT prototypes faster on Azure.
This is the GFT Tech Office Azure starter — not a real solution. Clone it to spin up a new sales/delivery prototype: it ships a home, the Team Backlog, users & roles, the Container Apps infra, and Solution Hub registration. Follow the steps below to make it your own.
0
Backlog ideas
0
Accepted
0
Built
What's in the box
Everything a prototype needs on day one
Team Backlog
Suggestions the team proposes, votes on and tracks from proposed to built, with file attachments — the reference slice to copy when you model your own entity. 0 ideas, 0 accepted.
Users & roles
App-level identity → admin/user roles persisted and managed in-app. First sign-in on a fresh database is bootstrapped as admin. (Wire up real app-level auth before exposing it.)
Azure infra + Hub
One terraform apply deploys a Container App into the shared Container Apps environment on the shared Flexible Server, binds a vanity domain, and registers the solution on the Solutions Lab Hub.
Get started
How to use this template
This solution is the GFT Tech Office Azure template. To spin up a new prototype, clone it, rebrand it, point the infra at a unique name, and deploy — the deploy also registers the solution on the Solutions Lab Hub. The steps below are the manual runbook (creating the Azure DevOps repo is not automated).
- 1
Create the repository in Azure DevOps
Each solution lives in its own repo under the Tech Office Azure DevOps project, named GftUs.SolutionsLab.<Name>. Create it, seed it from this template, then clone it locally.
- 2
Rebrand the solution
Everything in the UI (wordmark, page titles, hero copy) reads from one file. Edit it and the whole app renames.
- 3
Set the infrastructure names
Infra names are parameterised in Terraform. Copy the example tfvars and set a unique service name, database name/user and vanity hostname under azure.techoffice.gftus.com.
- 4
Edit the Terraform state key by hand
Terraform backends can't use variables, so the remote-state key must be changed by hand — once per solution. Pick a unique slug so you don't clash with the template's own state lock or Hub entry.
- 5
Implement application-level authentication
There is NO platform sign-in (no EasyAuth). Authentication is the app's job and is mandatory before you expose the deployment — otherwise every visitor is treated as the same user. The single integration point is resolveAuthenticatedEmail() in app/lib/auth.ts.
- 6
Authenticate the CLIs
A single apply builds the image in the shared ACR, talks to Azure, and publishes the Hub entry to the shared (GCP) registry bucket — so both the Azure CLI and gcloud must be authenticated on the machine running apply.
- 7
Deploy to Azure Container Apps
A single apply builds the image via az acr build, provisions the database + role on the shared Flexible Server, deploys the Container App into the shared Container Apps environment, and binds the vanity domain with a managed certificate. The shared Database, Network, Registry and ContainerApps stacks must already exist.
- 8
Confirm the Solution Hub listing
The same apply publishes solutions/<key>/solution.json to the shared Hub registry bucket, so the solution appears on the Solutions Lab Hub automatically. No separate step is needed.
- 9
Build your first feature
The Team Backlog is the reference CRUD slice. To model whatever your prototype tracks, copy it end to end and rename.