Combine files into one AI-ready document.
Drop a repo, a folder of PDFs and docs, or an archive. The noise gets stripped and out comes one clean document for ChatGPT, Claude, or Gemini. No setup, no account.
Drag a folder or files here
…and your file is ready a second later.
One file, structured so models read it cleanly.
Files arrive wrapped, tagged, and ordered for parsing. The model gets the tree first, then each file in a labeled block with its language and path. It navigates the bundle the way you navigate the repo.
- Tree
An ASCII map at the top, so the model knows the shape before it reads a single file.
- Tags
Every file wrapped in
<file path>, so references stay unambiguous. - Fences
Language-typed code fences. Highlighting carries through to whatever renders the reply.
# Project Structure
```
└── app/
├── hooks/use-theme.ts
├── components/button.tsx
└── README.md
```
# File Contents
<file path="app/hooks/use-theme.ts">
```typescript
import { useEffect, useState } from "react";
export function useTheme() {
const [theme, setTheme] = useState("light");
return { theme, setTheme };
}
```
</file>Drop the whole thing. The right files get through.
No need to hand-pick. The text gets combined and the noise gets left behind, automatically.
Combined
Skipped for you
Images need a different tool
Images aren't text, so they can't be combined into the document. Reading them takes a vision model, which is a separate job from bundling files.
Nothing leaves your browser.
Drag a folder in and it gets read, filtered, and counted right here on the page. No upload, no server, no account. Open your own network panel and watch: once the page has loaded, dropping files sends nothing.
0 outbound requests · everything runs locally
- GET/200document
- GETapp.js200script
- GETstyles.css200stylesheet
- GETtiktoken.wasm200wasm
- you drop 40 filesnothing sent
Rather work in the terminal?
The browser tool needs no install. The CLI is a separate package for the same engine, for when the files already live in your shell.
- Pipe
Stdout is the bundle, stderr is progress. Pipe it straight into
| llmwithout parsing noise. - Parse
Add
--parseand it pulls plain text out of PDFs, Word, Excel, and slides. - Json
--jsonprints a machine summary, so a wrapper script can read the token count and file list.
This is the command-line tool, not needed for the browser app.
$ npm install -g @fileconcat/cli$ file-concat ./your-folder→ wrote bundle to stdout · 412 tokens