I spend most of my time in Microsoft Fabric — notebooks, lakehouses, semantic models — and I wanted one tool that just does the everyday chores for me instead of clicking through the portal. So I built futils, a single Go binary with an interactive menu that talks straight to the Fabric REST APIs: run notebooks and pipelines, refresh semantic models, move items between workspaces, and deploy from git. The deploy flow is the part I think is genuinely cool.
Open source: https://github.com/DanielAndreassen97/futils
Deploy from git
Deployment pipelines don't care about git, and fabric-cicd wants python and yaml when I mostly just want to see what's about to change and ship it. futils reads origin/<branch> directly — the pushed state on the remote, not your local files — so it deploys exactly what's in git, and a local change you haven't committed and pushed is never picked up by accident. It compares every item against the target workspace and sorts them into new / changed / orphan before anything is touched, and the whole diff is rendered as one HTML file you can open and share:
- line-by-line diffs per item
- summary cards per class
- every GUID it will rewrite from source to target (lakehouses, workspaces, SQL endpoints, OneLake shortcuts)
- which semantic model each report gets connected to
Fabric stores GUIDs as-is in git, so futils translates them by item name instead — no parameter.yml to maintain.
After the compare you cherry-pick exactly which items to deploy. Items that exist in the target but not in git are only deleted after their own confirm, and things that hold data, like lakehouses, get a second confirm that names each one, because deleting those deletes tables. New items land in workspace folders matching the repo structure, pipelines are published in the right order so a pipeline that calls another never lands first, and at the end it runs the notebooks/pipelines you've set up as post-deploy jobs and saves a timestamped HTML report in your repo.
The other flows
- Run notebooks or pipelines with parameter overrides — the form pre-fills each parameter's default, so you just change what you want.
- Refresh semantic models with a table picker.
- Schema compare — shows drift between two environments' lakehouses, also as an HTML page.
- Move items between workspaces.
Try it without a tenant
futils demo starts the tool against a built-in fake tenant. Quit and you're back to normal — nothing sticks.
Install
brew install DanielAndreassen97/tap/futils # macOS / Linux
scoop bucket add futils https://github.com/DanielAndreassen97/scoop-bucket
scoop install futils # Windows
Or grab a prebuilt binary from the releases page.
Feedback and issues very welcome, especially item types you deploy that I haven't covered yet.