[{"data":1,"prerenderedAt":1332},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fplaceholders":3,"docs-nav":1114},{"id":4,"title":5,"body":6,"description":1105,"extension":1106,"meta":1107,"navigation":1109,"path":1110,"seo":1111,"stem":1112,"__hash__":1113},"docs\u002Fdocs\u002Fplaceholders.md","Placeholders: dates that move by themselves, in and out",{"type":7,"value":8,"toc":1088},"minimark",[9,13,26,115,122,129,135,140,464,474,549,564,569,582,586,589,636,646,650,653,663,730,774,789,795,810,828,832,859,873,879,883,930,936,939,943,982,986,989,993,1008,1014,1023,1027,1061,1065],[10,11,5],"h1",{"id":12},"placeholders-dates-that-move-by-themselves-in-and-out",[14,15,16,17,21,22,25],"p",{},"A datasource that reads «yesterday's file» or «the last 30 days», and an Output that\nwrites «today's file», cannot hold fixed dates. Their names hold ",[18,19,20],"strong",{},"placeholders",",\nresolved at every refresh or run in a ",[18,23,24],{},"time zone"," of their own. One language,\nparsed and never evaluated, with the same messages everywhere:",[27,28,29,42],"table",{},[30,31,32],"thead",{},[33,34,35,39],"tr",{},[36,37,38],"th",{},"Where",[36,40,41],{},"What holds placeholders",[43,44,45,60,72,83,91,99,107],"tbody",{},[33,46,47,51],{},[48,49,50],"td",{},"Datasource «API call»",[48,52,53,54,59],{},"path, query, headers, JSON body (",[55,56,58],"a",{"href":57},"\u002Fdocs\u002Fapi-datasource","api-datasource.md",")",[33,61,62,65],{},[48,63,64],{},"Datasource «SFTP folder»",[48,66,67,68,59],{},"folder and files (",[55,69,71],{"href":70},"\u002Fdocs\u002Fsftp","sftp.md",[33,73,74,77],{},[48,75,76],{},"Datasource «S3 folder»",[48,78,67,79,59],{},[55,80,82],{"href":81},"\u002Fdocs\u002Fs3-datasource","s3-datasource.md",[33,84,85,88],{},[48,86,87],{},"SharePoint datasource",[48,89,90],{},"the path with its glob",[33,92,93,96],{},[48,94,95],{},"Output «SFTP server»",[48,97,98],{},"folder and file name",[33,100,101,104],{},[48,102,103],{},"Output «S3» (and the S3 copy of a published datasource)",[48,105,106],{},"the object key, or the prefix of a partitioned dataset",[33,108,109,112],{},[48,110,111],{},"Output «Email»",[48,113,114],{},"subject and attachment name (the body is sent as written)",[14,116,117,118,121],{},"A database destination's ",[18,119,120],{},"table name is not a template",": a table named by date\nwould break the catalogue and the dbt export.",[14,123,124],{},[125,126],"img",{"alt":127,"src":128},"An Output node with destination SFTP server: folder outbox\u002F{today:yyyy}\u002F{today:MM} resolved as outbox\u002F2026\u002F10, file name margin_ resolved as margin_20261027, time zone Europe\u002FRome","\u002Fmedia\u002Fguide\u002Fplaceholders\u002Fsftp-output-placeholders.png",[14,130,131],{},[132,133,134],"em",{},"An SFTP Output with dated folder and file name: under each field, «now:» shows what a run would write today (28 October 2026, Rome time).",[136,137,139],"h2",{"id":138},"the-language","The language",[27,141,142,152],{},[30,143,144],{},[33,145,146,149],{},[36,147,148],{},"Placeholder",[36,150,151],{},"Value",[43,153,154,172,185,202,230,264,280,329,384,405,421,435,451],{},[33,155,156,166],{},[48,157,158,162,163],{},[159,160,161],"code",{},"{today}",", ",[159,164,165],{},"{yesterday}",[48,167,168,169],{},"a date: ",[159,170,171],{},"2026-10-17",[33,173,174,179],{},[48,175,176],{},[159,177,178],{},"{now}",[48,180,181,182],{},"a date-time: ",[159,183,184],{},"2026-10-17T14:30:05+02:00",[33,186,187,199],{},[48,188,189,162,192,195,196],{},[159,190,191],{},"{start_of_month}",[159,193,194],{},"{start_of_week}"," (Monday), ",[159,197,198],{},"{start_of_year}",[48,200,201],{},"a date",[33,203,204,209],{},[48,205,206],{},[159,207,208],{},"{last_refresh}",[48,210,211,212,215,216,219,220,223,224,162,227,59],{},"inputs only: when the last ",[18,213,214],{},"successful"," refresh of the datasource ",[18,217,218],{},"started","; on the first refresh the datasource's ",[132,221,222],{},"initial value"," (",[159,225,226],{},"today-365",[159,228,229],{},"2024-01-01",[33,231,232,253],{},[48,233,234,237,238,237,241,237,244,237,247,237,250],{},[159,235,236],{},"{today-1}"," ",[159,239,240],{},"{today-7d}",[159,242,243],{},"{today+1d}",[159,245,246],{},"{today-2w}",[159,248,249],{},"{today-1m}",[159,251,252],{},"{today-1y}",[48,254,255,256,259,260,263],{},"offsets: a bare number is days; ",[159,257,258],{},"m"," months, ",[18,261,262],{},"clamped to the end of the month"," (31 March − 1m = 28 February)",[33,265,266,277],{},[48,267,268,237,271,237,274],{},[159,269,270],{},"{now-2h}",[159,272,273],{},"{now-30min}",[159,275,276],{},"{now+15s}",[48,278,279],{},"hours, minutes, seconds: on date-times only",[33,281,282,293],{},[48,283,284,237,287,237,290],{},[159,285,286],{},"{today:yyyyMMdd}",[159,288,289],{},"{today:dd\u002FMM\u002Fyyyy}",[159,291,292],{},"{now:yyyy-MM-dd'T'HH:mm}",[48,294,295,296,237,299,237,302,237,305,237,308,237,311,237,314,317,318,321,322,324,325,328],{},"a readable format: ",[159,297,298],{},"yyyy",[159,300,301],{},"yy",[159,303,304],{},"MM",[159,306,307],{},"dd",[159,309,310],{},"HH",[159,312,313],{},"mm",[159,315,316],{},"ss",", text in ",[159,319,320],{},"'quotes'",". ",[159,323,313],{}," is the minutes right after the hours or right before the seconds, the month otherwise (Excel's rule): ",[159,326,327],{},"ddmmyyyy"," is a date",[33,330,331,339],{},[48,332,333,237,336],{},[159,334,335],{},"{today:MMMM yyyy}",[159,337,338],{},"{today:EEE dd MMM}",[48,340,341,342,237,345,348,349,162,352,355,356,237,359,362,363,162,366,369,370,374,375,378,379,383],{},"the names: ",[159,343,344],{},"MMMM",[159,346,347],{},"MMM"," the month (",[159,350,351],{},"October",[159,353,354],{},"Oct","), ",[159,357,358],{},"EEEE",[159,360,361],{},"EEE"," the day of the week (",[159,364,365],{},"Saturday",[159,367,368],{},"Sat","). In the language of a ",[55,371,373],{"href":372},"\u002Fdocs\u002Fpushmail","Pushmail"," cell's subject and file names (",[159,376,377],{},"ottobre 2026",") and of a ",[55,380,382],{"href":381},"\u002Fdocs\u002Fcapabilities\u002Freports","report",", in English everywhere else",[33,385,386,391],{},[48,387,388],{},[159,389,390],{},"{today:%Y%m%d}",[48,392,393,394,397,398,401,402],{},"a strftime format (a ",[159,395,396],{},"%"," outside quotes makes it one); ",[159,399,400],{},"%s"," is refused, use ",[159,403,404],{},":epoch",[33,406,407,418],{},[48,408,409,237,412,237,415],{},[159,410,411],{},"{now:epoch}",[159,413,414],{},"{now:epoch_ms}",[159,416,417],{},"{now:iso}",[48,419,420],{},"seconds or milliseconds since 1970; ISO 8601",[33,422,423,428],{},[48,424,425],{},[159,426,427],{},"{symbol}",[48,429,430,431,434],{},"a ",[18,432,433],{},"list"," variable of the datasource (no offset, no format)",[33,436,437,445],{},[48,438,439,162,442],{},[159,440,441],{},"{day}",[159,443,444],{},"{day_end}",[48,446,430,447,450],{},[18,448,449],{},"range"," variable and the end of its window (offsets and formats allowed)",[33,452,453,461],{},[48,454,455,162,458],{},[159,456,457],{},"{{",[159,459,460],{},"}}",[48,462,463],{},"a literal brace",[14,465,466,467,470,471,473],{},"On an ",[18,468,469],{},"Output"," there are four more, and no ",[159,472,208],{},":",[27,475,476,484],{},[30,477,478],{},[33,479,480,482],{},[36,481,148],{},[36,483,151],{},[43,485,486,496,520,534],{},[33,487,488,493],{},[48,489,490],{},[159,491,492],{},"{run_id}",[48,494,495],{},"the run's number, the one in the run history",[33,497,498,503],{},[48,499,500],{},[159,501,502],{},"{flow}",[48,504,505,506,162,509,512,513,516,517,519],{},"the flow's name; in a file name, a folder or a key anything but letters, digits, ",[159,507,508],{},".",[159,510,511],{},"-"," and ",[159,514,515],{},"_"," becomes ",[159,518,515],{}," (in a subject it stays as it is)",[33,521,522,527],{},[48,523,524],{},[159,525,526],{},"{date}",[48,528,529,531,532],{},[159,530,161],{},": ",[159,533,171],{},[33,535,536,541],{},[48,537,538],{},[159,539,540],{},"{datetime}",[48,542,543,545,546],{},[159,544,178],{}," written ",[159,547,548],{},"2026-10-17_143005",[14,550,551,162,553,162,555,512,557,559,560,563],{},[159,552,526],{},[159,554,540],{},[159,556,492],{},[159,558,502],{}," are the four names the SFTP Output had\nbefore this language: a file name that uses them is written with ",[18,561,562],{},"the same bytes","\nas before (the Output's zone is UTC unless set).",[565,566,568],"h3",{"id":567},"the-time-zone","The time zone",[14,570,571,572,575,576,578,579,581],{},"Every datasource and every Output node has one (an IANA name such as ",[159,573,574],{},"Europe\u002FRome",";\nempty = UTC). It decides what «today» is: at 00:30 in Rome ",[159,577,161],{}," is already the\n18th, while in UTC it is still the 17th. Date-times carry the zone's offset; ",[159,580,404],{},"\nis the same instant in every zone.",[565,583,585],{"id":584},"names-that-cannot-escape-their-folder","Names that cannot escape their folder",[14,587,588],{},"What a placeholder resolves to cannot take a name out of its place:",[590,591,592,611,631],"ul",{},[593,594,430,595,598,599,602,603,606,607,610],"li",{},[18,596,597],{},"file name"," (SFTP, email attachment) cannot get a ",[159,600,601],{},"\u002F"," or ",[159,604,605],{},"\\"," from a value\n(",[159,608,609],{},"{today:yyyy\u002FMM}"," in a file name is refused: put the folders in the folder field);",[593,612,430,613,616,617,620,621,624,625,602,628,630],{},[18,614,615],{},"folder"," or an ",[18,618,619],{},"S3 key"," may get levels from a value (",[159,622,623],{},"exports\u002F{today:yyyy\u002FMM}\u002F","\nis fine) but no segment may be ",[159,626,627],{},"..",[159,629,508],{},";",[593,632,633,635],{},[159,634,502],{}," is always made safe in names, folders and keys.",[14,637,638,639,641,642,645],{},"A dated SFTP ",[18,640,615],{}," of an Output (",[159,643,644],{},"\u002Foutbox\u002F{today:yyyy}\u002F{today:MM}",") is created\nwhen it does not exist yet; a folder without placeholders must exist, as before (a\ntypo is an error, not a new folder).",[136,647,649],{"id":648},"variables","Variables",[14,651,652],{},"A datasource (API call, SFTP, SharePoint, S3) may have up to 10 variables, one per\nline in its form:",[654,655,660],"pre",{"className":656,"code":658,"language":659},[657],"language-text","branch = MI, RM, TO\nday = today-7 .. today step 1d\n","text",[159,661,658],{"__ignoreMap":662},"",[590,664,665,673],{},[593,666,430,667,223,669,672],{},[18,668,433],{},[159,670,671],{},"name = value1, value2",") gives its values one by one;",[593,674,430,675,223,677,680,681,684,685,162,688,162,691,162,694,162,697,162,700,703,704,707,708,162,711,703,714,162,717,162,720,723,724,727,728,508],{},[18,676,449],{},[159,678,679],{},"name = start .. end step N\u003Cunit>",") gives every value ",[18,682,683],{},"from the start\n(included) to the end (excluded)"," by the step: ",[159,686,687],{},"1d",[159,689,690],{},"7d",[159,692,693],{},"1w",[159,695,696],{},"1m",[159,698,699],{},"1y",[159,701,702],{},"1h",",\n",[159,705,706],{},"30min",". Start and end are written without braces — ",[159,709,710],{},"today-7",[159,712,713],{},"now-2h",[159,715,716],{},"start_of_month",[159,718,719],{},"last_refresh",[159,721,722],{},"2026-01-01",". Without ",[159,725,726],{},"step"," the forms take ",[159,729,687],{},[14,731,732,735,736,739,740,743,744,747,748,223,751,753,754,757,758,761,762,765,766,769,770,773],{},[159,733,734],{},"day = today-7 .. today step 1d"," is the ",[18,737,738],{},"seven days before today"," (today excluded).\nTo include today write ",[159,741,742],{},".. today+1",". A range whose start ",[18,745,746],{},"and"," end are dates and that\nsteps by days, weeks, months or years gives ",[18,749,750],{},"dates",[159,752,441],{}," = ",[159,755,756],{},"2026-10-11","); any\nother gives ",[18,759,760],{},"date-times in the datasource's zone",", values and window ends alike (so\n",[159,763,764],{},"{x_end}"," has the same type on every window): a date bound is its local midnight, an\nISO date-time without an offset (",[159,767,768],{},"2026-10-10T06:00",") is read on the zone's clock.\n",[159,771,772],{},"hour = 2026-03-29 .. 2026-03-30 step 1h"," in Rome gives the 23 hours of that day\n(local 00, 01, 03 … 23), the autumn change 25. Month steps are counted from the start,\nso 31 January by months is 28 February, then 31 March.",[14,775,776,735,778,781,782,512,785,788],{},[159,777,444],{},[18,779,780],{},"end of each value's window",": the next value, or the range's end\nfor the last one. The windows are half-open and never overlap — what an API taking\n",[159,783,784],{},"from",[159,786,787],{},"to"," wants:",[654,790,793],{"className":791,"code":792,"language":659},[657],"from={day}&to={day_end}        →  from=2026-10-11&to=2026-10-12, … , from=2026-10-17&to=2026-10-18\n",[159,794,792],{"__ignoreMap":662},[14,796,797,798,801,802,805,806,809],{},"Several variables make ",[18,799,800],{},"every combination"," of their values. Every row says the values\nit came from in ",[159,803,804],{},"_param_\u003Cname>"," (one column per variable, not for ",[159,807,808],{},"_end",").",[14,811,812,813,816,817,820,821,824,825,827],{},"The number of values is capped: a range may give at most ",[159,814,815],{},"PLACEHOLDERS__MAX_VALUES","\nvalues (engine setting, default ",[18,818,819],{},"1000","), and the combinations of a file datasource's\nvariables at most as many — each one is a listing of the folder. An API call is also\nbounded by ",[159,822,823],{},"API__MAX_CALLS"," (500). The cap is checked when the datasource is saved and\nat every refresh: a range that grew past it (one starting at ",[159,826,719],{}," after a\nlong pause) fails the refresh, naming it.",[136,829,831],{"id":830},"files-one-expansion-per-value","Files: one expansion per value",[14,833,834,835,838,839,842,843,846,847,850,851,854,855,858],{},"On a file datasource the folder and the glob are expanded ",[18,836,837],{},"once per combination",", and\nevery file any expansion matches is read — ",[18,840,841],{},"once",", even when two values match it (the\nvalues of the first one go in its ",[159,844,845],{},"_param_"," columns). With a dated folder (",[159,848,849],{},"in\u002F{day}",")\n",[159,852,853],{},"_file"," is the path below the folder's fixed part (",[159,856,857],{},"2026-10-14\u002Fa.csv","), so the day is\nnot lost.",[14,860,861,864,865,868,869,872],{},[18,862,863],{},"A value without its file is skipped and listed",": the refresh succeeds, and the run\nsays which values had no file («1 value without a file: day=2026-10-15\n(in\u002Fsales_20261015.csv)»), in the run history and the datasource's imports. ",[18,866,867],{},"If no value\nfinds any file",", the refresh ",[18,870,871],{},"fails",": an empty range is a broken feed, not an empty\ntable. A datasource without placeholders behaves as before.",[14,874,875,878],{},[18,876,877],{},"Check the files"," in the forms lists what every expansion takes and the values without\na file, before saving.",[136,880,882],{"id":881},"refreshing-snapshot-or-append-by-key","Refreshing: snapshot or append by key",[14,884,885,886,889,890,893,894,897,898,901,902,905,906,908,909,912,913,916,917,919,920,923,924,926,927,929],{},"Every file datasource (SFTP, SharePoint, S3), like the API call, refreshes as a\n",[18,887,888],{},"snapshot"," (the table is rebuilt from what was read) or ",[18,891,892],{},"appended by key",": the rows\nread are merged into the current table, the rows whose ",[18,895,896],{},"key columns"," come again are\n",[18,899,900],{},"replaced",", new keys are added: rows read again never pile up on the old ones. On a\nfile datasource a key is a ",[18,903,904],{},"group"," of rows: keyed by ",[159,907,853],{}," (or ",[159,910,911],{},"_param_day","), a\nfile read again replaces ",[18,914,915],{},"all"," the old rows of that file with ",[18,918,915],{}," its new ones.\nSo rows of one refresh that share a key are ",[18,921,922],{},"all kept"," — wanted for ",[159,925,853],{},", and\nmaybe not for a key meant to identify one row: when the key does not hold ",[159,928,853],{}," the\nrun says how many keys came on more than one new row («3 keys on several rows»), to\ncheck that the key really is one. (The API call keeps the last row of a key repeated\nin one refresh: there a key is one record.) The classic incremental import:",[654,931,934],{"className":932,"code":933,"language":659},[657],"day = today-3 .. today step 1d        folder: in        files: sales_{day:yyyyMMdd}.csv\nmode: append, keys: _param_day, id\n",[159,935,933],{"__ignoreMap":662},[14,937,938],{},"Every night it re-reads the last three days (a late correction replaces the old rows of\nits day) and keeps everything read before.",[565,940,942],{"id":941},"braces-written-before","Braces written before",[14,944,945,946,949,950,237,952,954,955,958,959,961,962,964,965,162,967,162,969,971,972,974,975,977,978,981],{},"Braces now always mean a placeholder in these fields. The definitions stored before\nthis language keep their meaning: the gateway's migration ",[18,947,948],{},"0013"," writes their literal\nbraces as ",[159,951,457],{},[159,953,460],{}," — in the email subject and attachment name, the S3 key and the\ncopy's key, the SFTP Output's folder, the folder and pattern of the SFTP datasources\nand the path of the SharePoint ones — so ",[159,956,957],{},"Sales {North}"," is still sent as ",[159,960,957],{}," — every brace, adjacent ones too (a ",[159,963,457],{}," written before was two braces, and\nstays two). The SFTP Output's file name keeps its ",[159,966,526],{},[159,968,540],{},[159,970,492],{}," and\n",[159,973,502],{}," exactly where the code of before found them; any other brace there is escaped\ntoo. From then on, a literal brace is\nwritten ",[159,976,457],{}," (a ",[159,979,980],{},"{1}"," typed in a form is refused as an unknown placeholder, with the\nmessage, when the datasource is saved or before the run).",[565,983,985],{"id":984},"lengths","Lengths",[14,987,988],{},"A file name (SFTP, attachment) resolved from placeholders, and every level of a\nresolved folder or key, may hold 255 bytes, a resolved S3 key 1024 bytes in all;\nlonger is refused, before writing anything. A name written without braces is used as\nbefore. No resolved value may hold a control character (a line break, a tab), and a\nsubject no line break; a flow's name cannot hold one either when it is created or\nrenamed (it reaches {flow}).",[136,990,992],{"id":991},"checked-before-saving-previewed-while-typing","Checked before saving, previewed while typing",[14,994,995,996,999,1000,1003,1004,1007],{},"The engine's checker runs ",[18,997,998],{},"when a datasource is saved"," (an unknown placeholder, a\nvariable not used anywhere, an empty range, a range over the cap, append mode without\nkeys: refused with the message the refresh would give) and ",[18,1001,1002],{},"before every run"," of a\nflow (the Output's templates: refused before anything is queued). Every form shows the\n",[18,1005,1006],{},"resolved value while you type"," — «now: export_20261018.csv», or «7 values:\nsales_20261011.csv … sales_20261017.csv» — or the message of what is wrong.",[14,1009,1010],{},[125,1011],{"alt":1012,"src":1013},"The API call form: the path \u002F{today-30}.. resolved as now: \u002F2026-09-28.., the query parameters, the variables field and the list of dynamic values","\u002Fmedia\u002Fguide\u002Fplaceholders\u002Fplaceholders-api-path.png",[14,1015,1016],{},[132,1017,1018,1019,1022],{},"An «API call» datasource: under the path, «now:» shows what ",[159,1020,1021],{},"{today-30}"," resolves to today; under the fields, the dynamic values the form accepts.",[136,1024,1026],{"id":1025},"proofs","Proofs",[14,1028,1029,1032,1033,162,1036,1039,1040,1043,1044,703,1047,162,1050,1053,1054,1057,1058,508],{},[159,1030,1031],{},"backend\u002Ftests\u002Ftest_placeholders.py"," (the language, outputs, ranges),\n",[159,1034,1035],{},"test_api_placeholders.py",[159,1037,1038],{},"test_file_ranges.py"," (SFTP and SharePoint expansions,\nmissing values, append), ",[159,1041,1042],{},"test_s3_source.py",", the outputs in ",[159,1045,1046],{},"test_sftp.py",[159,1048,1049],{},"test_s3_destination.py",[159,1051,1052],{},"test_email_destination.py","; the gateway's part in\n",[159,1055,1056],{},"gateway\u002Ftests\u002Ftest_placeholders_gateway.py",". Against real servers (throwaway MinIO,\nOpenSSH and SMTP containers) and through the dev stack: ",[159,1059,1060],{},"e2e\u002Fplaceholders\u002F",[136,1062,1064],{"id":1063},"related","Related",[590,1066,1067,1074,1081],{},[593,1068,1069,1073],{},[55,1070,1072],{"href":1071},"\u002Fdocs\u002Fcapabilities","Capabilities",": where placeholders fit among the other features",[593,1075,1076,1080],{},[55,1077,1079],{"href":1078},"\u002Fdocs\u002Fcapabilities\u002Fflows","Flows",": the Output nodes whose names hold placeholders",[593,1082,1083,1087],{},[55,1084,1086],{"href":1085},"\u002Fdocs\u002Fsources","Sources",": the datasources that read files and APIs by date",{"title":662,"searchDepth":1089,"depth":1090,"links":1091},2,3,[1092,1096,1097,1098,1102,1103,1104],{"id":138,"depth":1089,"text":139,"children":1093},[1094,1095],{"id":567,"depth":1090,"text":568},{"id":584,"depth":1090,"text":585},{"id":648,"depth":1089,"text":649},{"id":830,"depth":1089,"text":831},{"id":881,"depth":1089,"text":882,"children":1099},[1100,1101],{"id":941,"depth":1090,"text":942},{"id":984,"depth":1090,"text":985},{"id":991,"depth":1089,"text":992},{"id":1025,"depth":1089,"text":1026},{"id":1063,"depth":1089,"text":1064},"A datasource that reads «yesterday's file» or «the last 30 days», and an Output that\nwrites «today's file», cannot hold fixed dates. Their names hold placeholders,\nresolved at every refresh or run in a time zone of their own. One language,\nparsed and never evaluated, with the same messages everywhere:","md",{"source":1108},"docs\u002Fplaceholders.md",true,"\u002Fdocs\u002Fplaceholders",{"title":5,"description":1105},"docs\u002Fplaceholders","kxI3opNnhn3ZtzbTD2AfTWJIBLH6WubgosgUpXbeszU",[1115,1134,1184,1211,1243,1272,1298,1324],{"title":1116,"icon":1117,"intro":1118,"items":1119},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[1120,1122,1125,1128,1131],{"path":1121,"title":1116},"\u002Fdocs\u002Fgetting-started",{"path":1123,"title":1124},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":1126,"title":1127},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":1129,"title":1130},"\u002Fdocs\u002Fconcepts","Concepts",{"path":1132,"title":1133},"\u002Fdocs\u002Foverview","Overview (README)",{"title":1072,"icon":1135,"intro":1136,"items":1137},"capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[1138,1140,1142,1145,1148,1150,1153,1156,1159,1162,1165,1168,1171,1174,1176,1178,1181],{"path":1071,"title":1139},"All capabilities",{"path":1078,"title":1141},"Low-code flows",{"path":1143,"title":1144},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":1146,"title":1147},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":381,"title":1149},"Pixel-perfect reports",{"path":1151,"title":1152},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":1154,"title":1155},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":1157,"title":1158},"\u002Fdocs\u002Fscripting","Python and R",{"path":1160,"title":1161},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":1163,"title":1164},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":1166,"title":1167},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":1169,"title":1170},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":1172,"title":1173},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":372,"title":1175},"Pushmail: datasources, reports and dashboards by email",{"path":1110,"title":1177},"Dynamic dates",{"path":1179,"title":1180},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":1182,"title":1183},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":1086,"icon":1185,"intro":1186,"items":1187},"sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[1188,1190,1193,1196,1198,1200,1202,1205,1208],{"path":1085,"title":1189},"All sources",{"path":1191,"title":1192},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":1194,"title":1195},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":81,"title":1197},"S3 buckets",{"path":70,"title":1199},"SFTP folders",{"path":57,"title":1201},"HTTP APIs",{"path":1203,"title":1204},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":1206,"title":1207},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":1209,"title":1210},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":1212,"icon":1213,"intro":1214,"items":1215},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[1216,1219,1222,1225,1228,1230,1231,1233,1234,1237,1240],{"path":1217,"title":1218},"\u002Fdocs\u002Fconnections","All connections",{"path":1220,"title":1221},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":1223,"title":1224},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":1226,"title":1227},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":70,"title":1229},"SFTP servers",{"path":57,"title":1201},{"path":1203,"title":1232},"SharePoint",{"path":1206,"title":1207},{"path":1235,"title":1236},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1238,"title":1239},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":1241,"title":1242},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":1244,"icon":1245,"intro":1246,"items":1247},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1248,1251,1254,1257,1260,1263,1266,1269],{"path":1249,"title":1250},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1252,"title":1253},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":1255,"title":1256},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":1258,"title":1259},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":1261,"title":1262},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1264,"title":1265},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1267,"title":1268},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1270,"title":1271},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1273,"icon":1274,"intro":1275,"items":1276},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1277,1280,1283,1286,1289,1292,1295],{"path":1278,"title":1279},"\u002Fdocs\u002Fgovernance","Overview",{"path":1281,"title":1282},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":1284,"title":1285},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1287,"title":1288},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1290,"title":1291},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1293,"title":1294},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1296,"title":1297},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1299,"icon":1300,"intro":1301,"items":1302},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1303,1306,1309,1312,1315,1318,1321],{"path":1304,"title":1305},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1307,"title":1308},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1310,"title":1311},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1313,"title":1314},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1316,"title":1317},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1319,"title":1320},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1322,"title":1323},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1325,"icon":1326,"intro":1327,"items":1328},"Reference","reference","Release process and the remaining reference pages.",[1329],{"path":1330,"title":1331},"\u002Fdocs\u002Frelease-process","Release process",1793656371142]