Privacy-first tool that turns a folder of files into one LLM-ready bundle. The product is the browser tool at fileconcat.com; the @fileconcat/cli npm CLI shares its core for local folders but reads fewer formats and is not kept in step. Your files are never uploaded on either.
Drop a folder, paste a public GitHub / GitLab / Bitbucket URL, or pick a recent source. The file tree updates live as you tune include / ignore globs; the token counter tracks running cost against any of 200+ LLM models. Copy or download the bundle as XML or Markdown.
Open at fileconcat.com.
npm install -g @fileconcat/cli
# or one-off:
pnpm dlx @fileconcat/cli ./your-folderAfter install the bin is file-concat. Node 18 or newer.
file-concat ./service # output.xml
file-concat ./service --style markdown -o ctx.md
file-concat ./service --expand-archives -o ctx.xml # unpack zip/tar/gz too
file-concat ./service --stdout | claude -p # pipe straight to a model
file-concat ./service --json # one-line summary on stdoutFull flag reference: packages/cli/README.md and the CLI docs.
Project tree at the top so the model sees the structure before any file body. Then every file in its own <file path="..." language="..."> block (or a fenced Markdown block under --style markdown). Binary files, lock files, and build output are dropped by default; the rest is shaped by include / ignore globs.
PDF, DOCX, XLSX, PPTX, ODT, ODS, ODP, RTF and EPUB are extracted to plain text by default (--no-parse turns it off in the CLI); the web app also reads Word, Excel and PowerPoint 97-2003 (DOC, XLS, PPT), XLSB and XLSM workbooks, Kindle books (MOBI, AZW3), Outlook messages (MSG), pages saved from a browser, scanned PDF pages (by text recognition), 7Z, RAR, BZ2 and XZ archives, and a video's own subtitle track, and it transcribes audio and video on request. Jupyter notebooks, .srt / .vtt caption tracks and saved .eml messages go the same way — a notebook arrives as markdown instead of JSON around base64 plots, a caption track as the transcript instead of a timestamp every two seconds, a message as the correspondence instead of MIME boundaries and base64 attachments. Which files qualify is decided by their leading bytes, not their name, so a renamed or extensionless document still gets read. Failed parses count as skipped and the run continues.
pnpm workspace + Nx (pnpm-workspace.yaml, nx.json). Three members:
| Path | Name | Role |
|---|---|---|
apps/web |
@fileconcat/web |
TanStack Start app deployed to Cloudflare Workers |
packages/cli |
@fileconcat/cli |
Commander CLI, published to npm, built with tsup |
packages/core |
@fileconcat/core |
Shared engine: file processing, path utils, source adapters, models |
@fileconcat/core is consumed via workspace:* and linked at source so neither the web app nor the CLI needs a build step to pick it up in dev.
pnpm install # bootstrap the workspace
pnpm dev # TanStack dev server (apps/web)
pnpm build # web production build
pnpm build:all # build every package
pnpm check # tsc --noEmit per package
pnpm lint # eslint .
pnpm format # prettier --write .Core has its own Vitest suite:
cd packages/core && pnpm vitest runThe CLI runs from source via tsx:
cd packages/cli && pnpm dev -- ./your-folderLong-form docs at fileconcat.com/docs. Topics: getting started, the four-layer filter pipeline, GitHub / GitLab / Bitbucket import, token estimation and costs, configuration, and the CLI reference.
The docs describe the browser tool. The CLI shares its filter pipeline; the published CLI may lag behind it.
MIT.
