Atlas / Skills / borski / Southwest

SouthwestCAUTION

skills/borski/southwest

AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.

Verdict
CAUTION
Grade
B
Trust score
86 /100
Version
—
Hosts
—
License
MIT
Stars
693
01

Overview

AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.

Read from source at commit fda58ab480fdOBSERVED · 2026-10-14
02

Install

Commands as the repository documents them. They are shown, not run.

pip install patchright && patchright install chromium
pip install patchright && patchright install chromium
03

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: southwest
description: Search Southwest Airlines fares and points pricing via Patchright browser automation. SW is not in any GDS or API. Covers all fare classes, Companion Pass value, and fare drop monitoring.
category: flights
summary: SW fare classes, points pricing, Companion Pass. Change flight price drop monitor.
api_key: None (requires Patchright)
docker_image: ghcr.io/borski/sw-fares
allowed-tools: Bash(python3 *), Bash(docker *)
---

# Southwest Airlines Search

Search southwest.com via Patchright (undetected Playwright fork). Southwest is the only major US airline not in any GDS, API, or flight search tool. This skill is the only way to get SW-specific data: fare classes, points pricing, and Companion Pass qualification.

**Requires Patchright** (undetected Playwright fork). Standard Playwright and agent-browser are detected and blocked by SW. Patchright patches the browser fingerprint to bypass detection.

**Must run headed (headless=False).** SW detects headless browsers even with Patchright. On macOS, a Chrome window briefly appears and closes. For background operation with no popup, use Docker:

```bash
# Search new flights (default, no login needed)
docker run --rm ghcr.io/borski/sw-fares --origin SJC --dest DEN --depart 2026-05-15
docker run --rm ghcr.io/borski/sw-fares --origin SJC --dest DEN --depart 2026-05-15 --return 2026-05-18 --points --json

# Check existing reservation for price drops (requires SW login)
docker run --rm -e SW_USERNAME -e SW_PASSWORD \
  ghcr.io/borski/sw-fares change --conf ABC123 --first Jane --last Doe --json

# List all upcoming trips
docker run --rm -e SW_USERNAME -e SW_PASSWORD \
  ghcr.io/borski/sw-fares change --list --json

# Build locally
docker build -t sw-fares skills/southwest/
```

The Docker image uses xvfb to create a virtual display inside the container. Patchright runs "headed" against xvfb, bypassing SW's headless detection without opening any windows on your machine.

```bash
# Install
pip install patchright && patchright install chromium

# Search cash fares
python3 scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15

# Search cash + points
python3 scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15 --return 2026-05-18 --points

# JSON output
python3 scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15 --points --json
```

**Key implementation details learned the hard way:**
- Navigate to southwest.com homepage FIRST, then to the results URL. Direct URL without homepage warmup gets blocked.
- Use `fareType=POINTS` URL parameter for points pricing. Don't try to click the Points toggle on the page.
- Use a fresh persistent browser context (temp dir) each run to avoid fingerprint accumulation.
- Extract text from `[role='main']` NOT `<main>`. The `<main>` element contains the booking form. `[role='main']` contains the flight results.
- Flight blocks can be parsed by splitting on `# \d+` patterns and ending at `View seats`.
- Always dismiss the cookie banner first. It blocks interactions.

## Prerequisites

```bash
pip install patchright && patchright install chromium
```

Or use Docker (no local install needed):
```bash
# Pre-built image (fastest)
docker pull ghcr.io/borski/sw-fares:latest

# Or build locally
docker build -t sw-fares skills/southwest/
```

## When to Use

- User asks about Southwest flights or fares
- Need points pricing (not available anywhere else)
- Need fare class breakdown (Basic, Choice, Choice Preferred, Choice Extra)
- Calculating Companion Pass value
- Comparing SW points vs cash vs other airlines

## When NOT to Use

- **Just need SW cash prices**: Use google-flights skill instead (faster)
- **Completing purchases**: Find flights only. Do not book.
- **Non-Southwest airlines**: Use duffel, ignav, google-flights, or other skills

## Southwest Fare Classes

| Fare | Points | Cash | Companion Pass | Change/Cancel | Bags |
|------|--------|------|----------------|---------------|------|
| Basic (Wanna Get Away) | Lowest | Lowest | **NO** | Credit only | 2 free |
| Choice (Wanna Get Away Plus) | Low | Low | **YES** | Transferable credit | 2 free |
| Choice Preferred (Anytime) | High | High | **YES** | Refundable | 2 free |
| Choice Extra (Business Select) | Highest | Highest | **YES** | Refundable + priority | 2 free |

**Critical for Companion Pass:** Only Choice and above qualify. Basic does NOT. This changes the CPP math significantly.

## Companion Pass CPP Formula

When CP is in play, one ticket buys travel for two:

```
Total cash value = qualifying_fare_cash x 2 passengers
CPP = total_cash_value / total_points x 100
```

Always frame as "points bought $X of travel for 2 people."

## Search: Use the Script

**Do NOT try to automate the SW booking form manually.** It's fragile and the form's React state doesn't cooperate with browser automation. Use the script instead, which navigates directly to the results URL.

```bash
# Local (opens a Chrome window briefly)
python3 skills/southwest/scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15

# With return date and points
python3 skills/southwest/scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15 --return 2026-05-18 --points

# JSON output for programmatic use
python3 skills/southwest/scripts/search_fares.py --origin SJC --dest DEN --depart 2026-05-15 --points --json

# Docker (no Chrome window, no display needed)
docker run --rm ghcr.io/borski/sw-fares --origin SJC --dest DEN --depart 2026-05-15 --return 2026-05-18 --points
```

The script handles everything: homepage warmup, cookie dismissal, result extraction, points toggle.

## How the Script Works

1. Launches Patchright (undetected Playwright) in headed mode with a fresh browser profile
2. Visits southwest.com homepage first to establish a normal browsing session
3. Navigates to the results URL with `fareType=USD` for cash or `fareType=POINTS` for points
4. Waits 15 seconds for SW's React app to render flight data
04

Trust audit

CAUTIONgrade B · trust 86/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
UNDECLARED (4 observation(s))
Network
none-observed
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (9)

MEDIUMInventory / provenance · inv.symlink · CWE-1104
.agents/skills
.agents/skills
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills
.claude/skills
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.opencode/skills
.opencode/skills
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
skills
skills
Why it matters. link not followed
MEDIUMFilesystem / path · fs.destructive · CWE-22, CWE-59
scripts/check_change.py:882
shutil.rmtree(tmpdir, ignore_errors=True)
MEDIUMFilesystem / path · fs.destructive · CWE-22, CWE-59
scripts/check_change.py:1030
shutil.rmtree(tmpdir, ignore_errors=True)
MEDIUMFilesystem / path · fs.destructive · CWE-22, CWE-59
scripts/monitor.py:278
shutil.rmtree(tmpdir, ignore_errors=True)
MEDIUMFilesystem / path · fs.destructive · CWE-22, CWE-59
scripts/search_fares.py:166
shutil.rmtree(tmpdir, ignore_errors=True)
LOWInventory / provenance · inv.symlink · CWE-1104
AGENTS.md
AGENTS.md
Why it matters. link not followed

Gates applied: no_behavioural_pass.

Audited 2026-10-14 · audit v0.4.1 · source sha fda58ab480fdfull audit observations/trust-audit/skill/borski__southwest.json · Report an issue / request a re-scan
05

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-14fda58ab480fdCAUTIONB86first audit
06

Questions

What does the Southwest skill do?

AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.

Is Southwest safe to install?

With care. The audit graded it B (86/100) and found 9 things worth knowing before you trust this skill, listed below with the exact line each was found on.

What can Southwest access on my machine?

The audit observed that it reads or writes files. At least one of those is not mentioned in its own description, which is itself a finding. Secrets in the source: none found.

How current is this page?

The grade is for one exact copy of the source (fda58ab480fd), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement