Frugal manages Azure Virtual Desktop and its cost from inside your own Azure tenant. It runs as a container on a managed identity — no secrets, no keys — and only ever touches what you explicitly grant it. These docs walk each feature and the access it needs.
Frugal installs with a single Cloud Shell command. It creates the sign-in app registration, the platform (database, key vault, container app), and the managed identity — then hands you the URL.
$ curl -sL https://frugal.run/install.sh | bash -s -- --region <azure-region>
Paste it into Azure Cloud Shell — open shell.azure.com (or the >_ icon in the Azure portal), choose Bash, and paste. Cloud Shell is already signed in as you and provides the shell itself, so nothing is installed on your machine and it runs the same from Windows, macOS or Linux.
These are needed only for the one-time install — it registers a sign-in app and creates role assignments. Afterwards Frugal runs as a scoped, least-privilege managed identity; you don’t keep these rights for day-to-day use.
Append any of these flags to the command:
--region <azure-region> # required, e.g. australiaeast --subscription <id> # target subscription (defaults to Cloud Shell's current) --image-tag <version> # pin a release, e.g. 0.6.55 (defaults to the latest) --db-password <pw> # DB admin password (a strong random one is generated if omitted)
When it finishes it prints your app URL, e.g. https://frugal-app.<region>.azurecontainerapps.io. Open it and sign in with your work account — one consent prompt, and you land as Admin.
Frugal uses your Entra (Azure AD) work account to sign in. Two roles govern what you can do:
The first person to sign in lands as Admin. Admin-only controls are hidden (not just disabled) for Viewers, so the console stays uncluttered.
Frugal only sees subscriptions whose access you have granted to its managed identity — it is least-privilege by design. The Subscriptions page is where you add, discover, enable and sync them.
Open Subscriptions → Add a subscription, paste the subscription ID (there is a Find your subscription IDs link straight to the Azure portal), then choose what Frugal should do there:
Reader + Cost Management Reader.Contributor plus a constrained RBAC Administrator limited to one resource group, plus the FSLogix, gallery and reader roles.Frugal generates the exact command for the tier you pick. Run it in Cloud Shell as an Owner / User Access Administrator of that subscription, e.g. for View data:
# <mi-principal-id> is shown on the Subscriptions page
az role assignment create --assignee <mi-principal-id> --role "Reader" --scope /subscriptions/<sub-id>
az role assignment create --assignee <mi-principal-id> --role "Cost Management Reader" --scope /subscriptions/<sub-id>
Once the grant is in place, click Discover. Frugal lists every subscription its identity can now see and adds any new ones disabled — so nothing is synced or managed by surprise. A prompt tells you exactly which subscriptions are off; flip the Enabled toggle on the ones you want.
Cost and AVD data refresh automatically (cost nightly; topology every minute). To pull fresh data on demand, click Sync data. Each subscription shows a live status — SYNCING then OK or FAILED with the reason — and the button reports how many are still in flight.
A FAILED badge usually means the identity can see the subscription but is missing a role there (for example, no Cost Management Reader). The error text names the fix.
The Host Pools page lists every AVD host pool across your enabled subscriptions with its session-host count and active sessions. From here you create and operate pools without leaving Frugal.
Auto-scale ramps session-host capacity to real demand and powers idle hosts down — the single biggest AVD cost lever. Define when capacity should be available and how aggressively to reclaim it; Frugal starts and deallocates hosts to match, so you stop paying for empty desktops overnight and on weekends.
Frugal syncs Azure Cost Management into its own store and attributes spend by tag, so you can see exactly where money goes — per subscription and per tag.
Build golden images for your pools without hand-crafting VMs.
Frugal ships one-click hardening bundles aligned to the ACSC Essential Eight Maturity Model, with a live posture dashboard that scores a host pool against the controls it can verify.
The Governance page reads every resource Frugal can see and ranks the two things that drive hidden cost and risk:
Run PowerShell across your session hosts — built-in actions or your own scripts — for patching, configuration, hardening and cleanup, without RDP-ing into each host. The same actions can be picked as steps when you build an image, so a golden image bakes them in.
The built-in library spans host diagnostics & maintenance (health, disk report + cleanup, agent restart, diagnostics bundle, Group Policy / Intune sync, certificate import), image prep (multi-session optimisation via VDOT, AVD-optimised Teams, per-machine OneDrive with Known Folder Move, language packs, Windows updates, debloat), the desktop profiles below, and the Essential Eight hardening steps.
Add your own on the Scripted actions page: give it a name and description, paste a PowerShell script, and optionally declare parameters the operator fills in at run time (text / number / boolean — each becomes a $variable in the script). Run it against a whole host pool or a single host, or select it as a step when you build an image. Built-in actions can’t be edited or deleted — duplicate one to start from a working example. Keep secrets out of the script text — put them in $SecureVars (below).
Frugal prepends a context block to every run, so scripts stay portable across pools and tenants with no hard-coded ids or paths. Available in every script:
$Frugal.HostPool — the host pool the run targets, and $Frugal.ResourceGroup its resource group.$Frugal.SessionHost — the session host this run is executing on.$Frugal.SubscriptionId / $Frugal.TenantId — the subscription and Entra tenant ids.$Frugal.FslogixStorageAccount and $Frugal.FslogixUnc — the FSLogix storage account + profiles UNC path (blank if the pool has no FSLogix).$Vars.<name> — your shared, plain-text variables (set on the Scripted actions page).$SecureVars.<name> — secrets pulled from Key Vault at run time; never stored in the script.$<parameter> — one variable per parameter you declared on the action, already typed.Ready-made desktop profiles. Two of the most common images, one tick each when you build:
$Vars.officeChannel.Az module for all users. Adjust the package list with $Vars.devPackages.Frugal upgrades in place. It rolls the container image only — your database and settings are preserved — and migrations run automatically.
$ curl -sL https://frugal.run/upgrade.sh | bash
Pin a specific build with --image-tag <version>. The upgrade waits for the new revision to become healthy before finishing.
install.sh stands up a fresh stack (and a fresh database). Use upgrade.sh to keep your data.To remove everything and return to zero cost:
az stack sub delete --name frugal --action-on-unmanage deleteAll --yes az ad app delete --id <sign-in-app-id>
Frugal is $500 AUD / month — no feature gates, no license keys, no per-seat maths. One subscription covers every capability, unlimited users, and as many Azure subscriptions as you manage. Subscribe here.