[{"data":1,"prerenderedAt":834},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fsources\u002Ffiles":3,"docs-nav":621},{"id":4,"title":5,"body":6,"description":16,"extension":613,"meta":614,"navigation":616,"path":617,"seo":618,"stem":619,"__hash__":620},"docs\u002Fdocs\u002Fsources\u002Ffiles.md","Uploaded files",{"type":7,"value":8,"toc":599},"minimark",[9,13,17,22,132,151,155,166,171,174,248,253,257,278,281,285,291,295,314,324,427,438,441,483,486,490,565,569],[10,11,5],"h1",{"id":12},"uploaded-files",[14,15,16],"p",{},"A file from your computer — a CSV export, an Excel workbook, a Parquet or JSON file — is\nuploaded in the flow editor and becomes the source of a flow at once. Tabularia reads the\nCSV's separator, encoding and decimal mark from the file itself, lets you pick the sheets\nof a workbook, and converts everything to Parquet. To share the data with other people\nand flows, publish it as a datasource from that flow.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,36],"table",{},[26,27,28],"thead",{},[29,30,31,34],"tr",{},[32,33],"th",{},[32,35],{},[37,38,39,53,92,104,112,120],"tbody",{},[29,40,41,45],{},[42,43,44],"td",{},"Where",[42,46,47,48,52],{},"Flow editor, toolbar: ",[49,50,51],"strong",{},"Upload file",". The file fills the selected Source node (or the first one).",[29,54,55,58],{},[42,56,57],{},"Formats",[42,59,60,64,65,68,69,72,73,76,77,64,80,72,83,64,86,72,89],{},[61,62,63],"code",{},".csv"," ",[61,66,67],{},".txt"," (CSV), ",[61,70,71],{},".tsv",", ",[61,74,75],{},".json"," (an array of objects), ",[61,78,79],{},".ndjson",[61,81,82],{},".jsonl",[61,84,85],{},".xlsx",[61,87,88],{},".xls",[61,90,91],{},".parquet",[29,93,94,97],{},[42,95,96],{},"Size",[42,98,99,100,103],{},"Up to ",[61,101,102],{},"UPLOAD__MAX_BYTES"," (1 GiB by default). Up to 50 MB the file is ready when the upload ends; above, it is converted in the background.",[29,105,106,109],{},[42,107,108],{},"Permissions",[42,110,111],{},"EDIT on at least one folder to upload. A fresh upload is readable only by you.",[29,113,114,117],{},[42,115,116],{},"Refresh",[42,118,119],{},"None: a file is a fixed copy. Upload the new version to replace it.",[29,121,122,125],{},[42,123,124],{},"In the catalog",[42,126,127,128,131],{},"Through a flow: an Output node «Tabularia Datasource», or ",[49,129,130],{},"Run → Publish the output as a datasource",".",[14,133,134,135,140,141,145,146,150],{},"For files that arrive by themselves every day, read them where they land instead: an\n",[136,137,139],"a",{"href":138},"\u002Fdocs\u002Fsftp","SFTP folder",", an ",[136,142,144],{"href":143},"\u002Fdocs\u002Fs3-datasource","S3 folder"," or\n",[136,147,149],{"href":148},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint"," are datasources that refresh on a schedule.",[18,152,154],{"id":153},"how-it-works","How it works",[14,156,157,158,161,162,165],{},"The upload streams to the engine; nothing is held in memory whole. The original file is\nkept in the installation's object storage (",[61,159,160],{},"raw\u002F","), and a Parquet copy (",[61,163,164],{},"datasets\u002F",") is\nwhat flows, previews and the Viewer read. Files up to 50 MB are converted while you wait\nand the source shows its rows when the upload ends; larger ones go to a worker and the\nstatus bar says «Converting (task …)» until they are ready.",[167,168,170],"h3",{"id":169},"csv-what-is-read-from-the-file","CSV: what is read from the file",[14,172,173],{},"The editor sends the file alone, so a CSV is read the way it was written:",[175,176,177,184,204,232,238],"ul",{},[178,179,180,183],"li",{},[49,181,182],{},"Encoding",": UTF-8 when the whole file is valid UTF-8, otherwise Windows-1252 (the\nencoding of Excel's CSV export in Western European languages). Either way the data is\nstored as UTF-8: «Città» stays «Città».",[178,185,186,189,190,64,193,196,197,200,201,203],{},[49,187,188],{},"Separator",": among ",[61,191,192],{},";",[61,194,195],{},","," tab and ",[61,198,199],{},"|",", the one that splits the first 50 lines into\nthe same number of columns, outside quotes; ",[61,202,195],{}," when none does.",[178,205,206,209,210,212,213,216,217,219,220,223,224,227,228,231],{},[49,207,208],{},"Decimal comma",": with a separator other than ",[61,211,195],{},", numbers written ",[61,214,215],{},"16,125"," are read\nas decimals. With ",[61,218,192],{}," — the separator Excel uses where the comma is the decimal mark —\na value such as ",[61,221,222],{},"1.234,50"," is read as 1234.5 and ",[61,225,226],{},"1.500"," as 1500. A column becomes\nnumeric only when every value in it is such a number; one that is not (a code such as\n",[61,229,230],{},"00144",", a note) keeps the column as text.",[178,233,234,237],{},[49,235,236],{},"Header",": the first row. Spaces around column names are removed.",[178,239,240,243,244,247],{},[49,241,242],{},"Types",": guessed from the first 10,000 rows; if a later row does not fit (whole\nnumbers for 20,000 rows, then a decimal), the types are guessed again on the whole\nfile. ISO dates (",[61,245,246],{},"2026-03-31",") become dates.",[14,249,250,252],{},[61,251,71],{}," files are always tab-separated. A file that cannot be read as CSV is refused with\nthe reader's message: «The file could not be read as CSV: …».",[167,254,256],{"id":255},"excel-the-sheets","Excel: the sheets",[14,258,259,260,262,263,265,266,269,270,273,274,277],{},"An ",[61,261,85],{}," or ",[61,264,88],{}," workbook is read from its ",[49,267,268],{},"first visible sheet",": a hidden first\nsheet of lookups or settings is skipped. When the workbook has more than one sheet, the\ndialog ",[49,271,272],{},"Sheets to import"," lists them all, the hidden ones marked, and every sheet you\ntick becomes a source of its own on the canvas, read from the same file. ",[49,275,276],{},"Keep «…»\nonly"," leaves the one already read.",[14,279,280],{},"Excel files are read whole in memory (as JSON arrays are); CSV, NDJSON and Parquet are\nconverted in streaming.",[167,282,284],{"id":283},"parquet-json-ndjson","Parquet, JSON, NDJSON",[14,286,287,288,290],{},"A Parquet file is copied as it is, with its types. NDJSON (one JSON object per line) is\nconverted in streaming. A ",[61,289,75],{}," file must be an array of objects, one per row; nested\nobjects stay nested.",[18,292,294],{"id":293},"example-a-price-list-from-the-sales-office","Example: a price list from the sales office",[14,296,297,298,301,302,305,306,309,310,313],{},"The sales office keeps the price list of the cured meats in an Excel workbook,\n",[61,299,300],{},"listino_2026.xlsx",", with two sheets: ",[61,303,304],{},"Listino"," (the prices) and ",[61,307,308],{},"Note"," (hidden). They\nalso export the March orders of one depot from their ERP as ",[61,311,312],{},"ordini_modena_marzo.csv",",\nwritten by an Italian Excel:",[315,316,322],"pre",{"className":317,"code":319,"language":320,"meta":321},[318],"language-text","numero;data_ordine;canale;deposito;importo\nORD-004101;2026-03-02;HoReCa;Modena;1.234,50\nORD-004102;2026-03-02;GDO;Modena;18.760,00\nORD-004103;2026-03-03;Gastronomia;Modena;412,80\n","text","",[61,323,319],{"__ignoreMap":321},[325,326,327,338,381,400,417],"ol",{},[178,328,329,330,333,334,337],{},"In Explore, open the folder ",[61,331,332],{},"Sales office",", choose ",[49,335,336],{},"New → New flow"," and an engine.",[178,339,340,341,343,344,346,347,350,351,353,354,357,362,364],{},"In the toolbar, ",[49,342,51],{}," and pick ",[61,345,312],{},". The source shows\nthree rows and five columns; ",[61,348,349],{},"importo"," is a number (1234.5, 18760, 412.8), not text,\nbecause the separator ",[61,352,192],{}," and the decimal comma were read from the file.",[355,356],"br",{},[358,359],"img",{"alt":360,"src":361},"The uploaded CSV as the source of a new flow: three rows, importo read as a decimal number","\u002Fmedia\u002Fguide\u002Fsources\u002Fupload-csv-italian.png",[355,363],{},[365,366,367,369,370,373,374,376,377,380],"em",{},[61,368,312],{}," right after the upload: ",[61,371,372],{},"data_ordine"," is a date, ",[61,375,349],{}," a number (",[61,378,379],{},"Float64","), read from an Italian-style file.",[178,382,383,384,387,388,390,391,393,394,396,397,399],{},"Add a second source (",[49,385,386],{},"Source",") and, with it selected, upload ",[61,389,300],{},".\n",[61,392,304],{}," is read; the dialog ",[49,395,272],{}," shows ",[61,398,308],{}," as hidden. Leave it.",[178,401,402,403,406,407,410,411,414,415,131],{},"Build the flow: filter, join, compute. Then add an ",[49,404,405],{},"Output"," node, destination\n",[49,408,409],{},"Tabularia Datasource",", name ",[61,412,413],{},"ordini_modena_2026_03",", folder ",[61,416,332],{},[178,418,419,420,423,424,426],{},"Save the flow (Ctrl+S) and ",[49,421,422],{},"Run",". When the run ends, ",[61,425,413],{}," is in\nthe catalog: other flows, saved views, SQL scripts and the AI assistant can read it.",[14,428,429,430,433,434,131],{},"Next month, upload the April file into the same source and run again: with ",[49,431,432],{},"Overwrite\nif it already exists"," ticked on the Output node, the datasource keeps its id and name\nand its readers keep working. See ",[136,435,437],{"href":436},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Flow and SQL script results",[18,439,108],{"id":440},"permissions",[23,442,443,453],{},[26,444,445],{},[29,446,447,450],{},[32,448,449],{},"To",[32,451,452],{},"You need",[37,454,455,463,475],{},[29,456,457,460],{},[42,458,459],{},"Upload a file",[42,461,462],{},"EDIT on at least one folder (an account that can only view has nowhere to put it)",[29,464,465,468],{},[42,466,467],{},"Read an uploaded file",[42,469,470,471,474],{},"Being the person who uploaded it; once a ",[49,472,473],{},"saved"," flow references it, VIEW on that flow's folder",[29,476,477,480],{},[42,478,479],{},"Publish it as a datasource",[42,481,482],{},"RUN on the flow's folder and EDIT on the datasource's folder",[14,484,485],{},"Sharing a flow shares the files its sources reference: whoever can open the flow can\nread them.",[18,487,489],{"id":488},"limits-and-good-to-know","Limits and good to know",[175,491,492,500,510,516,541,562],{},[178,493,494,496,497,499],{},[49,495,96],{},": ",[61,498,102],{}," (1 GiB by default, 0 = no ceiling), also in\nAdministration → Settings as «Largest file uploaded». The gateway refuses a larger\nfile before it reaches the engine. The file is spooled on the engine's disk and\nconverted there, so keep the engine's temporary space above that size.",[178,501,502,505,506,509],{},[49,503,504],{},"Conversion time",": a background conversion is bounded by ",[61,507,508],{},"CELERY__TASK_TIME_LIMIT","\n(one hour by default), and the editor waits for it up to an hour.",[178,511,512,515],{},[49,513,514],{},"Memory",": Excel and JSON arrays are read whole; a very large workbook needs a worker\nwith the memory for it. Prefer CSV or Parquet for large tables.",[178,517,518,521,522,72,526,529,530,72,533,72,536,540],{},[49,519,520],{},"No refresh",": an uploaded file never changes. Data that is updated elsewhere belongs\nin a datasource that reads it there (",[136,523,525],{"href":524},"\u002Fdocs\u002Fsources\u002Fdatabases","databases",[136,527,528],{"href":138},"SFTP",",\n",[136,531,532],{"href":143},"S3",[136,534,535],{"href":148},"SharePoint",[136,537,539],{"href":538},"\u002Fdocs\u002Fapi-datasource","APIs",").",[178,542,543,496,546,549,550,553,554,556,557,559,560,131],{},[49,544,545],{},"Not offered by the file picker",[61,547,548],{},".xlsm"," and ",[61,551,552],{},".pq",". Save the workbook as ",[61,555,85],{},", or\nrename the Parquet file to ",[61,558,91],{},". The SFTP, S3 and SharePoint datasources do read\n",[61,561,548],{},[178,563,564],{},"The CSV options (separator, encoding, header) are not asked for: they are read from the\nfile. A file without a header row is read with its first row as the header.",[18,566,568],{"id":567},"related","Related",[175,570,571,578,583,590],{},[178,572,573,577],{},[136,574,576],{"href":575},"\u002Fdocs\u002Fsources","All sources",": snapshots, refreshes, descriptions and permissions common to every datasource.",[178,579,580,582],{},[136,581,437],{"href":436},": publishing what a flow computes.",[178,584,585,589],{},[136,586,588],{"href":587},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",": sources, operations and Output nodes.",[178,591,592,496,596,598],{},[136,593,595],{"href":594},"\u002Fdocs\u002Fconfiguration","Configuration",[61,597,102],{}," and the worker limits.",{"title":321,"searchDepth":600,"depth":601,"links":602},2,3,[603,604,609,610,611,612],{"id":20,"depth":600,"text":21},{"id":153,"depth":600,"text":154,"children":605},[606,607,608],{"id":169,"depth":601,"text":170},{"id":255,"depth":601,"text":256},{"id":283,"depth":601,"text":284},{"id":293,"depth":600,"text":294},{"id":440,"depth":600,"text":108},{"id":488,"depth":600,"text":489},{"id":567,"depth":600,"text":568},"md",{"source":615},"docs\u002Fsources\u002Ffiles.md",true,"\u002Fdocs\u002Fsources\u002Ffiles",{"title":5,"description":16},"docs\u002Fsources\u002Ffiles","DPYAFns2NFxP1qEz98CJFb9Kz4gA1PBYi9gSn-76r6Q",[622,641,695,716,747,776,801,826],{"title":623,"icon":624,"intro":625,"items":626},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[627,629,632,635,638],{"path":628,"title":623},"\u002Fdocs\u002Fgetting-started",{"path":630,"title":631},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":633,"title":634},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":636,"title":637},"\u002Fdocs\u002Fconcepts","Concepts",{"path":639,"title":640},"\u002Fdocs\u002Foverview","Overview (README)",{"title":642,"icon":643,"intro":644,"items":645},"Capabilities","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.",[646,649,650,653,656,659,662,665,668,671,674,677,680,683,686,689,692],{"path":647,"title":648},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":587,"title":588},{"path":651,"title":652},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":654,"title":655},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":657,"title":658},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":660,"title":661},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":663,"title":664},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":666,"title":667},"\u002Fdocs\u002Fscripting","Python and R",{"path":669,"title":670},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":672,"title":673},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":675,"title":676},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":678,"title":679},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":681,"title":682},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":684,"title":685},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":687,"title":688},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":690,"title":691},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":693,"title":694},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":696,"icon":697,"intro":698,"items":699},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[700,701,702,704,706,708,710,711,714],{"path":575,"title":576},{"path":617,"title":5},{"path":524,"title":703},"Database tables and queries",{"path":143,"title":705},"S3 buckets",{"path":138,"title":707},"SFTP folders",{"path":538,"title":709},"HTTP APIs",{"path":148,"title":149},{"path":712,"title":713},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":436,"title":715},"Results of flows and scripts",{"title":717,"icon":718,"intro":719,"items":720},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[721,724,727,730,733,735,736,737,738,741,744],{"path":722,"title":723},"\u002Fdocs\u002Fconnections","All connections",{"path":725,"title":726},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":728,"title":729},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":731,"title":732},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":138,"title":734},"SFTP servers",{"path":538,"title":709},{"path":148,"title":535},{"path":712,"title":713},{"path":739,"title":740},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":742,"title":743},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":745,"title":746},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":748,"icon":749,"intro":750,"items":751},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[752,755,758,761,764,767,770,773],{"path":753,"title":754},"\u002Fdocs\u002Fintegrations","All integrations",{"path":756,"title":757},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":759,"title":760},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":762,"title":763},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":765,"title":766},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":768,"title":769},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":771,"title":772},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":774,"title":775},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":777,"icon":778,"intro":779,"items":780},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[781,784,786,789,792,795,798],{"path":782,"title":783},"\u002Fdocs\u002Fgovernance","Overview",{"path":785,"title":108},"\u002Fdocs\u002Fgovernance\u002Fpermissions",{"path":787,"title":788},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":790,"title":791},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":793,"title":794},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":796,"title":797},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":799,"title":800},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":802,"icon":803,"intro":804,"items":805},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[806,809,812,815,818,820,823],{"path":807,"title":808},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":810,"title":811},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":813,"title":814},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":816,"title":817},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":594,"title":819},"Configuration reference",{"path":821,"title":822},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":824,"title":825},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":827,"icon":828,"intro":829,"items":830},"Reference","reference","Release process and the remaining reference pages.",[831],{"path":832,"title":833},"\u002Fdocs\u002Frelease-process","Release process",1793656371794]