runs in your browser · nothing uploaded

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.

Code, docs, configs & dataPDFs & Office docs read as textImages & binaries skipped for you

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.

fileconcat-output.txt
≈ 412 tokens
# 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

CodeDocsConfigsData

Skipped for you

Imagesnode_modules*.lockBuild output
Archives unpack themselvesPDFs & Office docs get readRepos & Gists import by URLSingle web pages too

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

Network4 requests · 1 document
  • GET/200document
  • GETapp.js200script
  • GETstyles.css200stylesheet
  • GETtiktoken.wasm200wasm
  • you drop 40 filesnothing sent
Separate tool · command line

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 | llm without parsing noise.

  • Parse

    Add --parse and it pulls plain text out of PDFs, Word, Excel, and slides.

  • Json

    --json prints 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.

zsh
$ npm install -g @fileconcat/cli
$ file-concat ./your-folder
→ wrote bundle to stdout · 412 tokens

Drop a folder. Get one file.

Read the docs