# How to Configure Your Identity, Location, and Salary Targets in Career‑Ops

> Learn how to configure your identity, location, and salary targets in Career-Ops by editing the profile.yml file. Set up your candidate profile and compensation expectations easily.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: how-to-guide
- Published: 2026-08-28

---

**Copy [`config/profile.example.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.example.yml) to [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) and populate the `candidate`, `location`, and `compensation` blocks to establish your identity, work authorization status, and compensation expectations.**

Career‑Ops treats [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) as the **single source of truth** for all personal data governing job evaluations, CV generation, and outreach automation. When you clone the `santifer/career-ops` repository, you receive a template file that defines every field the system expects, from your display location to your walk‑away salary minimum.

## The Configuration File Structure

All identity and compensation data lives in one YAML file at the repository root. The system loads this file at runtime via the internal `loadProfile` utility, making the values available to every mode (evaluation, PDF generation, and outreach) without requiring environment variables or additional configuration files.

### Identity and Location Settings

The `candidate` key stores your display identity, while the `location` block captures structured work‑authorization data.

- **`candidate.location`** (line 16 of the template): A free‑form string displayed in the CV header and used by the location policy block during offer evaluation.
- **`location` block** (lines 76‑90): Structured fields that drive the work‑authorization signal in Block A of the oferta evaluation:
  - `country`: Your primary country of residence.
  - `city`: Specific city for timezone and tax considerations.
  - `timezone`: Your working timezone (e.g., `PST`, `CET`).
  - `visa_status`: Human‑readable status (e.g., `"No sponsorship needed"`).
  - `authorized_in`: Array of countries where you hold work authorization.
  - `needs_sponsorship`: Boolean flag indicating if visa sponsorship is required.

### Salary and Compensation Targets

The `compensation` key (lines 70‑75) defines your financial expectations:

- **`target_range`**: Your desired total‑compensation band (e.g., `"$150K-200K"`).
- **`minimum`**: The walk‑away figure below which you will not consider offers.
- **`currency`**: ISO currency code (e.g., `USD`, `EUR`).
- **`location_flexibility`**: Remote‑versus‑on‑site preferences used when scoring opportunities.

## Step‑by‑Step Configuration Guide

### 1. Copy the Template

If [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) does not exist, generate it from the provided example:

```bash
cp config/profile.example.yml config/profile.yml

```

This operation creates a regular file with no secrets, making it safe to edit directly.

### 2. Configure Identity and Location

Edit [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) to set your display location and work authorization details:

```yaml
candidate:
  location: "San Francisco, CA"

location:
  country: "United States"
  city: "San Francisco"
  timezone: "PST"
  visa_status: "No sponsorship needed"
  authorized_in: ["United States"]
  needs_sponsorship: false

```

The `candidate.location` string appears in generated PDF headers, while the structured `location` block feeds into the evaluation logic in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md).

### 3. Set Compensation Targets

Define your salary expectations under the `compensation` key:

```yaml
compensation:
  target_range: "$150K-200K"
  currency: "USD"
  minimum: "$120K"
  location_flexibility: "Remote preferred, 1 week/month on‑site possible"

```

These values are read by `build-cv-html.mjs` and `build-cv-latex.mjs` to populate compensation sections in your CV, and by the evaluation scripts to filter incoming offers against your minimum threshold.

### 4. Verify the Configuration

Confirm that Career‑Ops can parse your profile by running a quick Node.js check:

```bash
node -e "console.log(require('js-yaml').load(require('fs').readFileSync('config/profile.yml','utf8')).candidate.location)"

```

If the command prints your location string (e.g., `San Francisco, CA`), the file is valid and ready for use.

## How Career‑Ops Uses Your Configuration Data

When you execute commands like `career-ops evaluate` or `career-ops pdf`, the system imports [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) through the `loadProfile` utility. This structured object is passed to:

- **Evaluation modes** ([`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)): Compares your `location` block against job requirements to score work‑authorization fit.
- **CV generators** (`build-cv-html.mjs`, `build-cv-latex.mjs`): Injects `candidate.location` and compensation data into the generated output.
- **Outreach templates**: References your `target_range` and `location_flexibility` to personalize cover letters.

Because the YAML is parsed once at startup, any change to [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) is instantly reflected across the entire pipeline without restarting the application or modifying source code.

## Summary

- Career‑Ops stores all personal identity, location, and salary data in **[`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml)**.
- Copy **[`config/profile.example.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.example.yml)** to create your initial configuration.
- Populate the **`candidate`** key for display strings, the **`location`** block for structured work‑authorization data, and the **`compensation`** block for salary targets.
- Changes take effect immediately across evaluation modes and CV generators without requiring code modifications.

## Frequently Asked Questions

### Where does Career‑Ops store personal configuration data?

Career‑Ops stores all identity and compensation information in **[`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml)**. According to the [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md) specification, this file serves as the authoritative user‑layer configuration, separating personal data from system logic.

### What is the difference between `candidate.location` and the `location` block?

The **`candidate.location`** field is a free‑form string displayed on your CV header, while the **`location`** block contains structured data (`country`, `visa_status`, `authorized_in`, etc.) used by the evaluation engine in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) to determine work‑authorization compatibility.

### How do I update my salary expectations without changing code?

Edit the **`compensation`** section in [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) to modify `target_range`, `minimum`, or `currency`. The next time you run `career-ops evaluate` or generate a PDF, the new values propagate automatically through the `loadProfile` utility.

### Does Career‑Ops support multiple currencies for compensation targets?

Yes. The **`compensation.currency`** field accepts any ISO currency code (e.g., `USD`, `EUR`, `GBP`). Ensure that `target_range` and `minimum` values are denominated in the specified currency, as the evaluation scripts treat these as opaque strings matched against offer data.