---
title: Files and repositories
description: What is on the machine before the agent starts.
---

Two kinds, and both really happen. There is no third state where something is
listed as attached but nothing is put anywhere.

## A repository

Press **Add repository** on the Files page and give it a git URL. Before the
agent's first token it is cloned into the workspace — `--depth 1`, because an
experiment cares about the tree rather than the history — into a directory named
after it.

The Files table spells out exactly what the agent will find:
`billing-api/ — cloned from github.com/you/billing-api`. You can override the
directory name when you add it; by default it is the repository's own.

> **Public repositories only**
>
> Nothing here holds git credentials, so a private clone would fail on the
> machine. If the run needs private code, attach it as an upload instead, or
> give the agent a credential of its own through an MCP server.

## An uploaded file

Press **Upload a file**, or drop one onto the dialog. A CSV, a config, a PDF, a
fixture, a zip — anything the task needs to read. Up to 100 MB per file by
default.

It is written into the machine's working directory under its own name (cleaned
of anything that could climb out of that directory), so a task can say "read
`orders.csv`" and the agent will find it. The bytes travel in exactly as they
left: a PDF or a zip arrives byte-identical.

You can open what was uploaded again from the table, and the file's size is the
real one.

## Where files attach

| Attach to | When |
|---|---|
| A **task** | The file is part of what the task means — "fix the bug in this repository". Pick it in the task dialog. |
| An **experiment** | The file belongs to this particular launch. Pick it in the builder's *Files* row. |

A run gets both sets, merged and de-duplicated: the same repository picked in
both places is one clone, not two.

## For your own agent

An agent connected with `redline dev` runs on your computer, and these files are
not on it. They are placed on the run's container, which your agent reaches with
the `machine_run` tool:

```ts
machine_run({ command: "head -20 orders.csv" })
```

The builder says so inline when you have both a file and one of your own agents
selected. See [Machines](/build/machines).

## Limits

The 100 MB ceiling is about memory rather than disk: every byte is read, encoded
and pushed into the container in one go, so the machine's tens of gigabytes are
not the constraint. The dialog checks the size before the upload starts, so a
file that is too large is refused immediately rather than after the wait.
