> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/clyrisai/gitresolve/llms.txt
> Use this file to discover all available pages before exploring further.

# Batch Process Portfolios & Resumes with GitResolve

> Use --portfolios, --resumes, or --all to process an entire CSV of portfolio links and a directory of PDF resumes in a single GitResolve command.

Batch mode lets you resolve an entire hiring pipeline at once. Point GitResolve at a CSV of portfolio links and a folder of PDF resumes, and it will process every candidate, aggregate results from multiple sources, and either print a summary table or write per-candidate JSON files to disk.

## Batch Flags

| Flag           | Description                                         |
| -------------- | --------------------------------------------------- |
| `--portfolios` | Process portfolio URLs from the CSV file only       |
| `--resumes`    | Process PDF resumes from the resumes directory only |
| `--all`        | Process both the CSV and the resumes directory      |

Running `gitresolve` with no URL argument and none of these flags defaults to `--all`.

```bash theme={null}
# These three commands are equivalent
gitresolve
gitresolve --all
gitresolve --portfolios --resumes
```

## Default Data Paths

| Source            | Default Path                 | Override Flag            | Environment Variable |
| ----------------- | ---------------------------- | ------------------------ | -------------------- |
| Portfolio CSV     | `./data/portfolio_links.csv` | `--portfolio-csv <path>` | `PORTFOLIO_CSV`      |
| Resumes directory | `./data/resumes`             | `--resumes-dir <path>`   | `RESUMES_DIR`        |

### Custom Paths

```bash theme={null}
# Custom CSV path
gitresolve --portfolios --portfolio-csv ./candidates/ats-export.csv

# Custom resumes directory
gitresolve --resumes --resumes-dir ./uploads/applications

# Both at once
gitresolve --all \
  --portfolio-csv ./candidates/ats-export.csv \
  --resumes-dir ./uploads/applications
```

## Portfolio CSV Format

The CSV must contain a column that GitResolve can use as the URL source. Column names are checked in the following priority order:

1. `url`
2. `URL`
3. `link`
4. `Link`
5. **First column** (fallback — used if none of the above are present)

```csv theme={null}
name,url,notes
Jane Doe,https://janedoe.dev,Strong frontend
John Smith,https://github.com/jsmith,Backend focus
Alice Lee,https://gitlab.com/alicelee,
```

<Tip>
  GitResolve applies the same URL normalization used in single-URL mode. Bare domains like `janedoe.dev` in the CSV are automatically prefixed with `https://` before processing.
</Tip>

If your CSV column is named something other than the four supported names, rename the column or rely on the first-column fallback:

```csv theme={null}
portfolio_url
https://janedoe.dev
https://github.com/jsmith
```

## Resumes Directory Format

GitResolve scans the target directory and processes every file with a `.pdf` extension. Subdirectories are not traversed — all PDFs must be in the top-level folder.

```
data/
└── resumes/
    ├── jane-doe.pdf
    ├── john-smith.pdf
    └── alice-lee.pdf
```

Non-PDF files in the same directory are silently ignored.

## Step-by-Step Setup

<Steps>
  <Step title="Create the data folders">
    Create the default directory structure in your project root.

    ```bash theme={null}
    mkdir -p data/resumes
    ```
  </Step>

  <Step title="Add portfolio links">
    Create `data/portfolio_links.csv` with a `url` column.

    ```csv theme={null}
    name,url
    Jane Doe,https://janedoe.dev
    John Smith,https://github.com/jsmith
    Alice Lee,https://gitlab.com/alicelee
    ```
  </Step>

  <Step title="Add resume PDFs">
    Copy or move candidate resume PDFs into `data/resumes/`.

    ```bash theme={null}
    cp ~/Downloads/*.pdf data/resumes/
    ```
  </Step>

  <Step title="Run the batch command">
    Process all inputs with a single command.

    ```bash theme={null}
    gitresolve --all
    ```

    To save results to disk instead of (or in addition to) the terminal:

    ```bash theme={null}
    gitresolve --all --output-dir ./results
    ```
  </Step>
</Steps>

## Candidate Aggregation

When two or more sources — for example, a portfolio link from the CSV and a PDF resume — both resolve to the same Git username, GitResolve automatically merges them into a single `AggregatedResult`. Duplicate links are deduplicated by URL, and all source references are tracked in the `sources` and `sourceTypes` arrays.

```bash theme={null}
# janedoe.dev and janedoe.pdf both resolve to github.com/janedoe
# → one merged AggregatedResult is written to results/resolved/janedoe.json
gitresolve --all --output-dir ./results
```

### Example Aggregated Output

```json theme={null}
{
  "candidateUsername": "janedoe",
  "sources": [
    "https://janedoe.dev",
    "./data/resumes/janedoe.pdf"
  ],
  "sourceTypes": [
    "portfolio",
    "resume_file"
  ],
  "ownerProfile": {
    "url": "https://github.com/janedoe",
    "provider": "github",
    "type": "profile",
    "username": "janedoe"
  },
  "confidence": "high",
  "ownedRepos": [
    {
      "url": "https://github.com/janedoe/my-project",
      "provider": "github",
      "type": "repo",
      "username": "janedoe",
      "repo": "my-project"
    }
  ],
  "contributions": [
    {
      "url": "https://github.com/open-source-org/library/pull/42",
      "provider": "github",
      "type": "pull_request",
      "username": "janedoe",
      "repo": "library",
      "number": "42"
    }
  ],
  "externalRepos": [],
  "allLinks": [],
  "warnings": []
}
```

Candidates whose sources cannot be resolved to any Git username are written to `unresolved/` with a sanitized filename rather than a username. See [Output Options](/cli/output-options) for the full directory structure.

## Privacy

<Note>
  All processing happens locally on your machine. No candidate data — portfolio URLs, resume text, or resolved profiles — is sent to any external server by GitResolve. The only outbound network requests are the page fetches to the candidate URLs themselves.
</Note>

It is good practice to add your data directories to `.gitignore` so that candidate materials are not accidentally committed to version control:

```gitignore theme={null}
data/resumes/
data/portfolio_links.csv
results/
```
