# What Docup reads

The branch, the files and the limits that decide what the AI is allowed to see in your repository.

The AI never browses your repository freely. It works on a **snapshot**: a set of files that passed a filter, held in memory for the length of a run. This page describes how the snapshot is made.

## The branch

Docup reads the repository's default branch, at the latest commit when a run starts. For a first run the commit is saved with the project; later updates compare from it. Other branches are never read.

## The archive

Docup downloads the repository as one compressed archive, rather than one request per file. Files that are skipped are never buffered in memory.

## The filter

Each file goes through two checks.

### Path and size

A file is skipped when:

- it is inside a skipped folder: `.git`, `node_modules`, `vendor`, `dist`, `build`, `out`, `target`, `.next`, `.vinext`, `.nuxt`, `.svelte-kit`, `.turbo`, `.cache`, `coverage`, `__pycache__`, `.venv`, `venv`, `.idea`, `.vscode`, `Pods`, `.gradle`, `bin` or `obj`;
- it is a lockfile or credential file, such as `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock`, `Cargo.lock`, `go.sum`, `.npmrc`, `.netrc`, `id_rsa` or `secrets.json`;
- it is an environment file (`.env`, `.env.production`, and so on). Files ending in `.example`, `.sample` or `.template` are kept;
- it has a binary extension: images, audio, video, PDFs, archives, fonts, executables, WebAssembly, databases or source maps;
- it has a key or certificate extension: `.pem`, `.key`, `.p12`, `.pfx`, `.keystore`, `.jks`, `.crt`, `.cer` or `.p8`;
- it is minified (`.min.js`, `.min.css`);
- it is empty or larger than 100 KB;
- it matches one of your [ignore paths](/settings/guidance).

### Content

A file that passes is checked once more. It is skipped if its first 8,000 bytes contain a null byte, which means it is binary, or if its text contains a private key header such as `-----BEGIN PRIVATE KEY-----`.

## Limits

A snapshot holds at most 1,500 files and about 12 MB of text. After that, remaining files are counted as skipped. For large repositories, use ignore paths to keep generated code, fixtures and vendored sources out, so the limit is spent on code worth documenting.

## What the AI can do with the snapshot

The planner and writers get three read-only tools over the snapshot:

| Tool | What it does |
| --- | --- |
| `list_files` | Lists paths, optionally under a folder. Up to 300 are returned at once. |
| `grep` | Searches file contents with a case-insensitive regular expression and returns up to 40 matching lines. |
| `read_file` | Reads a file with line numbers, 400 lines at a time. |

They cannot write files, run code, call your services or reach any other repository. A file the filter dropped does not exist for them.

## How you can see it

Every run shows **Files read** and how many files were skipped. If the numbers look wrong, adjust [AI guidance](/settings/guidance) and run again. See [Runs](/guides/runs).
