View Categories

Turn a Folder of JSON Files Into SQL Tables

Folder connector · JSONL Folder

Turn a folder of JSON lines files into SQL tables you can query anywhere

Point the Query Streams Agent at the folder. It reads the files on its own computer, builds the tables in a local cache there and keeps them current as files arrive, change or disappear. You query them from Excel, Google Sheets, Nova, Claude or the REST API. Nothing is uploaded and no file is converted or edited.

About 15 minutes No coding needed Files stay on your network The Free plan covers it
Stuck at any point? Just ask us. Open Support in Query Streams (top-right menu → Support) and send us a message. Real people read it, and “I don’t know what this screen is asking for” is a perfectly good question.

What you’ll end up with

JSONL Folder iconYou end up with one SQL table, named by you, that holds every line of every JSONL file in the folder. If you call it events, you query fileset.events. Nested objects are flattened into columns down to the depth you choose, deeper values are kept as JSON text, and every row carries _source_file so you know which file it came from. If the folder mixes files of different shapes, you can have one table per shape instead. The Agent reads the folder on its own computer and caches the rows there in an encrypted local store, then serves them as SQL to Excel, Google Sheets, the Query Builder or any other client. The files stay on your network.

Every table sits in one schema named fileset. With One pinned layout, the default, you get one table named by the Table name you type, for example fileset.events, holding the rows of every matched file. Nested objects become columns down to Flatten depth, 2 by default, and anything deeper lands as JSON text. Every row carries _source_file and a stable _row_id.

With One table per layout, each distinct shape becomes its own table, up to 25, named after the shared part of its file names with trailing numbers trimmed. Files orders_2026_01.jsonl to orders_2026_03.jsonl become fileset.orders. If nothing usable remains, the Table name is used. Names never change while the layout is pinned, and there is no automatic view that stacks the layouts together.

Every folder connector also gives you the bookkeeping tables files, files_events, directories, directory_snapshots and volumes.

WHERE THE FILES LIVEa computer or file share the Agent can openYour folderof filesfiles stay where they areQuery Streams Agentscans the folder, builds tablesin a local cache, runs the SQLSELECT only, enforced hereQuery Streamsone outbound linkchecks who may see what · logs every queryWHERE YOU USE ITany computer, any browserExcel · Google Sheets · NovaClaude · REST API · Automationssee the rows, never the files
The Agent reads the folder on its own computer, keeps the rows in an encrypted local cache there and runs every query against that cache. Only the rows a query returns travel out, over one outbound connection. No port to open, no VPN, no upload.

Where it earns its keep:

What you’ll need

A Query Streams account

Folder connectors are on every plan, including Free. Free is a plan you keep, not a trial that expires. There is no cap on how many files a folder may hold.

The Agent, 2.6.0 or later

Installed on a computer that can open the folder: the file server itself, an office computer, or the machine the files land on. An older Agent shows the folder cards greyed out with an Agent 2.6.0+ badge. Windows, Mac or Linux.

The folder’s path, as the Agent sees it

A local path, or a network share written as \\server\share\folder. The Agent runs as a service, so it cannot see drives you mapped at your login (Z: and friends). On Windows it can sign in to a share with a login you store; on Linux or a Mac, mount the share first (Linux under /mnt or /media, a Mac under /Volumes).

Where does the work happen? On the computer that runs the Agent. It scans the folder, copies the rows into an encrypted local cache there (one schema, named fileset) and runs every query against that cache. Your files are read, never modified, moved or uploaded.

Set it up in five steps

  1. Install the Agent on a computer that can open the folder

    Sign in, open Download, and install the Agent for your system on the computer that can open a folder of JSON lines files: the file server, or any always-on computer that can reach the share. It takes a minute and starts on its own from then on. You need version 2.6.0 or later; the Download page always has the current one.

    Why a small program instead of a driver? The Agent is one install for Windows, Mac or Linux (about 85 MB on Windows, a little over 100 MB on Mac and Linux). It opens one outbound encrypted connection to Query Streams and that is the only network path it needs: no inbound port to open, no VPN. It reads the folder where it sits, so the files stay put and only the rows a query returns travel across the internet to the add-in, browser or AI client on your side.

    The Download page shows Your Access Key. Paste it into the Agent when it asks, and wait for the badge to read Connected to Query Streams. That is the only thing you do on the Agent’s computer; everything else happens in your browser.

    Full walkthroughs if you want them: Windows, Mac, Linux.

  2. Point it at a folder of JSON lines files

    Back in your browser open Data → Data Agents, find the Agent you just installed and click its Add connector button. Open the Files & Folders pill and pick the JSONL Folder card. Not sure which card fits? Pick Files in a folder instead: the Agent samples the folder, names what it holds on a “What we found” page and opens the right card for you, pre-filled.

    The wizard runs Folders → Check → Settings → Realm → Review. On Folders:

    Root folders
    One path per line, as the Agent’s computer sees it. Each folder shows a status (reachable, denied, missing, unreachable, credentials invalid or not mounted) as soon as you add it. On a Windows Agent a share that needs a login gets one from the folder’s Credential column, stored once per server; on Linux or a Mac, mount the share first.
    Scan subfolders, Max depth
    On, and 8 levels, by default.
    Include patterns, Exclude patterns
    Which files count. The include pattern starts with the right glob for this card. One connector reads one file type: a folder with CSV and Parquet files is two connectors on the same folder, one per type.
    Follow symlinks and junctions
    Off by default. The Agent does not follow shortcuts or cloud placeholders unless you turn this on.

    Install the Query Streams Agent on a computer that can open the folder. It needs Agent 2.6.0 or later. From that Agent’s Add connector button, open Files & Folders and pick the JSONL Folder card.

    • Root folders: the folders on the Agent computer to scan, one per line. Type network shares as \\server\share\folder, not a mapped drive letter.
    • Include patterns starts as **/*.jsonl. Add a pattern if your files use another extension.
    • Table name is required. Type a name such as events.
    • Flatten depth: how many levels of nested objects become columns. Default 2, range 1 to 8. Deeper values land as JSON text.
    • Table layout: leave One pinned layout (default) when all files share one layout, as with recurring exports. Choose One table per layout for folders people assemble by hand, where each distinct layout gets its own table, up to 25.
  3. Check what it will build

    On Check the Agent reads a sample of up to 64 files and shows what it will build. Nothing is created yet. The button reads Test connection until a verdict exists, then Next; Test again re-runs the sample after you change something. You will see one of four headlines:

    Ready to create
    Every sampled file fits. The chips under it say how many folders were reachable, how many files and rows, and which tables will exist.
    Ready, with notes
    Some files will be set aside, or the layout sniff refused. An amber banner says exactly which: “{n} of {m} file(s) will be set aside” with a Show which files and why list, and “You can create it anyway — the connector will keep re-checking and reports the reason on its Manifest tab.”
    Needs attention
    The Agent is offline or a folder is missing. Fix that before going on; with the Agent offline the page says so and still lets you continue.

    “This folder holds {n} different file layouts.” A sky-blue panel means the sampled files do not all share one set of columns. Table layout defaults to One pinned layout, which expects every file to match. Click Switch to one table per layout and each layout becomes its own table instead (up to 25).

    A refusal or set-aside files never block you: click Next, finish the wizard and fix the odd files later. Only an offline Agent or a missing folder stops the wizard.

    On Check, the Agent reads a sample of up to 64 files and shows the file count, size, row estimate and the table it will build. Nothing is created yet. The thing this source most often reports is mixed shapes. If the sample holds several layouts while Table layout is still pinned, a blue panel says “This folder holds 3 different file layouts” and explains that one pinned layout expects every file to share one layout. Click Switch to one table per layout and each shape becomes its own table. Files the Agent could not read as JSONL appear under Show which files and why as set aside, and the rest still load. You can create the connector either way; it keeps re-checking and reports the reason on its Manifest tab.

  4. Choose how often it scans, then create it

    The defaults on Settings suit a folder that receives a few files a day. Four you may want to change:

    Scan interval
    Every hour by default; choose from every 5 minutes to daily. Each sweep compares size and modified time to find new, changed and vanished files.
    Watch folder for changes (near real-time)
    Off by default. On, the Agent reacts within seconds on local disks; on network shares it is best-effort and the scheduled scan remains the guarantee. Quiet period (15 seconds) waits for a file to finish being written.
    Refresh before answering a query
    Off by default. On, a query first re-scans when the last scan is older than the Staleness window (60 seconds), waiting at most the Query wait limit (5 seconds). It applies to people and add-ins, not to alert polling.
    When a file vanishes
    Drop its rows by default, or Keep rows, mark deleted (tombstone). The Vanish guard ratio (0.5) refuses a scan that loses more than half the files at once and keeps the previous inventory, which is what an offline share looks like.

    Then pick the Data Realm the rows count against, check Review and click Create connector. The first scan starts right away. The connector’s Manifest tab shows what it built and any file it set aside.

  5. Look at your tables

    Open the connector: the Manifest tab lists the tables it built. In the Query Builder the same tables sit under the fileset schema. Three queries that work on day one:

    Rows per JSONL file
    SELECT _source_file, COUNT(*) AS row_count
    FROM fileset.events
    GROUP BY _source_file
    ORDER BY row_count DESC
    LIMIT 100

    One row per file, so you can see how many lines each JSONL file contributed.

    Files that changed in the last day
    SELECT relative_path, size_bytes, modified_utc
    FROM fileset.files
    WHERE modified_utc >= now() - INTERVAL 1 DAY
    ORDER BY modified_utc DESC
    LIMIT 100

    The files the Agent saw change since yesterday, newest first.

    Files set aside or refused, and why
    SELECT relative_path, event_type, detected_by, detail, event_at
    FROM fileset.files_events
    WHERE event_type IN ('refused', 'drift')
    ORDER BY event_at DESC
    LIMIT 20

    Every file whose lines were left out, with the reason in detail, including a file with a new shape.

    Every folder connector also serves the same bookkeeping tables, all in the fileset schema:

    TableWhat it holds
    filesEvery file currently in the folder: path, name, extension, size, created and modified times, first and last seen. A view over files_current, which also keeps files that have vanished.
    files_eventsThe change history: one row per file that appeared, was modified, vanished, was set aside (drift) or was refused, with the time in event_at, how it was noticed in detected_by and the reason in detail.
    directories, directory_snapshots, volumesFolder counts and sizes, how they grew, and the disks or shares the roots live on.
    _source_file, _row_idTwo columns on every data row: which file the row came from, and a stable row id inside that file. Group by _source_file to compare files.

That’s it. Drop a new file in the folder and, after the next scan, it is in the table. The files never left the computer they were on.

Reaching a file on a network share

The Agent opens files as a background service, not as you, so a file on another computer needs one extra step. Which step depends on the computer the Agent runs on.

Windows

Type the network path, like \\server\share\folder, never a mapped drive letter such as S:, which the Agent cannot see. If the share only lets in named people, click Service identity (the chip under the path, or a folder’s Credential column) and store a login for that server: a company domain account, or an account made on the server itself with Domain left blank. The Agent then signs in to that server and reads the file there, and every connector on that Agent that reads the same server must use the same login. Without a login, it reads as its own service account, which a company domain sees as the computer itself. Step by step on Windows

Linux

Share logins stored in the Portal are not used on Linux: an administrator mounts the share on the Agent’s computer first, in a folder under /mnt or /media, because the Agent’s service cannot see /home or /run/user. In the connector, keep the \\server\share path, which the Agent maps onto the mount, or type the mount path instead, such as /mnt/fileserver-shared/Accounts. How to mount a share on Linux

Mac

Share logins stored in the Portal are not used on a Mac: mount the share first from Terminal with sudo, in a folder under /Volumes, so the Agent’s background service can see it. In the connector, keep the \\server\share path, which the Agent maps onto the mount, or type the mount path instead, such as /Volumes/fileserver-shared/Accounts. How to mount a share on a Mac

If the test cannot get to the share, look for these words in its result: unreachable means the Agent’s computer got no answer from the server. On Linux or a Mac, not mounted means the share still has to be mounted, and that message includes the exact mount command for your server.

Folders on a share? On Windows, one login covers every folder you add from the same server. Watch folder for changes works on a share too, on a best-effort basis; the scheduled scan is what guarantees every change is picked up.

When a folder is not reachable

Every folder on the Folders step shows a status as soon as you add it. Hover the status to read the Agent’s own message; its first words say which case it is.

Status or messageWhat it meansWhat to do
deniedThe share did not let the Agent in. With no login stored, a Windows Agent reads as its service account, which a company domain sees as the computer itself.Windows: click Service identity in the folder’s Credential column and store a login that can read the share, or ask whoever runs the server to give the stored one read access. Linux or Mac: the share is mounted, but its permissions keep the Agent out; check how it is mounted (Linux, Mac).
credentials invalid, or The stored credentials for \\server were refusedThe server rejected the stored login: a typo, the wrong domain or a changed password. The Agent waits a minute before it tries that login again, so the account is not locked out.Click the account name in the Credential column and type the login again. For an account made on the server itself, leave Domain blank.
missingNo folder at that path. On Windows, a server name that cannot be found, or a share the server does not have, also shows as missing.Check the names, or pick the folder with Add folder from the agent instead of typing it.
unreachable, or \\server did not answerNo answer from the server: it is off, the name is wrong, or a firewall blocks file sharing.Open the same \\server\share path on the Agent’s computer. If that fails too, it is a network problem.
not mounted (Linux or Mac)The share is not mounted on the Agent’s computer. Hover the status, or the Not mounted chip in the Credential column, for the exact mount command.Mount the share (Linux, Mac), then test the folder again.
Another connector on this agent already signs in to \\server as …Windows allows one account per file server on each computer, and another connector on this Agent uses a different one.Use the same login as that connector, or change it on every connector that reads this server.
Windows already holds a sign-in to \\server for …Something else on the Agent’s computer is signed in to that server with another account, and the Agent never closes a sign-in it did not make.Follow the message: it names the Windows account the Agent runs as and says whether Use service identity would read the share through the existing sign-in.
This agent build cannot sign in to \\server with stored credentials.An older Agent that cannot use a stored share login.Update the Agent, then test again.

Use it everywhere

The connector is a data source like any other in Query Streams. Save a query once in the Query Builder (the dialect is DuckDB) and use it from:

Excel

The add-in’s Stream a Query drops the rows into a sheet and re-runs on a click. Running SQL in Excel.

Google Sheets

The Query Streamer add-on fills a tab you pick. Power Query for Google Sheets.

Claude, Cursor and other AI clients

Through the Query Streams MCP server; Claude knows the folder model, including _source_file and files_events. JSONL Folder with Claude via MCP.

REST API

Any saved query becomes a read-only endpoint with its own key, on every plan. JSONL Folder REST API.

Nova

Ask in plain English on the Business plan; Nova knows every folder table and column from its built-in descriptions.

Automations

Sync the rows to Airtable, Smartsheet, Baserow, SeaTable or a sheet on a schedule. Automation guides.

Folder tables join to your other connectors too: a federated query can match _source_file names or order ids in a folder of JSON lines files against a database on the same Agent.

How new, changed and deleted files show up

New and changed files

On every Scan interval (or within seconds with Watch folder on) a new file that fits the layout has its rows added and gets an appeared event. A changed file is re-read in one transaction: its old rows go, its new rows come, and it gets a modified event.

Deleted files

A file that vanishes drops its rows by default, or keeps them marked deleted if you chose the tombstone option, and gets a vanished event. If more than half the files disappear at once the scan is refused and the previous inventory stays: an offline share looks exactly like that.

Set-aside files

A file that does not fit the layout, cannot be opened, or is over a cap is set aside whole: none of its rows load, and files_events gets a drift row naming the file and the column. Fix the file and save it; the next scan tries it again.

How fresh is what I see?

Queries answer from the last scan. There is no Rescan or Sync now button; the scan interval, the folder watcher and Refresh before answering a query are the three controls. MAX(last_seen_utc) from files_current tells you when the Agent last looked.

Files that are set aside

Three words appear on the Check step and the Manifest tab. They mean different things:

Set aside (parked)
The file does not match the pinned layout, or is unreadable, torn, locked or over a cap. It is all-or-nothing per file: a parked file contributes zero rows. files_events records a drift row whose detail names the file and the column. The file is skipped while its size and modified time stay the same, and retried as soon as it changes.
Unreadable
The Agent could not open or parse the file as its type: not a real workbook, locked by another program, a cloud placeholder, undecodable bytes. It parks on its own and the rest of the folder continues. Only a folder with zero readable files refuses the whole set.
Refused
The Agent could not pin any layout at all, for example because files disagree on a column type. No data table exists yet. files_events gets a refused row with the reason in detail, and the Agent re-tries on every scan until a layout pins. Fix or exclude the file it names and the message clears.

Where to look: the amber banner on Check (Show which files and why), the connector’s Manifest tab afterwards. In SQL: SELECT relative_path, event_type, detail FROM fileset.files_events WHERE event_type IN ('drift','refused') ORDER BY event_at DESC.

For a folder of JSON lines files that usually looks like this: An export web-03.jsonl whose lines carry a different set of keys from the pinned layout is set aside with none of its lines loaded; files_events gets a drift row with detected_by pin whose detail names the file and, in per-layout mode, reads “new layout — edit the connector’s driver options or manifest overrides (any change to them re-sniffs) to add it as a new table”.

Limits worth knowing

There is no plan limit on folders or on the number of files. The rows do count against your Data Realm like any other connector. Defaults you can raise or lower on the connector:

SettingDefaultWhat it does
Max depth8How many folder levels below each root are scanned (1–64).
Max files per scan100,000Files considered in one sweep.
Max file size to hash32 MiBOnly matters with Hash file contents on.
Event log retention30 daysHow long files_events rows are kept.
Scan parallelism per root2Folders read at once per root.

Content caps, which park a file rather than truncate it: 2,000,000 rows or 512 MiB per file, 10,000,000 rows or 2 GiB per scan. A folder can hold at most 25 distinct layouts in One table per layout mode.

Questions people ask

How are nested JSON objects handled?

They flatten into columns down to the Flatten depth you set, 2 by default and at most 8. Anything deeper stays as JSON text in one column, so no value is lost. Raise the depth if you keep having to pick apart JSON text in your queries. Changing it re-samples the folder and rebuilds the table.

My files have different shapes. Can they still be queried?

Yes. Choose One table per layout and each shape becomes its own table, up to 25. Each table is named after the shared part of its file names. If the Check step finds several shapes while you are still on one pinned layout, it says so and offers Switch to one table per layout. There is no automatic view that stacks the layouts together, but you can UNION them in a query.

What happens when a file with a new shape arrives later?

It is set aside and none of its lines load. In per-layout mode files_events records it with the detail “new layout”. New layouts are not added on their own. Change and save any connector option, such as Flatten depth, and the Agent samples again and adds the new table while keeping the names you already have.

My files end in .json or .ndjson, not .jsonl. Will they be read?

Only files that match Include patterns are read, and the default is **/*.jsonl. Add a pattern such as **/*.ndjson for other extensions. Each file must still hold one JSON object per line. One connector reads one file type, so a folder that also holds CSV files needs a second connector on the same folder.

Is there a limit on file size or row count?

The Agent defaults are 2,000,000 rows and 512 MiB per file, and 10,000,000 rows or 2 GiB per sync. A file over a cap is set aside and reported in files_events. There is no plan limit on the number of folders or files. If you also want Claude to query the table, see Connect a Folder of JSONL Files to Claude with MCP.

Are my files uploaded anywhere?

No. The Agent reads them on its own computer and keeps the rows in an encrypted local cache there. A query runs against that cache and only the rows it returns leave the machine, over one outbound connection. Files are never modified, moved or converted.

Do I need to open a port or run a VPN?

No. The Agent makes one outbound connection on port 443 and both requests and rows travel over it. If outbound HTTPS works, this works.

Can the folder be on a network share, or in OneDrive or Dropbox?

Yes. Type a share as \\server\share\folder, because the Agent runs as a service and cannot see drives mapped at your login. On Windows, store a login for the server if the share lets in only named people; without one the Agent reads as its own service account. On Linux or a Mac, mount the share first. A synced OneDrive or Dropbox folder works when its files are stored on the computer: set the folder to Always keep on this device. The Agent does not download cloud-only files.

The folder has more than one kind of file. One connector or two?

One connector reads one file type. A folder with CSV and Parquet files is two connectors on the same root, one per type. Files that do not match the include pattern are ignored, not set aside.

Is there a Rescan button?

No. The Agent scans on the Scan interval, reacts to changes when Watch folder is on, and can re-scan before answering a query when you turn that on. Edit the connector to change any of the three.

Does the Free plan really cover this?

Yes. Free is a plan you keep, not a trial that expires. Folder connectors have no file cap of their own; the rows count against your Data Realm like any other connector. See what each plan includes on the pricing page.

Other folders Query Streams turns into tablesHow to query a folder of files with SQLAll File Set guides
Still stuck? Open Support in Query Streams and tell us which step you are on and what you see. We will get you connected.

Every guide for JSONL Folder

Not quite your setup?

  • Are these your app's own log files that keep growing? Application Logs reads new lines as they are written and pulls out level, logger and message → App Logs
  • Only need a list of files with sizes, dates and changes? File System does that without reading the files → File System

Setup trouble?

  • Agent says the file or folder does not exist, or access is denied? Mapped drives, network shares, OneDrive and Linux home folders each need one fix → Where the Agent can read files from
  • Agent shows Offline, or Test connection and Browse are greyed out? Check that the Agent is online → Is the Agent online?
Updated on October 12, 2026

Powered by BetterDocs