YouSave the cleaned sales query into the lake's silver layer every night, and back it up to our Azure.
ClaudeI'll find the cleaned query and the lake first.
query_list29 ms
[
{
"query": "Clean orders",
"kind": "table",
"language": "m",
"load": true,
"inRefresh": true,
"group": null,
"state": null
},
{
"query": "Sales by month",
"kind": "table",
"language": "m",
"load": true,
"inRefresh": true,
"group": null,
"state": null
},
{
"query": "Raw orders",
"kind": "table",
"language": "m",
"load": true,
"inRefresh": true,
"group": null,
"state": "New"
}
]
query_show{"query": "Clean orders", "rows": 3}41 ms
{
"query": "Clean orders",
"steps": [
"Source",
"bronze_orders",
"…"
],
"previewAt": "Added Amount",
"error": null,
"columns": [
"OrderID BIGINT",
"OrderDate DATE",
"…"
],
"status": "8 columns, first 1 000 rows · 73 ms · folded into SQL"
}
lake_list812 ms
{
"lakes": [
{
"lake": {
"name": "Lake",
"url": "lake://folder/${PROJECT_DIR}/.openbi/lake",
"address": "lake://folder/D:/Lake-demo/Sales/.openbi/lake",
"where": "this project's lake (D:\\Lake-demo\\Sales\\.openbi\\lake)",
"known_from": "the model's data source",
"project_lake": true
},
"zone": "yellow",
"writes": "Writes D:\\Lake-demo\\Sales\\.openbi\\lake (this computer)",
"exists": true,
"tables": 3,
"rows": 2154,
"bytes": 15315,
"last_change": "2026-10-26T14:55:04Z"
}
]
}
lake_tables{"lake": "Lake"}1015 ms
{
"version": 7,
"tables": [
{
"table": "bronze.orders",
"rows": 1082,
"files": 1,
"size": "6.8 KB",
"changed": "2026-10-26T14:48:44Z"
},
{
"table": "gold.sales_by_month",
"rows": 20,
"files": 0,
"size": "0 B",
"changed": "2026-10-26T14:49:37Z"
},
{
"table": "silver.orders",
"rows": 1052,
"files": 1,
"size": "8.1 KB",
"changed": "2026-10-26T14:55:04Z"
}
]
}
ClaudeThe cleaned query is Clean orders: it reads bronze.orders from the lake, trims the text, fixes the region names and types, drops blank rows, rows without a quantity and duplicates, and adds Amount. The project's lake, Lake, is on this computer (D:\Lake-demo\Sales\.openbi\lake) and already has a silver layer: silver.orders, the same 8 columns as the query. I'll make silver.orders the query's destination with Replace (each load makes the table the query's rows), then check it with a dry run.
query_destination_set{"query": "Clean orders", "lake": "Lake", "table": "silver.orders", "method": "Replace"}135 ms
{
"ok": true,
"query": "Clean orders",
"destination": {
"lake": "Lake",
"table": "silver.orders",
"method": "Replace",
"dynamic_schema": false,
"allow_creation": true
},
"lake_load": {
"name": "Sales",
"folder": "D:\\Lake-demo\\Sales\\Sales.LakeLoad"
},
"attribute": "[DataDestinations = {[Definition = [Kind = \"Reference\", QueryName = \"Clean orders_DataDestination\", IsNewTarget = true], Settings = [Kind = \"Manual\", …",
"destination_query": "shared Clean orders_DataDestination = OpenBI.Lake(\"Lake\"){[Schema = \"silver\", Item = \"orders\"]}?[Data]?;",
"zone": "yellow",
"writes": "Writes D:\\Lake-demo\\Sales\\.openbi\\lake (this computer)",
"next": "lake_load with dryRun: true checks it (rows, folding, errors); lake_load writes it."
}
ClaudeSaved in the project's lake load Sales (Sales.LakeLoad, kept the way Fabric's Dataflow Gen2 keeps destinations). Nothing has run yet. Checking it without writing:
lake_load{"queries": ["Clean orders"], "dryRun": true}518 ms
{
"ok": true,
"dry": true,
"item": "Sales",
"queries": [
{
"query": "Clean orders",
"lake": "Lake",
"table": "silver.orders",
"method": "Replace",
"rows_in_query": 1052,
"folded_by": "DuckDB"
}
],
"lakes": [],
"summary": "Clean orders → silver.orders: 1,052 rows (Replace, folded by DuckDB) — a dry run: nothing written",
"ms": 300
}
Claude1,052 rows would go into silver.orders, folded by DuckDB, nothing written. I'll run it once now, so tonight starts from a known version:
lake_load{"queries": ["Clean orders"]}635 ms
{
"ok": true,
"item": "Sales",
"queries": [
{
"query": "Clean orders",
"lake": "Lake",
"table": "silver.orders",
"method": "Replace",
"rows": 1052,
"version": 8,
"files": 1,
"bytes": 8312,
"ms": 30,
"folded_by": "DuckDB"
}
],
"lakes": [
{
"name": "Lake",
"version": 8
}
],
"summary": "Made version 8 of Lake: 1,052 rows in silver.orders (0.35 s)",
"ms": 350,
"next": "lake_tables and lake_snapshots show what it wrote; a model table reading the lake takes it at its next refresh (model_reload)."
}
lake_snapshots{"lake": "Lake", "table": "silver.orders", "limit": 3}439 ms
{
"lake": "Lake",
"table": "silver.orders",
"count": 5,
"versions": [
{
"version": 8,
"time": "2026-10-26T14:58:14Z",
"author": "OpenBI Studio (analyst@finance-pc)",
"message": "Lake load \"Sales\": Clean orders",
"changes": "added rows to 1 table · deleted rows of 1 table",
"changes_raw": "{tables_inserted_into=[4], tables_deleted_from=[4]}",
"extra": "{\"item\":\"Sales\",\"queries\":[\"Clean orders\"]}"
},
{
"version": 7,
"time": "2026-10-26T14:55:04Z",
"author": "OpenBI Studio (analyst@finance-pc)",
"message": "Lake load \"Sales\": Clean orders",
"changes": "added rows to 1 table · deleted rows of 1 table",
"changes_raw": "{tables_inserted_into=[4], tables_deleted_from=[4]}",
"extra": "{\"item\":\"Sales\",\"queries\":[\"Clean orders\"]}"
},
{
"version": 5,
"time": "2026-10-26T14:49:19Z",
"author": "OpenBI Studio (analyst@finance-pc)",
"message": "Lake load \"Sales\": Clean orders, Sales by month",
"changes": "added rows to 1 table · deleted rows of 1 table · added rows to 1 table · deleted rows of 1 table",
"changes_raw": "{tables_inserted_into=[4], tables_deleted_from=[4], inlined_insert=[6], inlined_delete=[6]}",
"extra": "{\"item\":\"Sales\",\"queries\":[\"Clean orders\",\"Sales by month\"]}"
}
]
}
ClaudeDone: version 8 of Lake, 1,052 rows in silver.orders in 0.35 s, signed OpenBI Studio (analyst@finance-pc). The earlier versions stay readable and can be restored. Now the nightly part: I'll look for your OpenBI Server.
server_workspaces72 ms
Name the server: its address, like https://bi.example.com (the studio has published to none yet).
ClaudeTwo parts of your request can't be switched on from the studio, so here is exactly where they stand.
Every night. The studio runs a load when someone asks; nightly runs are OpenBI Server's. Once this project is published to a workspace, each refresh of it runs its lake loads first (one transaction per lake), on the model's refresh schedule: on, daily or weekly, at the times you choose, a failed run e-mailed. The studio hasn't published to a server yet, so I need the server's address and the workspace. Publishing sends the project out of this computer, so I'll do it only when you say so (without its data unless you ask). Then a workspace Admin or Member turns the schedule on in the model's settings, or on the server:
OpenBI.Server.exe schedule set --workspace <workspace> --item Sales --on --daily --times 02:00
On the server, Lake is the workspace's own lake on the server's storage, not this folder; the query needs no change. One thing to know: the lake load also holds Raw orders, which reads D:\Lake-demo\incoming\orders.csv. A server reads files only from the model's folder and the folders its administrators allow, so that file needs a place the server may read.
Back it up to Azure. Lake backups are OpenBI Server's today. A server administrator makes a backup key once (OpenBI.Server.exe lake backup-key new --out <file>, kept apart from the server and the backups) and sets the nightly backup:
OpenBI.Server.exe lake backup-schedule --name ws_<workspace> --to "az://<container>/<folder>?account=<storage account>" --key-file <file> --time 01:00 --keep 7 --keep-days 30
The SAS is typed on the server when it asks, never on the command line and never here. In the studio, backups come with the Back up button and its agent tools (lake_backup, lake_backups, lake_backup_verify, lake_restore), which are being built. I don't have them yet, so nothing has been backed up.
Please don't paste Azure keys or SAS tokens into this chat: I never handle sign-ins. When a lake or a source needs one, the studio asks you in its own sign-in window ("An agent asked to connect. It does not see what you type here.") and keeps it in this computer's credential store.
Recorded on October 26, 2026 on the example’s fictional project: the tool calls as Claude made them, each result as the studio answered (open one to read it). Since then the backup tools have been built, in the next update: the same request now ends with lake_backup, which opens Back up… for you to choose your Azure container, sign in and keep your key, then backs up.17