#967 by GitHub stars
borski/travel-hacking-toolkit
AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
plugins/travel-hacking-toolkit/skills/alliances/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/award-calendar/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/award-holds/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/award-sweet-spots/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/awardwallet/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/bilt/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/booking-guidance/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/cabin-codes/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/chase-travel/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/compare-flights/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/compare-hotels/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/deutsche-bahn/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/duffel/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/fallback-and-resilience/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/flight-search-strategy/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/gardening/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/getting-started/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/google-flights/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/hotel-chains/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/ignav/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/lessons-learned/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/partner-awards/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/plan-trip/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/points-valuations/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/premium-hotels/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/rapidapi/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/round-the-world/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/scandinavia-transit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/seatmaps/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/seats-aero/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/serpapi/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/southwest/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/status-match/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/stopovers/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/sutochno/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/ticketsatwork/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/transfer-bonuses/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/transfer-partners/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/trip-calculator/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/trip-log/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/trip-planner/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Instructions only
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/tripadvisor/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/vrbo/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/wheretocredit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
plugins/travel-hacking-toolkit/skills/wikipedia-airports/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
b46172deee14 → 07bf2bd4b798
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → b46172deee14
No earlier version was observed for comparison.
Verified commit 07bf2bd4b798f25799125b20e546f390ab1e954d
git clone --filter=blob:none --no-checkout https://github.com/borski/travel-hacking-toolkit.git .hotskills/borski-travel-hacking-toolkit && git -C .hotskills/borski-travel-hacking-toolkit checkout --detach 07bf2bd4b798f25799125b20e546f390ab1e954d
# Copy each selected skill directory from .hotskills/borski-travel-hacking-toolkit into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/borski/travel-hacking-toolkit.git .hotskills/borski-travel-hacking-toolkit && git -C .hotskills/borski-travel-hacking-toolkit checkout --detach 07bf2bd4b798f25799125b20e546f390ab1e954d
# Copy each selected skill directory from .hotskills/borski-travel-hacking-toolkit into .agents/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/borski/travel-hacking-toolkit.git .hotskills/borski-travel-hacking-toolkit && git -C .hotskills/borski-travel-hacking-toolkit checkout --detach 07bf2bd4b798f25799125b20e546f390ab1e954d
# Copy each selected skill directory from .hotskills/borski-travel-hacking-toolkit into .opencode/skills/<skill-name>/Heat
7.9- Star growth, last 7 daysAhead of 98% of tracked repositories
- Star growth, last 24 hoursAhead of 98% of tracked repositories
- Rank movement, last 7 daysNot available
- Commits, last 30 daysAhead of 73% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- alliances
plugins/travel-hacking-toolkit/skills/alliances - american-airlines
plugins/travel-hacking-toolkit/skills/american-airlines - amex-travel
plugins/travel-hacking-toolkit/skills/amex-travel - atlas-obscura
plugins/travel-hacking-toolkit/skills/atlas-obscura - award-calendar
plugins/travel-hacking-toolkit/skills/award-calendar - award-holds
plugins/travel-hacking-toolkit/skills/award-holds - award-sweet-spots
plugins/travel-hacking-toolkit/skills/award-sweet-spots - awardwallet
plugins/travel-hacking-toolkit/skills/awardwallet - bilt
plugins/travel-hacking-toolkit/skills/bilt - booking-guidance
plugins/travel-hacking-toolkit/skills/booking-guidance - cabin-codes
plugins/travel-hacking-toolkit/skills/cabin-codes - chase-travel
plugins/travel-hacking-toolkit/skills/chase-travel - compare-flights
plugins/travel-hacking-toolkit/skills/compare-flights - compare-hotels
plugins/travel-hacking-toolkit/skills/compare-hotels - deutsche-bahn
plugins/travel-hacking-toolkit/skills/deutsche-bahn - duffel
plugins/travel-hacking-toolkit/skills/duffel - fallback-and-resilience
plugins/travel-hacking-toolkit/skills/fallback-and-resilience - flight-search-strategy
plugins/travel-hacking-toolkit/skills/flight-search-strategy - gardening
plugins/travel-hacking-toolkit/skills/gardening - getting-started
plugins/travel-hacking-toolkit/skills/getting-started - google-flights
plugins/travel-hacking-toolkit/skills/google-flights - hotel-chains
plugins/travel-hacking-toolkit/skills/hotel-chains - ignav
plugins/travel-hacking-toolkit/skills/ignav - lessons-learned
plugins/travel-hacking-toolkit/skills/lessons-learned - partner-awards
plugins/travel-hacking-toolkit/skills/partner-awards - plan-trip
plugins/travel-hacking-toolkit/skills/plan-trip - points-valuations
plugins/travel-hacking-toolkit/skills/points-valuations - premium-hotels
plugins/travel-hacking-toolkit/skills/premium-hotels - rapidapi
plugins/travel-hacking-toolkit/skills/rapidapi - round-the-world
plugins/travel-hacking-toolkit/skills/round-the-world - scandinavia-transit
plugins/travel-hacking-toolkit/skills/scandinavia-transit - seatmaps
plugins/travel-hacking-toolkit/skills/seatmaps - seats-aero
plugins/travel-hacking-toolkit/skills/seats-aero - serpapi
plugins/travel-hacking-toolkit/skills/serpapi - southwest
plugins/travel-hacking-toolkit/skills/southwest - status-match
plugins/travel-hacking-toolkit/skills/status-match - stopovers
plugins/travel-hacking-toolkit/skills/stopovers - sutochno
plugins/travel-hacking-toolkit/skills/sutochno - ticketsatwork
plugins/travel-hacking-toolkit/skills/ticketsatwork - transfer-bonuses
plugins/travel-hacking-toolkit/skills/transfer-bonuses - transfer-partners
plugins/travel-hacking-toolkit/skills/transfer-partners - trip-calculator
plugins/travel-hacking-toolkit/skills/trip-calculator - trip-log
plugins/travel-hacking-toolkit/skills/trip-log - trip-planner
plugins/travel-hacking-toolkit/skills/trip-planner - tripadvisor
plugins/travel-hacking-toolkit/skills/tripadvisor - vrbo
plugins/travel-hacking-toolkit/skills/vrbo - wheretocredit
plugins/travel-hacking-toolkit/skills/wheretocredit - wikipedia-airports
plugins/travel-hacking-toolkit/skills/wikipedia-airports
How it works
alliances
When your agent uses it
Airline alliance membership (Star Alliance, oneworld, SkyTeam) and cross-alliance booking relationships. Maps which loyalty programs book which airlines, including bilateral partnerships outside alliances.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
546 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Key Booking Relationships
- Recent Alliance Changes
- Cross-Alliance Bookings Are Where Real Value Hides
- Partner Awards Reference
Files
../../../../.claude-plugin/marketplace.jsonasset1,005 bytes../../../../.claude-plugin/plugin.jsonasset1,014 bytesSKILL.mdcore2,420 bytes
Read SKILL.md
# Alliance Awareness
**Reference data:** `data/alliances.json`
Star Alliance, oneworld, and SkyTeam determine which loyalty programs can book which airlines. This is fundamental to award travel. When recommending an award booking, always verify the airline and the booking program are in the same alliance (or have a bilateral partnership).
## Key Booking Relationships
- **United MileagePlus** books Star Alliance (ANA, Lufthansa, Singapore, Turkish, etc.)
- **Aeroplan** books Star Alliance plus extended partners (including Etihad, Emirates on some routes)
- **Virgin Atlantic Flying Club** books ANA, Delta, Air France, KLM (cross-alliance)
- **AAdvantage** books oneworld (Cathay, JAL, Qantas, Qatar, BA, etc.)
- **Flying Blue** books SkyTeam (Air France, KLM, Delta, Korean Air, etc.)
- **Korean Air SKYPASS** books SkyTeamView the complete source on GitHubamerican-airlines
When your agent uses it
Check American Airlines AAdvantage balance, elite status, and loyalty points via Patchright. Handles email 2FA with 6-box code entry. Uses persistent browser profiles to skip 2FA on subsequent runs.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
1,272 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- Usage
- 2FA Handling
- Output
- When to Use
- When NOT to Use
- Implementation Notes
- Limitations
Scripts executed separately
Dockerfilescripts/check_balance.py
Files
Dockerfileruns328 bytesSKILL.mdcore5,137 bytesSKILL.mdcore5,137 bytesSKILL.mdcore5,137 bytesSKILL.mdcore5,137 bytesSKILL.mdcore5,137 bytesscripts/check_balance.pyruns22,222 bytes
Read SKILL.md
# American Airlines AAdvantage
Check AAdvantage award miles balance, elite status (Gold/Platinum/Platinum Pro/Executive Platinum), loyalty points, and million miler status. Uses Patchright (undetected Playwright fork) because AA blocks standard browser automation.
**Requires Patchright.** AA.com blocks vanilla Playwright and agent-browser.
## Prerequisites
```bash
pip install patchright && patchright install chromium
```
Or use Docker (no local install needed):
```bashView the complete source on GitHubamex-travel
When your agent uses it
Search Amex travel portal for cash prices, MR points pricing, IAP discounts, and FHR/THC hotel benefits via Patchright. Use when comparing pay-with-points portal pricing to award alternatives.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
3,064 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Usage
- 2FA Flow
- Known Limitation: travel-portal login captcha (May 2026)
- How It Works
- International Airline Program (IAP)
- Output Format
- Cabin Codes
- Environment Variables
- Troubleshooting
- Limitations
Scripts executed separately
Dockerfilescripts/refresh_login.pyscripts/search_flights.pytests/test_search_flights.py
Files
Dockerfileruns176 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesSKILL.mdcore12,360 bytesscripts/refresh_login.pyruns5,027 bytesscripts/search_flights.pyruns99,695 bytestests/test_search_flights.pyruns9,148 bytes
Read SKILL.md
# Amex Travel Portal Search
Search the American Express travel portal for flights and hotels via Patchright. Returns cash prices, MR points pricing, International Airline Program (IAP) discounts, and Fine Hotels & Resorts / The Hotel Collection benefits.
**Requires Patchright** (undetected Playwright fork). Amex blocks standard Playwright and agent-browser.
**Must run headed (headless=False).** Amex detects headless browsers. On macOS, a Chrome window briefly appears. For background operation, use Docker.
## Prerequisites
```bash
pip install patchright && patchright install chromium
```
View the complete source on GitHubatlas-obscura
When your agent uses it
Search Atlas Obscura for weird, wonderful, and hidden gem places near any destination. Find the interesting stuff, not boring plaques. Search by coordinates, get full details with descriptions and images.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
1,204 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- City Coordinates Reference
- Commands
- Interest Scoring
- Useful jq Filters
- When to Use
Scripts executed separately
ao.mjspackage.json
Files
SKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesSKILL.mdcore4,528 bytesao.mjsruns7,053 bytespackage-lock.jsonasset28,091 bytespackage.jsonruns134 bytes
Read SKILL.md
# Atlas Obscura
Find genuinely interesting hidden gems near any destination via Atlas Obscura. Searches by coordinates, scores places for interestingness, and filters out mundane historical markers.
No API key needed. Uses the [`atlas-obscura-api`](https://github.com/bartholomej/atlas-obscura-api) npm scraper.
## Prerequisites
Install dependencies (one time):
```bash
cd skills/atlas-obscura && npm install
```
View the complete source on GitHubaward-calendar
When your agent uses it
Find the cheapest award dates for a route over a date range. Searches seats.aero across all programs, groups by date, and shows a calendar grid of the best deals. Use when dates are flexible and you want to find the sweet spot.
What it loads into context
Frontmatter
85 tokensAlways available to the agent
SKILL.md
1,549 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- When NOT to Use
- Workflow
- Error Handling
- Limitations
Files
SKILL.mdcore5,784 bytesSKILL.mdcore5,784 bytes
Read SKILL.md
# Award Calendar
"When should I fly SFO to NRT on points?" answered with a calendar view.
Searches seats.aero across a date range and presents a grid showing the cheapest award per day, per cabin. Highlights the best dates to fly.
**This is an orchestration skill.** It tells the agent how to query seats.aero and format the results. No standalone script.
## When to Use
- "When's the cheapest time to fly SFO to NRT in business on points?"
- "Show me award availability for SFO-CDG in September"
- "I'm flexible on dates. When should I fly?"
- Any award search where dates are flexibleView the complete source on GitHubaward-holds
When your agent uses it
Per-program rules for placing award flights on hold before transferring points. Covers programs with holds (AA, Lufthansa, Flying Blue, Cathay, Turkish, Virgin Atlantic, ANA, Emirates, EVA Air) and those without. Includes transfer-speed reference.
What it loads into context
Frontmatter
175 tokensAlways available to the agent
SKILL.md
2,390 tokensWhen the skill is activated
Reference documents
25,196 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why Holds Matter
- When to Use This Skill
- When NOT to Use
- Programs That Allow Holds (9 + Singapore agent-discretionary)
- Programs That Do NOT Allow Holds
- Decision Rules
- Reading the Data File
- Cross-References
- Source Hierarchy (Per Research Integrity Protocol)
- Avoiding Fabrication
Files
SKILL.mdcore9,753 bytesSKILL.mdcore9,753 bytesSKILL.mdcore9,753 bytesSKILL.mdcore9,753 bytes../booking-guidance/SKILL.mddoc8,591 bytes../partner-awards/SKILL.mddoc4,012 bytes../round-the-world/SKILL.mddoc17,322 bytes../seats-aero/SKILL.mddoc20,823 bytes../status-match/SKILL.mddoc14,246 bytes../stopovers/SKILL.mddoc11,361 bytes../transfer-bonuses/SKILL.mddoc10,173 bytes../transfer-partners/SKILL.mddoc12,111 bytes
Read SKILL.md
# Award Hold Policies per Loyalty Program
Reference data for which programs allow you to put an award flight ticket on hold, for how long, at what cost, and via what method (online vs phone). Critical for transferable-currency redemptions where transfers take minutes to days to clear.
Data lives in [`data/award-holds.json`](../../data/award-holds.json). Refresh cadence is 90 days because hold rules change rarely.
## Why Holds Matter
When you find an award seat but the points are sitting in a transferable currency (Amex MR, Chase UR, Citi TYP, Capital One, Bilt, Marriott Bonvoy), you need to transfer them to the loyalty program before booking. Transfer times range from instant (most Amex/Chase partners) to 4 days (Marriott Bonvoy to airline partners).
Without a hold, you risk losing the award seat while the transfer pends. **A hold removes the seats from the available pool for the duration**, guaranteeing they'll still be there when you ticket.
## When to Use This Skill
View the complete source on GitHubaward-sweet-spots
When your agent uses it
Catalog of high-value award redemptions where points dramatically outvalue cash. Tiered by legendary/excellent/good with current rates, devaluation history, and booking caveats. Includes Oceania and South Pacific plays (Australia, New Zealand, Tahiti, Fiji) and transatlantic business-class sweet spots.
What it loads into context
Frontmatter
99 tokensAlways available to the agent
SKILL.md
1,062 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Tier System
- Devaluations Matter
- How to Use This Reference
- Oceania / South Pacific Sweet Spots
- Booking Windows
Files
SKILL.mdcore4,480 bytes
Read SKILL.md
# Award Sweet Spots
**Reference data:** `data/sweet-spots.json`
When making recommendations, cross-reference against known sweet spots. If a route matches a sweet spot, flag it prominently.
## Tier System
Sweet spots are ranked by tier:
- **Legendary:** Outsized value that travel hackers build entire trips around
- Examples: ANA First via Virgin Atlantic, Hyatt All-Inclusive via World of Hyatt
- **Excellent:** Consistently great value, reliable availability
- Examples: Iberia Avios to Madrid, Qatar Qsuites via various programs, Virgin Atlantic economy to LondonView the complete source on GitHubawardwallet
When your agent uses it
Query AwardWallet for loyalty program balances, elite status, and transaction history. Use when checking points inventory, airline status, or planning trips on points.
What it loads into context
Frontmatter
62 tokensAlways available to the agent
SKILL.md
1,806 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Authentication
- API Base
- Quick Start: Get All Balances
- Deep Dive: Full Account History
- Travel Timeline
- List All Supported Providers
- Account Property Kinds
- Error Codes
- Workflow: Trip Planning Summary
- Notes
Files
SKILL.mdcore6,739 bytesSKILL.mdcore6,739 bytesSKILL.mdcore6,739 bytesSKILL.mdcore6,739 bytesSKILL.mdcore6,739 bytesSKILL.mdcore6,739 bytes
Read SKILL.md
# AwardWallet Skill
Query loyalty program balances, elite status, and transaction history via the AwardWallet Business Account Access API.
**Source:** [business.awardwallet.com](https://business.awardwallet.com) — Requires a Business account.
## Authentication
Set these in your `.env` file:
- `AWARDWALLET_API_KEY` — Get from https://business.awardwallet.com/profile/api
- `AWARDWALLET_USER_ID` — Your connected user ID. Find it via the List Connected Users endpoint below.
All requests use the `X-Authentication` header.
View the complete source on GitHubbilt
When your agent uses it
Search Bilt Rewards travel portal for cash and Bilt Points pricing on hotels and flights. Public REST API, no auth required. Includes Home Away From Home (HaFH) properties with $300+ benefits.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
4,281 tokensWhen the skill is activated
Reference documents
23,183 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Important: Bilt is Whitelabel Duffel
- Why It Matters
- When to Use
- When NOT to Use
- Bilt Points Valuation
- API Base
- Hotel Search
- Flight Search
- Output Format
- Comparison Workflow
- Important Notes
Files
../amex-travel/SKILL.mddoc12,360 bytes../awardwallet/SKILL.mddoc6,739 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytesSKILL.mdcore15,400 bytes../chase-travel/SKILL.mddoc11,038 bytes../duffel/SKILL.mddoc7,458 bytes../premium-hotels/SKILL.mddoc9,470 bytes../seats-aero/SKILL.mddoc20,823 bytes../serpapi/SKILL.mddoc7,691 bytes../transfer-partners/SKILL.mddoc12,111 bytes
Read SKILL.md
# Bilt Travel Portal Search
Search [Bilt Rewards](https://www.bilt.com) travel portal via the public REST API. No authentication required for search. Returns both cash prices in USD and Bilt Points cost for hotels and flights.
## Important: Bilt is Whitelabel Duffel
Bilt's travel search is built directly on top of [Duffel](https://duffel.com). All evidence points to a complete white-label arrangement, not a partial integration:
- Flight offer IDs are `off_XXX`, slices `sli_XXX`, segments `seg_XXX`, aircraft `arc_XXX`, airlines `arl_XXX`. All Duffel ID patterns.
- Carrier and aircraft logos served from `assets.duffel.com`.
- Hotel loyalty program logos served from `assets.duffel.com/img/stays/loyalty-programmes`. So hotels are Duffel Stays.
- JWT `organisation_id: org_0000AaALZyFQ...` is a Duffel auth pattern.
- Field names match Duffel exactly: `marketingCarrier`, `operatingCarrier`, `cabinClassMarketingName`, `fareBasisCode`, `isNDC`, `ndcRedirectUrl`, `totalEmissionsKg`, `slices[].segments[].passengers[].baggages[]`.
View the complete source on GitHubbooking-guidance
When your agent uses it
Step-by-step guidance for booking award flights. Covers the hold-before-transfer rule, phone numbers for major programs, and partner award booking workflows.
What it loads into context
Frontmatter
57 tokensAlways available to the agent
SKILL.md
2,163 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Program Fee Profiles
- General Booking Flow
- Critical Rule: Never Transfer Without a Hold
- Phone Numbers for Major Programs
- When Phone Bookings Are Required
- Tips for Phone Bookings
- Saver Inventory Verification
- Status Effects on Booking
Files
SKILL.mdcore8,591 bytes
Read SKILL.md
# Booking Guidance
Finding the deal is half the battle. Telling the user how to actually book it is the other half. **Every recommendation should include a booking path.**
**Reference data:** `data/alliances.json` has booking details for major programs in `key_booking_relationships`.
## Program Fee Profiles
**Check this before recommending a transfer or locking in a departure city.** Fees vary dramatically by program and origin airport and can add $100-700+ per person on top of the miles cost. Two things to keep in mind reading the table: (1) several programs are surcharge-free on their own metal and most partners but pass heavy surcharges on *specific* partners (notably British Airways metal) — the YQ column calls those out; (2) dollar figures are per direction and **scale with cabin** — economy surcharges are materially lower than the business-class figures shown for surcharge-heavy metal. Rows marked ⚠<U+FE0F> are high-surcharge programs that often lose to cash.
| Program | YQ Surcharge? | Typical fees/pp | Notes |
|---------|--------------|-----------------|-------|
| Aeroplan (Air Canada) | No | $50-100 | No YQ pass-through on Star Alliance partners. Low fees. Best for LH/LX/UA awards. |
| Flying Blue (AF/KLM) | Yes | ~$250-400/way economy, ~$489-600/way business, ex-CDG | AF passes full fuel surcharge; France adds heavy departure tax. Worst from Paris. |View the complete source on GitHubcabin-codes
When your agent uses it
IATA cabin codes (F/J/W/Y) and saver fare class codes (X/I/O) for reading award inventory and determining partner-bookable availability.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
397 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Fare Class Codes for Saver Awards
- Why This Matters
Files
SKILL.mdcore1,797 bytes
Read SKILL.md
# Cabin Codes
When reading Seats.aero results or discussing award inventory, these cabin codes appear:
| Code | Cabin | Notes |
|------|-------|-------|
| F | First Class | Includes true first class suites |
| J | Business Class | Lie-flat seats on long-haul |
| W | Premium Economy | Also sometimes coded as "P" |
| Y | Economy | Standard seating |
## Fare Class Codes for Saver Awards
These are critical for partner bookings. If you see these fare codes available on united.com (or equivalent), the flight is bookable through partner programs at their (often lower) rates.View the complete source on GitHubchase-travel
When your agent uses it
Search Chase UR travel portal via Patchright for cash prices, points pricing, Points Boost offers, and Chase Edit hotel benefits. Use for pay-with-points portal comparison on Sapphire Reserve/Preferred.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
2,644 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Card Selection
- Usage
- 2FA Flow
- Credentials Must Be Resolved Values
- How It Works
- Output Format
- Portal Pricing Notes
- Environment Variables
- Troubleshooting
- Limitations
Scripts executed separately
Dockerfilescripts/record_search.pyscripts/search_flights.pytests/test_2fa_method.py
Files
Dockerfileruns126 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesSKILL.mdcore11,038 bytesscripts/record_search.pyruns9,309 bytesscripts/search_flights.pyruns140,278 bytestests/test_2fa_method.pyruns3,939 bytes
Read SKILL.md
# Chase Travel Portal Search
Search the Chase Ultimate Rewards travel portal for flights and hotels via Patchright. Returns cash prices, UR points pricing, Points Boost offers, and Chase Edit hotel benefits.
**Requires Patchright** (undetected Playwright fork). Chase blocks standard Playwright and agent-browser.
**Must run headed (headless=False).** Chase detects headless browsers. On macOS, a Chrome window briefly appears. For background operation, use Docker.
## Prerequisites
```bash
pip install patchright && patchright install chromium
```
View the complete source on GitHubcompare-flights
When your agent uses it
Unified flight comparison across cash (Duffel, Ignav), award (seats.aero), and portal (Chase, Amex) sources in parallel. Outputs one table with transfer partner optimization and recommendations.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
3,094 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Sources
- Workflow
- Error Handling
- Data Files Used
- Limitations
Files
SKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytesSKILL.mdcore11,988 bytes
Read SKILL.md
# Compare Flights
Search every available source for a route and present one unified comparison. Combines cash pricing, award availability, portal pay-with-points, and transfer partner optimization into a single table.
**This is an orchestration skill.** It tells the agent which tools to run and how to combine results. No standalone script.
**Companion reference skills.** Load these for deeper context:
- `flight-search-strategy` — full source priority, market selection, source accuracy hierarchy
- `points-valuations` — CPP rules, floor/ceiling, surcharge programs, transfer bonuses
- `partner-awards` — alliance + bilateral partnership reachability
- `lessons-learned` — Seats.aero workflow, Southwest specifics, Companion Pass math
- `fallback-and-resilience` — what to do when a source fails
- `transfer-bonuses` — current active transfer bonuses (live data); changes effective ratios when computing options 4-7 of the comparison table
- `stopovers` — when an itinerary has a long layover or multi-city, check if a stopover-allowing program priced lower than separate one-waysView the complete source on GitHubcompare-hotels
When your agent uses it
Unified hotel comparison across Chase Edit, Amex FHR/THC, metasearch, and Airbnb. Highlights premium program benefits, stacking opportunities, and benefit-adjusted pricing.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
2,668 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Sources
- Workflow
- Airbnb Integration
- Error Handling
- Data Files Used
- Limitations
Files
SKILL.mdcore10,447 bytesSKILL.mdcore10,447 bytesSKILL.mdcore10,447 bytesSKILL.mdcore10,447 bytes
Read SKILL.md
**Companion reference skills.** Load these for deeper context:
- `hotel-chains` — branded property to loyalty program mapping
- `premium-hotels` — FHR / THC / Chase Edit credits and stacking strategy
- `points-valuations` — CPP floor/ceiling for hotel programs (Hyatt 1.4-1.7cpp, Hilton 0.4cpp floor, etc.)
- `fallback-and-resilience` — recovery when a hotel source fails
# Compare Hotels
Search every available source for accommodation and present one unified comparison. Combines portal premium programs (Chase Edit, Amex FHR/THC), cash pricing, and Airbnb alternatives into a single view.
**This is an orchestration skill.** It tells the agent which tools to run and how to combine results. No standalone script.
## When to UseView the complete source on GitHubdeutsche-bahn
When your agent uses it
Deutsche Bahn train schedules, journey planning, and departures across Germany and into neighboring countries (Austria, Switzerland, Netherlands, France, Belgium). Use for ICE/IC/regional rail planning and airport ground transport (FRA, MUC).
What it loads into context
Frontmatter
119 tokensAlways available to the agent
SKILL.md
1,729 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Setup
- Commands
- Key Station IDs
- Common Airport-to-Germersheim Routes
- Parameters
- Coverage
- Limitations
- When to Use
Scripts executed separately
package.jsonscripts/search_trains.mjs
Files
SKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytesSKILL.mdcore6,237 bytespackage-lock.jsonasset18,811 bytespackage.jsonruns214 bytesscripts/search_trains.mjsruns5,822 bytes
Read SKILL.md
# Deutsche Bahn Skill
Search German train schedules and plan journeys using the `db-vendo-client` library (open-source client for bahn.de APIs).
**No API key required.** No Docker. Just Node.js.
**Source:** [db-vendo-client](https://github.com/public-transport/db-vendo-client) — wraps bahn.de's internal APIs.
## Setup
```bash
cd skills/deutsche-bahn && npm install
```
View the complete source on GitHubduffel
When your agent uses it
Real-time GDS flight search via Duffel API. Accurate per-fare-class pricing, cabin selection, multi-city, time preferences. Primary cash price source. Does not include Southwest.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
2,037 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- API Basics
- Search Flights (One-Way)
- Search Flights (Round-Trip)
- Search Flights (Multi-City)
- Nonstop Only
- Multiple Passengers
- Time Preferences
- Query Parameters
- Reading the Response
- Get Offer Details
- Parsing Tips
- Cabin Classes
- Important Notes
Files
SKILL.mdcore7,458 bytesSKILL.mdcore7,458 bytesSKILL.mdcore7,458 bytesSKILL.mdcore7,458 bytesSKILL.mdcore7,458 bytesSKILL.mdcore7,458 bytes
Read SKILL.md
# Duffel Flights
Search for real-time flight offers across airlines via the [Duffel API](https://duffel.com/docs/api). Returns live pricing, cabin details, baggage info, and booking links. Supports one-way, round-trip, and multi-city searches.
**Source:** [duffel.com](https://duffel.com)
## Prerequisites
- `DUFFEL_API_KEY_LIVE` environment variable set with a live API token
- Token needs `air.offer_requests.create` permission
## API Basics
- **Base URL:** `https://api.duffel.com`View the complete source on GitHubfallback-and-resilience
When your agent uses it
What to do when a tool fails, an API hits a rate limit, or a site blocks scraping. Maps every primary tool to its best fallback so a single failure doesn't block the search.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
1,538 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- General Rules
- Never Claim MCP Is Unavailable Without Calling It
- IP Allowlist Errors (Common First-Time Failure)
- "No Cached Availability" Is Not the Final Word
- Patchright-Based Skills (Southwest, AA, Chase, Amex, TaW)
- Docker Image Failures
Files
SKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytes
Read SKILL.md
# Fallback and Resilience
Tools go down. APIs break. Have a backup plan for every search.
| Primary Tool | When It Fails | Fallback |
|-------------|---------------|----------|
| Duffel | API error or timeout | Ignav, Google Flights skill, Skiplagged |
| Ignav | API error | Duffel, Google Flights skill, Skiplagged |
| Google Flights | agent-browser error | Duffel, Ignav, Skiplagged |
| Skiplagged | 502/timeout (Cloudflare issues) | Kiwi.com MCP, Duffel, Ignav |
| Kiwi.com | Server error | Skiplagged MCP, Duffel |
| Seats.aero | API error or stale data | Check airline website directly, use Duffel for GDS inventory |
| Southwest | SW rate limiting or bot detection | Wait a few minutes and retry. Use Docker (`ghcr.io/borski/sw-fares`) if running locally fails. Google Flights skill for SW cash prices as a fast fallback. |
| SerpAPI | Rate limit (100/mo free) | Trivago for hotels, web search for destination discovery |View the complete source on GitHubflight-search-strategy
When your agent uses it
Canonical multi-source flight search strategy. Source priority (Duffel, Ignav, Google Flights, Skiplagged, Kiwi, Seats.aero, Southwest), parallel workflow, market selection for international price arbitrage.
What it loads into context
Frontmatter
94 tokensAlways available to the agent
SKILL.md
1,616 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Search ALL Sources for EVERY Flight Search
- The Standard Flight Search Workflow
- Round Trip vs One-Way Construction
- For Southwest Specifically
- Monitoring Existing Southwest Reservations
- Market Selection Strategy
- Source Accuracy Hierarchy
- Common Failure Modes
Files
SKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytesSKILL.mdcore7,007 bytes
Read SKILL.md
# Flight Search Strategy
## Search ALL Sources for EVERY Flight Search
This is not a pick-one list. Each source returns different results, different prices, and different airlines. Missing a source means missing options. The priority order determines which price to trust when sources disagree, not which sources to skip.
| Priority | Source | Strengths | Blind Spots |
|----------|--------|-----------|-------------|
| 1 | **Duffel** (skill) | Most accurate cash prices. Real GDS per-fare-class data. Bookable. | No Southwest. No award pricing. Offers expire in 15-30 min. |
| 2 | **Ignav** (skill) | Fast REST API. Market selection for price arbitrage. Free. | No Southwest. No award pricing. |
| 3 | **Google Flights** (skill, agent-browser) | Covers ALL airlines including Southwest cash prices. Free. Economy/business comparison. | Prices can be inflated vs GDS. No points pricing. |
| 4 | **Skiplagged** (MCP) | Hidden city fares. Zero config. | No Southwest. Can be noisy on small markets. |
| 5 | **Kiwi.com** (MCP) | Virtual interlining (creative cross-airline routings). Zero config. | Returns garbage on small markets. No Southwest. |
| 6 | **Seats.aero** (skill) | Award flight availability across 25+ programs. The crown jewel for points. | Cached data, not live. No cash prices. No Southwest. |View the complete source on GitHubgardening
When your agent uses it
Audit and tend to existing travel reservations. Reads a user-provided reservations file, then systematically checks every booking for price drops, better cabin availability, improved routings, schedule changes, nearby airport alternatives, and award repricing opportunities. Invoke proactively on a regular cadence or when the user says "garden", "check my bookings", "audit reservations", "price drop", "better routing", "did my flight change", "tend reservations", "reservation maintenance", or "check my trips".
What it loads into context
Frontmatter
136 tokensAlways available to the agent
SKILL.md
2,181 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Reservations File
- Gardening Checklist
- Output Format
- When to Garden
- Tools to Use
- AwardWallet Integration
Files
SKILL.mdcore8,841 bytes
Read SKILL.md
# Reservation Gardening
**Concept:** "Gardening" (coined by Nicholas Kralev, popularized by View from the Wing) means regularly tending to your travel reservations — catching problems early and spotting opportunities to upgrade, rebook, or save money.
## Reservations File
The user points this skill at a file containing their current bookings. The file path is provided when invoking the skill (e.g., `~/trips/reservations.json` or `~/trips/reservations.yaml`).
**If no file path is provided, ask the user for it.**
### Expected File Format
The file should contain an array of reservations. Each reservation should include as much of the following as possible:
View the complete source on GitHubgetting-started
When your agent uses it
First-run setup. Detects configured API keys, points to the local setup-keys script for secure key entry, and shows sample prompts scaled to available tools.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
2,049 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Step 1: Detect what's already configured
- Step 2: Tell the user where they stand
- Step 3: Point the user at the local setup script
- Step 4: Show sample prompts
- Don't do this
- Tone
- Edge cases
Scripts executed separately
../../../../scripts/setup-keys.ps1../../../../scripts/setup-keys.sh../../../../scripts/setup-keys.sh../../../../scripts/setup-keys.sh../../../../scripts/setup-keys.sh../../../../scripts/setup-keys.sh
Files
SKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytesSKILL.mdcore7,864 bytes../../../../scripts/setup-keys.ps1runs6,610 bytes../../../../scripts/setup-keys.shruns7,177 bytes../../../../scripts/setup-keys.shruns7,177 bytes../../../../scripts/setup-keys.shruns7,177 bytes../../../../scripts/setup-keys.shruns7,177 bytes../../../../scripts/setup-keys.shruns7,177 bytes
Read SKILL.md
# Getting Started Skill
The user invoked this skill explicitly. Help them figure out what's already working, what they're missing, and what to actually try. Critically: **do NOT prompt for API keys in chat.** Pasting a key into a chat input puts it in terminal scrollback, the local Claude Code session log, and the Anthropic API logs. The toolkit ships a local script that prompts for keys with masked input and writes them straight to the user's shell rc, never going through chat.
## Step 1: Detect what's already configured
First detect the user's platform via the Bash tool's environment. If `bash` is available (macOS, Linux, WSL, Git Bash on Windows), use the bash detection. If you're on native Windows PowerShell with no bash, use the PowerShell detection instead.
Don't print the values; only report SET vs MISSING.
### Bash / Zsh (macOS / Linux / WSL / Git Bash)
Use `printenv` so the loop works in both bash and zsh (Claude Code's bash tool may use either):
View the complete source on GitHubgoogle-flights
When your agent uses it
Browser-automated Google Flights search via agent-browser. All airlines including Southwest. Cash prices, schedules, economy/business comparison, market selection.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
1,706 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Session Convention
- Fast Path: URL-Based Search (Preferred)
- Market Selection Strategy
- Booking Options Handoff
- Output Format
- Interactive Workflow (Fallback)
- Key Rules
- Troubleshooting
Files
SKILL.mdcore6,551 bytesSKILL.mdcore6,551 bytesSKILL.mdcore6,551 bytesSKILL.mdcore6,551 bytesSKILL.mdcore6,551 bytes
Read SKILL.md
# Google Flights Search
Search Google Flights via agent-browser to find flight prices, schedules, and availability.
## Prerequisites
Requires `agent-browser` CLI:
```bash
npm install -g agent-browser && agent-browser install
```
## When to Use
- User asks to search/find/compare flights or airfareView the complete source on GitHubhotel-chains
When your agent uses it
Maps hotel brand names (Westin, Sheraton, Holiday Inn, etc.) to chain families and loyalty programs. Use when hotel results contain branded properties or deciding whether to check award rates.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
609 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The Trigger Table
- Always Compare Points vs Cash for Hotels
- Booking Windows for Hotels
Files
SKILL.mdcore2,410 bytes
Read SKILL.md
# Hotel Chain Recognition
**Reference data:** `data/hotel-chains.json`
Use the `quick_lookup` section in the data file to instantly identify which loyalty program a hotel belongs to when it appears in search results. When you see "Westin" you need to know that's Marriott Bonvoy. When you see "The Standard" you need to know that's Hyatt.
## The Trigger Table
When results contain properties from ANY of these chains, IMMEDIATELY pull AwardWallet balances and check award rates. No judgment call. No asking. Just do it.
| Chain Family | Properties Include | Loyalty Program |
|---|---|---|
| IHG | Holiday Inn, InterContinental, Crowne Plaza, Kimpton, Staybridge, Candlewood | IHG One Rewards |
| Marriott | Marriott, Sheraton, Westin, W, Ritz-Carlton, St. Regis, Courtyard, Aloft | Marriott Bonvoy |View the complete source on GitHubignav
When your agent uses it
Fast REST API flight search via ignav.com. Cash prices, booking links, market selection for price arbitrage. Include in every flight search alongside Duffel and other sources.
What it loads into context
Frontmatter
78 tokensAlways available to the agent
SKILL.md
1,141 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Setup
- Workflow
- Endpoints
- Parameters
- Response Structure
- Output Format
- Notes
Files
SKILL.mdcore3,953 bytesSKILL.mdcore3,953 bytesSKILL.mdcore3,953 bytesSKILL.mdcore3,953 bytesSKILL.mdcore3,953 bytes
Read SKILL.md
# Flight Search via Ignav API
Fast REST API flight search at `https://ignav.com`. Returns structured JSON with prices, itineraries, and booking links. 1,000 free requests, no rate limit.
## Setup
Get a free API key at https://ignav.com/signup (1,000 requests, no credit card).
Set `IGNAV_API_KEY` in your environment or `.env` file.
## Workflow
1. Parse the user's request (origin, destination, dates, trip type, passengers, cabin)
2. Look up airport codes if user gave city namesView the complete source on GitHublessons-learned
When your agent uses it
Mandatory pre-flight-search reference. Contains the Seats.aero workflow (pull ALL programs first), source accuracy hierarchy, Southwest/Companion Pass specifics, small-market caveats, and Duffel limitations.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
1,957 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Seats.aero: Search ALL Sources, Show ALL Results
- Never Trust Data Files Over Reality
- Source Accuracy Hierarchy
- Southwest Is Special
- Companion Pass CPP Math
- Small Market Airports
- Layover and Time Preferences
- Duffel Limitations
- Related Reference Skills (Load When Relevant)
Files
SKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytesSKILL.mdcore8,797 bytes
Read SKILL.md
# Lessons Learned
Hard-won knowledge from actual searches. Reference these before making the same mistakes.
## Seats.aero: Search ALL Sources, Show ALL Results
When searching Seats.aero, **NEVER filter by source on the initial search.** Always pull ALL programs first.
### The Mandatory Workflow
For any route:
1. **Search Seats.aero with NO source filter.** Pull ALL programs. Show full results sorted by cheapest.
2. **For EVERY program in results, trace the full reachability chain:**View the complete source on GitHubpartner-awards
When your agent uses it
Loyalty program airline ticketing partnerships (alliance + bilateral). Cross-references credit card currencies to booking programs for award reachability checks.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
861 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Cross-Alliance Bookings Are Where the Real Value Hides
- Verification Is Mandatory, Not Optional
- Reachability Workflow
- Common Failure Modes
- See Also
Files
SKILL.mdcore4,012 bytes
Read SKILL.md
# Partner Awards
**Reference data:** `data/partner-awards.json`
When recommending award bookings, check this file to verify:
1. The booking program can actually ticket the airline you're recommending
2. Whether the partnership is alliance-based or bilateral
3. Cross-alliance highlights (VA→ANA, Etihad→AA, Alaska→Starlux, etc.)
4. Which credit card currencies can reach the booking program
## Cross-Alliance Bookings Are Where the Real Value Hides
The best redemptions often involve booking an airline through a program in a DIFFERENT alliance (or no alliance at all). Always check the `cross_alliance_highlights` section.
View the complete source on GitHubplan-trip
When your agent uses it
Guided trip planning workflow. Asks destination, dates, travelers, class, and flexibility, then runs parallel flight/hotel search with cpp math and booking plan.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
1,050 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- How to run this
- The workflow
- Hotels and ground transit
- Output style
- Don't do this
Files
SKILL.mdcore4,595 bytesSKILL.mdcore4,595 bytes
Read SKILL.md
# Plan Trip Skill
The user invoked this skill explicitly. Run a guided trip planning workflow that produces a concrete, opinionated recommendation with cents-per-point math, transfer paths, and a booking plan.
## How to run this
If the user already gave details in their prompt arguments, use those. Otherwise, ask in this order, one question at a time. Don't fire all the questions at once.
1. **Where?** Destination(s). Accept regions ("Scandinavia"), cities ("Tokyo"), or specific airports.
2. **When?** Departure month or date range. Note flexibility: "exact dates" vs "any week in March" matters a lot for award availability.
3. **Who?** Number of travelers, ages if children/infants. The toolkit supports infant pricing and seat configurations.
4. **What class?** Economy / premium economy / business / first. Default to economy if unstated.
5. **Trip length?** Number of nights at destination if applicable.
6. **Points or cash?** Three valid answers: "best of both" (default), "points only" (treat cash as last resort), "cash only" (skip award search).View the complete source on GitHubpoints-valuations
When your agent uses it
Cents-per-point (cpp) valuations across major loyalty programs from four publications. Floor/ceiling rules for deciding if a redemption is good or exceptional.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
1,854 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Decision Rules
- The Points-vs-Cash Decision Sequence
- Staleness Check
- How to Compute CPP Correctly
- Surcharge-Heavy Programs (Watch Out)
- Surcharge-Light Programs (Use These)
- Transfer Bonuses Change Everything
- Portal Rates Are Dynamic
- Transfer Partners Often Beat the Portal
- Opportunity Cost
- Status Affects the Real Cost of a Flight
- Multi-Stop Itinerary CPP Benchmarks
Files
SKILL.mdcore7,974 bytesSKILL.mdcore7,974 bytes
Read SKILL.md
# Points Valuations
**Reference data:** `data/points-valuations.json`
Four sources are aggregated:
- **The Points Guy (TPG):** optimistic, has affiliate incentive to inflate
- **Upgraded Points:** moderate
- **One Mile at a Time (OMAAT):** conservative
- **View From The Wing (VFTW):** most conservative and theoretically rigorous
Each entry has:
- `floor` — conservative minimum (use this for decision-making)
- `ceiling` — optimistic maximum
- `sources` — individual values from each publicationView the complete source on GitHubpremium-hotels
When your agent uses it
Search Amex FHR/THC and Chase Edit hotels by city. Compare credits, benefits, and find stacking opportunities across card programs.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
2,583 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Programs
- Chase Sapphire Reserve Hotel Credits (2026)
- Amex Platinum Hotel Credit Mechanics (FHR or THC)
- Searching by City
- Combined Search (Recommended Workflow)
- Output Format
- Data Sources
- Notes
Files
SKILL.mdcore9,470 bytesSKILL.mdcore9,470 bytesSKILL.mdcore9,470 bytesSKILL.mdcore9,470 bytes
Read SKILL.md
# Premium Hotel Programs
Search 4,659 premium hotel properties across three credit card programs. Find which hotels offer complimentary benefits, compare credits, and identify stacking opportunities where a hotel appears in multiple programs.
**No API key needed.** All data is local JSON files in `data/`.
## When to Use
- User asks "what FHR hotels are in Stockholm?"
- Comparing hotel options for a trip and want to maximize card benefits
- Looking for hotels where Amex FHR + Chase Edit credits stack
- Checking if a specific hotel is in any premium program
## ProgramsView the complete source on GitHubrapidapi
When your agent uses it
Google Flights Live and Booking.com Live search via RapidAPI. Secondary source for cash flight prices and hotel availability when SerpAPI needs a second opinion.
What it loads into context
Frontmatter
57 tokensAlways available to the agent
SKILL.md
1,204 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Authentication
- Google Flights Live API
- Booking.com Live API
- Rate Limits
- When to Use
Files
SKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytesSKILL.mdcore4,027 bytes
Read SKILL.md
# RapidAPI Skill
Search Google Flights and Booking.com via RapidAPI scrapers. Secondary source for cash flight prices and hotel/vacation rental pricing.
**Sources:**
- [Google Flights Live API on RapidAPI](https://rapidapi.com/apiheya/api/google-flights-live-api)
- [Booking.com Live API on RapidAPI](https://rapidapi.com/apiheya/api/booking-live-api)
## Authentication
`RAPIDAPI_KEY` is set in `.env`. All requests use `x-rapidapi-key` header.
## Google Flights Live API
View the complete source on GitHubround-the-world
When your agent uses it
Round-the-world, Circle Pacific, and distance-based award products across alliances. Covers Star Alliance RTW, oneworld Explorer, Lufthansa M&M, Qantas, Cathay, JAL, Aeroplan, and Iberia charts.
What it loads into context
Frontmatter
86 tokensAlways available to the agent
SKILL.md
4,904 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Decision Tree
- Active Products
- Discontinued Products (reference)
- Distance Calculation
- Key Decision Rules
- Cross-References
- Source Hierarchy
Scripts executed separately
../../../../scripts/calc_distance.py
Files
SKILL.mdcore17,322 bytesSKILL.mdcore17,322 bytesSKILL.mdcore17,322 bytes../../../../scripts/calc_distance.pyruns5,588 bytes
Read SKILL.md
# Round the World, Circle Pacific, and Distance-Based Awards
The RTW universe is collapsing. Four programs ended in the last 18 months: ANA Star RTW (June 2025), Singapore KrisFlyer Star RTW (May 2024), SkyTeam Go Round (2024-25), Singapore KrisFlyer Pacific Circle (likely 2024-25). What's left is concentrated in Star Alliance, oneworld, and a few regional distance-based programs.
This skill provides:
- Comprehensive coverage of every active RTW and Circle product
- Historical charts for discontinued programs (so the agent doesn't get fooled by stale blog posts)
- Distance-based regional alternatives that often beat RTW pricing for shorter trips
- Decision rules for picking the right product
**Data file:** `data/rtw-awards.json`. Contains 17 programs with confidence markers (VERIFIED / LIKELY) and primary-source citations.
**Distance helper:** `scripts/calc_distance.py` (haversine, supports cumulative multi-segment routes, with built-in distance-band lookups for Star Alliance / Qantas / oneworld Global Explorer).
## Quick Decision TreeView the complete source on GitHubscandinavia-transit
When your agent uses it
Search trains, buses, and ferries in Norway (Entur), Sweden (ResRobot), and Denmark (Rejseplanen). Intra-Scandinavia ground transport with schedules and Danish fare pricing.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
5,387 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Norway: Entur (Journey Planner v3)
- Sweden: ResRobot v2.1
- Denmark: Rejseplanen API 2.0
- Cross-Border Routes
- When to Use
- Search Workflows
Files
SKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytes
Read SKILL.md
# Scandinavia Transit Skill
Search ground transport (trains, buses, ferries) within Norway, Sweden, and Denmark using their national transit APIs.
**Sources:**
- [Entur (Norway)](https://developer.entur.org) — Open GraphQL API for all Norwegian transit
- [ResRobot (Sweden)](https://www.trafiklab.se/api/trafiklab-apis/resrobot-v21/) — REST API via Trafiklab for all Swedish transit
- [Rejseplanen (Denmark)](https://labs.rejseplanen.dk) — REST API (HAFAS) for all Danish transit including pricing
## Norway: Entur (Journey Planner v3)
Open GraphQL API. No key needed (but a client name header is required). Covers ALL Norwegian transit: Vy trains, buses, ferries, trams, metro. 60+ operators.
### Trip Search (Oslo to Bergen example)View the complete source on GitHubseatmaps
When your agent uses it
Aircraft seat maps, cabin dimensions, and seat recommendations via SeatMaps.com and AeroLOPA. Search by flight number or airline+aircraft via agent-browser.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
2,117 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- When NOT to Use
- Two Sources, Different Strengths
- Search by Flight Number (Primary Workflow)
- Direct URL Search (Fast Path)
- AeroLOPA Links
- Output Format
- Seat Map Key (Color Coding)
- Notes
Files
SKILL.mdcore8,458 bytesSKILL.mdcore8,458 bytesSKILL.mdcore8,458 bytesSKILL.mdcore8,458 bytesSKILL.mdcore8,458 bytesSKILL.mdcore8,458 bytes
Read SKILL.md
# Seat Maps
Look up aircraft seat maps, cabin dimensions (pitch, width, recline), seat recommendations, and flight reviews. Uses [SeatMaps.com](https://seatmaps.com) (browser automation) as the primary data source and [AeroLOPA](https://www.aerolopa.com/) as a visual complement.
**Requires `agent-browser` CLI.** Install: `npm install -g agent-browser && agent-browser install`
## When to Use
- User wants to know the best seats on a specific flight
- Comparing cabin configurations across aircraft variants
- Checking seat pitch, width, recline for a cabin class
- Identifying seats near galleys, lavatories, or exits
- Verifying which aircraft variant operates a specific route
- Looking up seat map ratings and flight reviewsView the complete source on GitHubseats-aero
When your agent uses it
Search award flight availability across 27 mileage programs via Seats.aero Partner API. Find cheapest award flights, compare programs, and get booking links.
What it loads into context
Frontmatter
64 tokensAlways available to the agent
SKILL.md
5,357 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Authentication
- API Base
- Key Concepts
- Mileage Program Sources
- Cached Search (Primary Endpoint)
- Get Trip Details
- Bulk Availability
- Get Routes
- Live Search
- Pagination
- Useful jq Filters
- Workflow: Trip Planning Search
- Layover Quality Filter
- Why Results May Be Empty
- Specialized Tools (Web UI Only)
- Alert Features
- Third-Party Integrations
- Notes
Files
SKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytesSKILL.mdcore20,823 bytes
Read SKILL.md
# Seats.aero Skill
Search cached and live award flight availability across 27 mileage programs (including Spirit Free Spirit and Frontier Miles, added April 2026). Find the cheapest award flights, compare programs, and get booking links.
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero)
## Authentication
Set `SEATS_AERO_API_KEY` in your `.env` file. Get from [Settings > API tab](https://seats.aero/settings) (Pro account required).
All requests use the `Partner-Authorization` header. Pro users get **1,000 API calls per day** for non-commercial use.
## API Base
View the complete source on GitHubserpapi
When your agent uses it
Google Flights cash prices, Google Hotels, and Google Travel Explore via SerpAPI. Use for award-vs-cash comparison, hotel search, and destination discovery.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
2,321 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Authentication
- API Base
- Google Flights (Cash Prices)
- Google Hotels
- Google Travel Explore
- Workflow: Compare Award vs Cash
- Notes
Files
SKILL.mdcore7,691 bytesSKILL.mdcore7,691 bytesSKILL.mdcore7,691 bytesSKILL.mdcore7,691 bytesSKILL.mdcore7,691 bytes
Read SKILL.md
# SerpAPI Skill
Scrape Google Flights, Google Hotels, and Google Travel Explore via SerpAPI. Provides cash flight prices (for Chase/Amex portal comparison), hotel pricing, and destination discovery.
**Source:** [serpapi.com](https://serpapi.com) — Free tier available, paid plans for higher volume.
## Authentication
`SERPAPI_API_KEY` is set in `.env`. All requests use `api_key` query parameter.
## API Base
```
https://serpapi.com/searchView the complete source on GitHubsouthwest
When your agent uses it
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.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
3,853 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Southwest Fare Classes
- Companion Pass CPP Formula
- Search: Use the Script
- How the Script Works
- Output Format
- Troubleshooting
- Limitations
- Change Flight Price Monitor (check_change.py)
- Fare Drop Monitor (monitor.py)
Scripts executed separately
Dockerfilescripts/check_change.pyscripts/entrypoint.shscripts/monitor.pyscripts/search_fares.py
Files
Dockerfileruns243 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesSKILL.mdcore15,344 bytesscripts/check_change.pyruns40,733 bytesscripts/entrypoint.shruns793 bytesscripts/monitor.pyruns12,525 bytesscripts/search_fares.pyruns8,312 bytes
Read SKILL.md
# 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)View the complete source on GitHubstatus-match
When your agent uses it
Status match and status challenge rules for airlines and hotels. Covers free direct matches, paid concierge via statusmatch.com with fees, card-granted status, and critical lifetime/once-per-N-years restrictions that make wasted matches expensive.
What it loads into context
Frontmatter
98 tokensAlways available to the agent
SKILL.md
3,272 tokensWhen the skill is activated
Reference documents
21,596 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Critical Rule: Lifetime Restrictions Punish Wasted Matches
- When to Use This Skill
- When NOT to Use
- The Three Paths to Elite Status
- Workflow
- Output Format
- Useful jq Queries
- Important Caveats
- Cross-References
- Source Hierarchy (Per Research Integrity Protocol)
Files
../alliances/SKILL.mddoc2,420 bytes../award-holds/SKILL.mddoc9,753 bytes../booking-guidance/SKILL.mddoc8,591 bytes../compare-flights/SKILL.mddoc11,988 bytes../partner-awards/SKILL.mddoc4,012 bytes../points-valuations/SKILL.mddoc7,974 bytes../seats-aero/SKILL.mddoc20,823 bytesSKILL.mdcore14,246 bytesSKILL.mdcore14,246 bytesSKILL.mdcore14,246 bytesSKILL.mdcore14,246 bytesSKILL.mdcore14,246 bytes../stopovers/SKILL.mddoc11,361 bytes../trip-calculator/SKILL.mddoc9,832 bytes
Read SKILL.md
# Status Match Reference
When a user wants to switch loyalty programs or shortcut to elite status, the question is rarely "can I match?" but "should I match?" The answer depends on three things this skill makes explicit: how often the program lets you do it, what it costs (free vs paid concierge), and whether a credit card already grants the tier you want.
**Reference data:** [`data/status-match.json`](../../data/status-match.json). Refresh cadence is 90 days because rules change occasionally but not weekly.
## Critical Rule: Lifetime Restrictions Punish Wasted Matches
**Many of the best status matches are once-per-lifetime or once-every-3-years.** A match wasted in the wrong year because the user doesn't have travel coming up is gone forever. Always read the `lifetime_warning` field before recommending an application.
The biggest offenders:
| Program | Restriction |
|---------|-------------|View the complete source on GitHubstopovers
When your agent uses it
Per-program stopover rules for award redemptions. Which programs allow free stopovers, how many, how long, and which don't. Covers Icelandair, Aeroplan, Alaska, Flying Blue, Singapore, Cathay, JAL, and the negative space (BA, AA, Delta).
What it loads into context
Frontmatter
132 tokensAlways available to the agent
SKILL.md
2,768 tokensWhen the skill is activated
Reference documents
16,735 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What Is a Stopover?
- When to Use This Skill
- When NOT to Use
- Quick Reference Table
- The Iceland Callout
- Reading the Data File
- Decision Rules
- Cross-References
- Source Hierarchy (Per Research Integrity Protocol)
- Avoiding Fabrication
Files
../alliances/SKILL.mddoc2,420 bytes../award-holds/SKILL.mddoc9,753 bytes../booking-guidance/SKILL.mddoc8,591 bytes../partner-awards/SKILL.mddoc4,012 bytes../round-the-world/SKILL.mddoc17,322 bytesSKILL.mdcore11,361 bytesSKILL.mdcore11,361 bytesSKILL.mdcore11,361 bytes../transfer-bonuses/SKILL.mddoc10,173 bytes../transfer-partners/SKILL.mddoc12,111 bytes
Read SKILL.md
# Stopover Rules per Loyalty Program
Reference data for which programs allow stopovers on award redemptions, how many, where, for how long, and at what cost. Sourced primarily from each airline's own award rules pages, cross-checked against Frequent Miler, OMAAT, Travel Miles 101, Prince of Travel, and Upgraded Points.
Data lives in [`data/stopovers.json`](../../data/stopovers.json). Refresh cadence is 90 days because stopover rules change rarely (much less often than transfer bonuses or program valuations).
## What Is a Stopover?
A planned interruption of a journey at a point between origin and destination. The IATA standard definition is:
- **More than 24 hours** for international itineraries
- **More than 4 hours** for domestic itineraries (US/Canada)
Each loyalty program defines its own rules within or beyond this baseline. Some programs let you stop for a week. Some let you stop for 365 days. Some don't allow stopovers at all.View the complete source on GitHubsutochno
When your agent uses it
Search Sutochno.ru (СУТОЧНО.РУ), a Russian short-term apartment-rental platform where you book directly from owners and pay in rubles (Mir card / bank transfer). Best for Russian-speaking travellers booking stays in Georgia / the CIS, where Airbnb and Booking have withdrawn or do not accept Russian cards. Sutochno is NOT behind a bot wall — it ships on the toolkit standard patchright-docker base but runs the bundled chromium headless with no Akamai sensor to defeat. Trigger phrases include search Sutochno, суточно, Russian apartment rental, ruble payment, Mir card, Tbilisi apartment, Batumi apartment, Georgia CIS rental.
What it loads into context
Frontmatter
197 tokensAlways available to the agent
SKILL.md
2,301 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Usage
- Selectors (the scrape contract)
- Output
- Tests
- Known fragility
Scripts executed separately
Dockerfilescripts/entrypoint.shscripts/search_sutochno.pytests/test_search_sutochno.py
Files
Dockerfileruns241 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesSKILL.mdcore8,581 bytesscripts/entrypoint.shruns252 bytesscripts/search_sutochno.pyruns14,587 bytestests/test_search_sutochno.pyruns8,267 bytes
Read SKILL.md
# Sutochno Search
Search **Sutochno.ru** (СУТОЧНО.РУ) — a Russian short-term-rental marketplace
where you book apartments, rooms, and houses directly from owners and pay in
**rubles**, typically via **Mir card** or bank transfer. It's the natural fit
for Russian-speaking travellers booking stays in **Georgia / the CIS**, where
Airbnb and Booking have withdrawn or won't take Russian cards. It complements
the Airbnb MCP and the `vrbo` skill: those reach Western inventory, Sutochno
reaches the ruble-priced, owner-direct inventory those platforms miss.
**Sutochno is NOT behind Akamai.** Unlike the `vrbo` skill (which fights an
Akamai bot wall and must run **headed**), Sutochno's server-rendered city pages
load fine **headless** — there is no bot sensor to defeat. This skill still ships
on the toolkit's standard **patchright-docker** base (the same image everyView the complete source on GitHubticketsatwork
When your agent uses it
Search TicketsAtWork (EBG corporate perks) for hotels, theme park tickets, attractions, and rental cars via Patchright. Often beats portals by 10-30%. Use when comparing hotel or ticket prices for a trip.
What it loads into context
Frontmatter
132 tokensAlways available to the agent
SKILL.md
4,306 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why TaW matters for travel hacking
- Capabilities
- Prerequisites
- Authentication
- Docker Usage
- Local Usage (opens a Chrome window briefly)
- Hotels: arguments and output
- Tickets: arguments and output
- Cars: arguments and known limitations
- When to use
- When NOT to use
- Implementation gotchas (for future maintainers)
- Building the Docker image
- Privacy / safety
- Future expansions
Scripts executed separately
Dockerfilescripts/browse_tickets.pyscripts/entrypoint.shscripts/search_cars.pyscripts/search_hotels.pyscripts/taw_common.py
Files
Dockerfileruns279 bytesSKILL.mdcore16,904 bytesSKILL.mdcore16,904 bytesSKILL.mdcore16,904 bytesSKILL.mdcore16,904 bytesSKILL.mdcore16,904 bytesscripts/browse_tickets.pyruns13,018 bytesscripts/entrypoint.shruns956 bytesscripts/search_cars.pyruns19,469 bytesscripts/search_hotels.pyruns12,404 bytesscripts/taw_common.pyruns8,259 bytes
Read SKILL.md
# TicketsAtWork
Scrapes inventory from [ticketsatwork.com](https://www.ticketsatwork.com), a corporate employee perks platform operated by Entertainment Benefits Group (EBG). Members access negotiated rates through their employer's account.
**No public API.** Patchright (undetected Playwright fork) is required because TaW is behind bot protection that blocks `requests`, vanilla Playwright, and headless Chrome.
## Why TaW matters for travel hacking
TaW aggregates inventory from EBG's negotiated wholesale pool (similar inventory feeds as Costco Travel, AAA, etc.). On the same property + dates, TaW often beats:
- The hotel's direct booking
- Booking.com / Hotels.com / Expedia
- Chase Travel (UR portal) and Amex Travel (MR portal)
- Even Amex FHR / THC and Chase Edit on properties not in those programs
View the complete source on GitHubtransfer-bonuses
When your agent uses it
Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
2,500 tokensWhen the skill is activated
Reference documents
23,668 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The Expiry Gate (run this BEFORE citing any bonus)
- When to Use
- When NOT to Use
- Data File
- Refreshing the Data
- Quick Reference Output Format
- Computing Effective Cost
- Cross-References
- Source Hierarchy
- Avoiding Fabrication
Scripts executed separately
../../../../scripts/check-data-freshness.sh../../../../scripts/refresh-transfer-bonuses.py../../../../scripts/refresh-transfer-bonuses.py
Files
../award-holds/SKILL.mddoc9,753 bytes../booking-guidance/SKILL.mddoc8,591 bytes../partner-awards/SKILL.mddoc4,012 bytes../points-valuations/SKILL.mddoc7,974 bytes../round-the-world/SKILL.mddoc17,322 bytes../seats-aero/SKILL.mddoc20,823 bytes../stopovers/SKILL.mddoc11,361 bytesSKILL.mdcore10,173 bytesSKILL.mdcore10,173 bytesSKILL.mdcore10,173 bytesSKILL.mdcore10,173 bytesSKILL.mdcore10,173 bytes../transfer-partners/SKILL.mddoc12,111 bytes../../../../scripts/check-data-freshness.shruns2,258 bytes../../../../scripts/refresh-transfer-bonuses.pyruns20,487 bytes../../../../scripts/refresh-transfer-bonuses.pyruns20,487 bytes
Read SKILL.md
# Transfer Bonuses Skill
Authoritative reference for current credit card transfer bonuses. Reads from `data/transfer-bonuses.json`, which is refreshed weekly by `scripts/refresh-transfer-bonuses.py` (run automatically every Monday via `.github/workflows/refresh-data.yml`, and manually any time). The script scrapes Frequent Miler (canonical) and cross-checks each bonus against AwardWallet. Each active bonus carries a confidence marker (`VERIFIED` if both FM and AwardWallet agree, `LIKELY` if only FM, `UNVERIFIED` if single weak source) per the toolkit's Research Integrity Protocol. TPG is sometimes consulted manually as a sanity check but is NOT scraped programmatically — TPG often shows expired bonuses as active.
## The Expiry Gate (run this BEFORE citing any bonus)
The data file is a snapshot; bonuses commonly end on month-end dates between refreshes. On 2026-07-07 the file listed 7 "active" bonuses of which 5 had ended a week earlier — an agent quoting the file raw would have priced a Chase→Marriott transfer at 1.55x when the real ratio was 1.0. So, mechanically, every time:
1. Get today's date.
2. For each bonus you're about to cite, compare `end_date_inclusive` to today. **Past-dated = expired, regardless of which array it sits in.** Never present an expired bonus as available.
3. If any `active_bonuses` entry is past-dated, or `_meta.last_updated` is more than 7 days old, refresh first: `python3 scripts/refresh-transfer-bonuses.py` (use `--dry-run` to preview). Then re-read the file.
4. If the refresh fails (source layout changed, offline), present the bonus WITH its end date and staleness caveat: "the file shows +30% through 2026-07-14, last verified <date> — confirm on the issuer's transfer page before moving points."
## When to UseView the complete source on GitHubtransfer-partners
When your agent uses it
Credit card to loyalty program transfer ratios. Cross-references seats.aero award prices with transfer ratios to find the cheapest path from UR, MR, TYP, Capital One, or Bilt to any mileage program.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
3,371 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Data Files
- When to Use
- Workflow
- jq Recipes
- Cross-Alliance Optimization
- Transfer Timing Risks
- Notes
Files
SKILL.mdcore12,111 bytesSKILL.mdcore12,111 bytesSKILL.mdcore12,111 bytesSKILL.mdcore12,111 bytesSKILL.mdcore12,111 bytes
Read SKILL.md
# Transfer Partner Optimizer
Given award flight prices (from seats.aero or manual input) and your transferable point balances, find the cheapest path to book.
**No API key needed.** Uses local JSON data files.
## Data Files
| File | Purpose |
|------|---------|
| `data/transfer-partners.json` | Credit card → loyalty program transfer ratios |
| `data/points-valuations.json` | CPP valuations per program (floor/ceiling from TPG, UP, OMAAT, VFTW) |
| `data/partner-awards.json` | Which programs can book which airlines |
View the complete source on GitHubtrip-calculator
When your agent uses it
Cash vs points trip cost comparison. Factors in transfer ratios, taxes, fees, CPP valuations, and opportunity cost to recommend the best redemption strategy for flights and hotels.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
2,563 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Data Files
- When to Use
- Core Concepts
- Workflow
- jq Recipes
- Hotel Comparison
- Chase Travel Portal vs Transfer
- Common Pitfalls
- Notes
Files
SKILL.mdcore9,832 bytesSKILL.mdcore9,832 bytesSKILL.mdcore9,832 bytesSKILL.mdcore9,832 bytesSKILL.mdcore9,832 bytes
Read SKILL.md
# Trip Cost Calculator
"Should I pay cash or use points?" answered with math.
Compares the true cost of booking with cash versus each available points currency, accounting for transfer ratios, taxes/fees, and the opportunity cost of burning your points.
**No API key needed.** Uses local JSON data files plus flight/hotel search results.
## Data Files
| File | Purpose |
|------|---------|
| `data/points-valuations.json` | CPP valuations per program (floor/ceiling) |
| `data/transfer-partners.json` | Credit card → loyalty program transfer ratios |View the complete source on GitHubtrip-log
When your agent uses it
Save flight searches, itineraries, and booked trips to the trips/logs/ directory for future reference. OPT-IN — use when the user asks to log a trip or look up past searches, or on every search only if the user has said they want automatic logging. Also use to update status when a trip is booked or completed.
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
1,149 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- File Naming
- Document Structure
- Status Lifecycle
- Reading Past Trips
- When to Create an Entry
- Notes
Files
SKILL.mdcore4,763 bytesSKILL.mdcore4,763 bytes
Read SKILL.md
# Trip Log Skill
Save and retrieve flight searches, award analyses, and booked itineraries from `trips/logs/`. Past entries are a reference library — pull them when planning connected trips, checking what was already searched, or reviewing what was booked and why.
**This skill is opt-in.** Create entries when the user asks ("log this trip", "save this search"), or automatically only if the user has said they want every search logged. Don't append logging to searches uninvited.
## File Naming
```
trips/logs/YYYY-MM-DD_ORIGIN-DEST_short-label.md
```
- `YYYY-MM-DD` — date the search was run
- `ORIGIN-DEST` — airport codes. Multiple destinations: `SFO-NRT-HND-SFO`View the complete source on GitHubtrip-planner
When your agent uses it
Full trip planning orchestration. Combines flight search, hotel search, and points optimization into one cost analysis. Use when the user says "plan a trip" or wants the complete picture for a destination.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
2,258 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- When NOT to Use
- Workflow
- Error Handling
- Limitations
Files
SKILL.mdcore8,423 bytesSKILL.mdcore8,423 bytes
Read SKILL.md
**Companion reference skills.** Load these for deeper context:
- `flight-search-strategy` — full search workflow and source priority
- `lessons-learned` — Seats.aero workflow and common failure modes (load before any award search)
- `points-valuations` — CPP rules, opportunity cost
- `partner-awards` — reachability through alliance + bilateral partnerships
- `award-sweet-spots` — flag legendary redemptions
- `booking-guidance` — booking flow + phone numbers + the "hold before transfer" rule
- `transfer-bonuses` — live current transfer bonuses (weekly refresh) before recommending any transfer
- `stopovers` — per-program stopover rules; can turn a one-trip plan into a multi-city itinerary at no extra mileage cost
- `award-holds` — per-program hold rules; affects transfer timing decisions
- `round-the-world` — when the trip request implies 3+ stops or multiple regions, RTW products may be cheaper than separate awards
- `status-match` — when a user mentions wanting status or asks about elite tier shortcuts; covers free direct matches, paid concierge fees, and once-per-lifetime warnings
View the complete source on GitHubtripadvisor
When your agent uses it
TripAdvisor Content API for hotel ratings, restaurant search, attraction reviews, rankings, and nearby locations. Use when evaluating hotels or researching destinations. 5K calls/month.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
3,207 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Authentication
- Endpoints
- Common Workflows
- When to Use
- When NOT to Use
- Key Data Points for Hotel Comparison
- Supported Languages
Files
SKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytesSKILL.mdcore11,313 bytes
Read SKILL.md
# TripAdvisor Content API
Search and retrieve hotel, restaurant, and attraction data from TripAdvisor. Ratings, rankings, reviews, photos, amenities, subratings, trip types, awards.
**Base URL:** `https://api.content.tripadvisor.com/api/v1`
**Rate limit:** 50 calls per second.
**Monthly quota:** 5,000 API calls per month. Each curl request = 1 call. A full hotel lookup (search + details + reviews + photos) = 4 calls. Budget accordingly. Prefer search + details (2 calls) and only fetch reviews/photos when specifically needed.
**API limits:** Up to 10 results per search. Up to 5 reviews and 5 photos per location.
## Authentication
View the complete source on GitHubvrbo
When your agent uses it
Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation. VRBO sits behind Akamai Bot Manager so plain HTTP and standard Playwright get a 429 bot wall. Use for whole-home or group stays, multi-bedroom rentals, and Airbnb-vs-VRBO comparisons. Trigger phrases include search VRBO, Vrbo rentals, vacation rental, cabin rental, whole house, condo for the group.
What it loads into context
Frontmatter
149 tokensAlways available to the agent
SKILL.md
1,866 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- When NOT to Use
- Usage
- Output
- Tests
- Known fragility
Scripts executed separately
Dockerfilescripts/entrypoint.shscripts/search_vrbo.pytests/test_search_vrbo.py../../../../scripts/smoke-test.sh
Files
Dockerfileruns229 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesSKILL.mdcore6,948 bytesscripts/entrypoint.shruns207 bytesscripts/search_vrbo.pyruns18,209 bytestests/test_search_vrbo.pyruns7,660 bytes../../../../scripts/smoke-test.shruns17,086 bytes
Read SKILL.md
# VRBO Search
Search VRBO vacation rentals via Patchright and return whole-home / condo / cabin
listings with pricing and booking links. VRBO is the natural complement to the
Airbnb MCP for group and family stays — many mountain-town and resort property
managers cross-list on both, but VRBO carries professionally-managed condos and
cabins that don't always appear on Airbnb.
**Requires Patchright** (undetected Playwright fork). VRBO sits behind **Akamai
Bot Manager** — plain HTTP, standard Playwright, `@playwright/mcp`, and
agent-browser all get a `429 Too Many Requests` ("Provisioned request rate has
been exceeded") bot wall. Patchright passes Akamai's sensor and earns the
`_abck` cookie. This is the same wall — and the same fix — as the chase-travel /
amex-travel / southwest skills.View the complete source on GitHubwheretocredit
When your agent uses it
Mileage earning rates by airline and booking class via wheretocredit.com. Redeemable and qualifying miles across 50+ programs. Use when deciding where to credit a flight or comparing earning rates.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
2,325 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- URL Patterns
- Common IATA Codes
- Common Program Codes
- Reading the Results
- Traveler Profiles
- Decision Algorithm
- Reference Workflows
- Fare Type Mapping
- Important Notes
- When to Use
Files
SKILL.mdcore9,564 bytes
Read SKILL.md
# Where to Credit
Look up mileage earning rates for any airline and booking class across 50+ frequent flyer programs. Covers both **redeemable miles** (the ones you spend) and **qualifying miles** (the ones that count toward elite status).
**Source:** [wheretocredit.com](https://www.wheretocredit.com) — No API key required. Data is scraped via webfetch.
## URL Patterns
All data lives at predictable URLs on wheretocredit.com:
### Airline booking class detail (PRIMARY)
```
https://www.wheretocredit.com/en/{IATA_CODE}/{BOOKING_CLASS}
```View the complete source on GitHubwikipedia-airports
When your agent uses it
Discover destinations served from any airport via Wikipedia. Sanity-check whether an airline flies a specific route, find regional service that fare tools miss, identify late-split-return airport options.
What it loads into context
Frontmatter
97 tokensAlways available to the agent
SKILL.md
1,279 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Best Use Cases
- Workflow
- Decision Rules
- Example: SAN and Southwest to EUG
- Useful Patterns
- Notes
Files
SKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytesSKILL.mdcore5,255 bytes
Read SKILL.md
# Wikipedia Airports
Use Wikipedia as a **route discovery and sanity-check source** for airport destinations. This is especially useful when:
- an airport page has an **Airlines and destinations** section
- an airline's own city-pair marketing pages confirm service patterns
- flight search tools disagree about whether a route exists
Wikipedia is **not a booking source** and not a real-time schedule source. Use it to discover likely routes, then confirm them with airline or fare tools.
## Best Use Cases
- "What destinations does SAN serve?"
- "Does Southwest fly SAN -> EUG?"View the complete source on GitHubSkills included
- alliances
- american-airlines
- amex-travel
- atlas-obscura
- award-calendar
- award-holds
- award-sweet-spots
- awardwallet
- bilt
- booking-guidance
- cabin-codes
- chase-travel
- compare-flights
- compare-hotels
- deutsche-bahn
- duffel
- fallback-and-resilience
- flight-search-strategy
- gardening
- getting-started
- google-flights
- hotel-chains
- ignav
- lessons-learned
- partner-awards
- plan-trip
- points-valuations
- premium-hotels
- rapidapi
- round-the-world
- scandinavia-transit
- seatmaps
- seats-aero
- serpapi
- southwest
- status-match
- stopovers
- sutochno
- ticketsatwork
- transfer-bonuses
- transfer-partners
- trip-calculator
- trip-log
- trip-planner
- tripadvisor
- vrbo
- wheretocredit
- wikipedia-airports
Repository facts
- License
- MIT
- Created
- Mar 21, 2026
- Last pushed
- Nov 6, 2026
- Forks
- 108
- Open issues
- 3
- Project activity
- Active
Rank over the last 12 weeks
Now #967 · best #756 · down 123 in 30 days
- #992 on Nov 2
- #983 on Nov 3
- #978 on Nov 4
- #973 on Nov 5
- #971 on Nov 6
- #967 since Nov 7
56 earlier periods
- #730 on Aug 2
- #778 on Aug 6
- #738 on Aug 8
- #774 on Aug 10
- #772 on Aug 11
- #777 on Aug 13
- #758 on Aug 14
- #733 on Aug 15
- #756 on Aug 16
- #768 on Aug 17
- #772 on Aug 20
- #776 on Aug 21
- #786 on Aug 23
- #819 on Aug 25
- #800 on Aug 26
- #838 on Aug 28
- #768 on Aug 29
- #773 on Aug 30
- #813 on Aug 31
- #814 on Sep 2
- #777 on Sep 5
- #806 on Sep 6
- #825 on Sep 7
- #849 on Sep 8
- #830 on Sep 9
- #809 on Sep 12
- #806 on Sep 13
- #827 on Sep 15
- #843 on Sep 16
- #840 on Sep 17
- #825 on Sep 18
- #802 on Sep 19
- #818 on Sep 20
- #829 on Sep 21
- #855 on Sep 22
- #838 on Sep 23
- #774 on Sep 25
- #787 on Sep 26
- #813 on Sep 27
- #810 on Oct 2
- #827 on Oct 4
- #844 on Oct 5
- #852 on Oct 10
- #857 on Oct 11
- #880 on Oct 12
- #887 on Oct 13
- #901 on Oct 14
- #891 on Oct 15
- #894 on Oct 16
- #860 on Oct 18
- #901 on Oct 19
- #910 on Oct 20
- #929 on Oct 21
- #894 on Oct 22
- #858 on Oct 24
- #999 on Nov 1
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 228 notes
plugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 6 broad permissionsin 5 files: plugins/travel-hacking-toolkit/skills/duffel/SKILL.md:1 bilt/SKILL.md:1 ignav/SKILL.md:1 and 2 more
- 7 dangerous shell commandsin 4 files: tripadvisor/SKILL.md:229 getting-started/SKILL.md:65 scripts/setup-keys.sh:9 and 1 more
- 1,073 network referencesin 44 files: atlas-obscura/package-lock.json:12 deutsche-bahn/package-lock.json:14 plugins/travel-hacking-toolkit/skills/seats-aero/SKILL.md:14 and 41 more
- 2 obfuscation signalsin 1 file: chase-travel/scripts/search_flights.py:704
- No instruction overrides
- 44 executable scriptsin 39 files: scripts/setup-keys.sh:1 scripts/refresh-transfer-bonuses.py:1 american-airlines/Dockerfile:1 and 36 more
- 208 references to secretsin 43 files: plugins/travel-hacking-toolkit/skills/seats-aero/SKILL.md:6 tripadvisor/SKILL.md:6 scandinavia-transit/SKILL.md:6 and 40 more
- No requests to vote in Hot
Show all 1,340 signals by file
.claude-plugin/marketplace.json
- Network accessline 1
{ "$schema": "https://json.schemastore.org/claude-code-marketplace.json", - Network accessline 2
"$schema": "https://json.schemastore.org/claude-code-marketplace.json", - Network accessline 14
"name": "Michael Borohovski" }, "homepage": "https://github.com/borski/travel-hacking-toolkit", - Network accessline 15
}, "homepage": "https://github.com/borski/travel-hacking-toolkit", "repository": "https://github.com/borski/travel-hacking-toolkit", - Network accessline 16
"homepage": "https://github.com/borski/travel-hacking-toolkit", - Network accessline 17
"repository": "https://github.com/borski/travel-hacking-toolkit",
.claude-plugin/plugin.json
- Network accessline 1
{ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", - Network accessline 2
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", - Network accessline 6
"author": { "name": "Michael Borohovski", "url": "https://github.com/borski" - Network accessline 7
"name": "Michael Borohovski", "url": "https://github.com/borski" }, - Network accessline 8
"url": "https://github.com/borski" - Network accessline 9
}, "homepage": "https://github.com/borski/travel-hacking-toolkit", "repository": "https://github.com/borski/travel-hacking-toolkit", - Network accessline 10
"homepage": "https://github.com/borski/travel-hacking-toolkit", - Network accessline 11
"repository": "https://github.com/borski/travel-hacking-toolkit",
plugins/travel-hacking-toolkit/skills/american-airlines/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/american-airlines/SKILL.md
plugins/travel-hacking-toolkit/skills/american-airlines/scripts/check_balance.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Network accessline 419
log("Navigating to aa.com...") page.goto("https://www.aa.com/", wait_until="networkidle", timeout=30000) - Network accessline 420
page.goto("https://www.aa.com/", wait_until="networkidle", timeout=30000) - Network accessline 531
log("Navigating to account summary...") page.goto( "https://www.aa.com/aadvantage-program/profile/account-summary", - Network accessline 532
page.goto( "https://www.aa.com/aadvantage-program/profile/account-summary", wait_until="networkidle", - Network accessline 533
"https://www.aa.com/aadvantage-program/profile/account-summary",
plugins/travel-hacking-toolkit/skills/amex-travel/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md
plugins/travel-hacking-toolkit/skills/amex-travel/scripts/refresh_login.py
plugins/travel-hacking-toolkit/skills/amex-travel/scripts/search_flights.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 43
AMEX_LOGIN_URL = "https://www.americanexpress.com/en-us/account/login" - Network accessline 44
AMEX_TRAVEL_URL = "https://www.americanexpress.com/en-us/travel" - Network accessline 45
AMEX_FLIGHTS_URL = "https://www.americanexpress.com/en-us/travel/flights" - Network accessline 46
AMEX_HOTELS_URL = "https://www.americanexpress.com/en-us/travel/hotels" - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 411
[Credential-related source omitted] - Access to secretsline 412
[Credential-related source omitted] - Access to secretsline 2488
[Credential-related source omitted] - Access to secretsline 2489
[Credential-related source omitted] - Access to secretsline 2495
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/amex-travel/tests/test_search_flights.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/travel-hacking-toolkit/skills/atlas-obscura/SKILL.md
plugins/travel-hacking-toolkit/skills/atlas-obscura/ao.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 3
// Atlas Obscura hidden gem finder // Uses: https://github.com/bartholomej/atlas-obscura-api - Network accessline 4
// Uses: https://github.com/bartholomej/atlas-obscura-api - Network accessline 63
subtitle: p.subtitle, location: p.location || `${p.city || ''}, ${p.country || ''}`.replace(/^, |, $/g, ''), url: p.url?.startsWith('http') ? p.url : `https://www.atlasobscura.com${p.url || ''}`, - Network accessline 64
location: p.location || `${p.city || ''}, ${p.country || ''}`.replace(/^, |, $/g, ''), url: p.url?.startsWith('http') ? p.url : `https://www.atlasobscura.com${p.url || ''}`, coordinates: p.coordinates - Network accessline 65
url: p.url?.startsWith('http') ? p.url : `https://www.atlasobscura.com${p.url || ''}`,
plugins/travel-hacking-toolkit/skills/atlas-obscura/package-lock.json
- Network accessline 12
"node_modules/@keyv/serialize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - Network accessline 13
"version": "1.1.1", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - Network accessline 14
"resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - Network accessline 18
"node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - Network accessline 19
"version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - Network accessline 20
"resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - Network accessline 24
"node_modules/@sindresorhus/is": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - Network accessline 25
"version": "7.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", - Network accessline 26
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - Network accessline 31
}, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 32
"funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } - Network accessline 33
"url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 36
"node_modules/@types/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - Network accessline 37
"version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e - Network accessline 38
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - Network accessline 42
"node_modules/adm-zip": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - Network accessline 43
"version": "0.5.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", - Network accessline 44
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - Network accessline 51
"node_modules/atlas-obscura-api": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/atlas-obscura-api/-/atlas-obscura-api-5.0.3.tgz", - Network accessline 52
"version": "5.0.3", "resolved": "https://registry.npmjs.org/atlas-obscura-api/-/atlas-obscura-api-5.0.3.tgz", "integrity": "sha512-Oh70FJp20Qjld1pSb4bG4Csqt5x9jaEl49WP5eKbm72y1RB+474u7+lwDT9QtTMZ2lYFT7Lyr1L5uqXRmdW/Eg==", - Network accessline 53
"resolved": "https://registry.npmjs.org/atlas-obscura-api/-/atlas-obscura-api-5.0.3.tgz", - Network accessline 64
"node_modules/baseline-browser-mapping": { "version": "2.10.9", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", - Network accessline 65
"version": "2.10.9", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", "integrity": "sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH - Network accessline 66
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", - Network accessline 76
"node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - Network accessline 77
"version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - Network accessline 78
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - Network accessline 82
"node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - Network accessline 83
"version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - Network accessline 84
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - Network accessline 87
{ "type": "opencollective", "url": "https://opencollective.com/browserslist" - Network accessline 88
"type": "opencollective", "url": "https://opencollective.com/browserslist" }, - Network accessline 89
"url": "https://opencollective.com/browserslist" - Network accessline 91
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 92
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, - Network accessline 93
"url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 95
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 96
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 97
"url": "https://github.com/sponsors/ai" - Network accessline 115
"node_modules/byte-counter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", - Network accessline 116
"version": "0.1.0", "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", - Network accessline 117
"resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", - Network accessline 122
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 123
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 124
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 127
"node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - Network accessline 128
"version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - Network accessline 129
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - Network accessline 136
"node_modules/cacheable-request": { "version": "13.0.18", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", - Network accessline 137
"version": "13.0.18", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", - Network accessline 138
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", - Network accessline 154
"node_modules/callsites": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - Network accessline 155
"version": "4.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - Network accessline 156
"resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - Network accessline 161
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 162
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 163
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 166
"node_modules/caniuse-lite": { "version": "1.0.30001780", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", - Network accessline 167
"version": "1.0.30001780", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", - Network accessline 168
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", - Network accessline 171
{ "type": "opencollective", "url": "https://opencollective.com/browserslist" - Network accessline 172
"type": "opencollective", "url": "https://opencollective.com/browserslist" }, - Network accessline 173
"url": "https://opencollective.com/browserslist" - Network accessline 175
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - Network accessline 176
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - Network accessline 177
"url": "https://tidelift.com/funding/github/npm/caniuse-lite" - Network accessline 179
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 180
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 181
"url": "https://github.com/sponsors/ai" - Network accessline 186
"node_modules/css-select": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - Network accessline 187
"version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - Network accessline 188
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - Network accessline 197
}, "funding": { "url": "https://github.com/sponsors/fb55" - Network accessline 198
"funding": { "url": "https://github.com/sponsors/fb55" } - Network accessline 199
"url": "https://github.com/sponsors/fb55" - Network accessline 202
"node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - Network accessline 203
"version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - Network accessline 204
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - Network accessline 209
}, "funding": { "url": "https://github.com/sponsors/fb55" - Network accessline 210
"funding": { "url": "https://github.com/sponsors/fb55" } - Network accessline 211
"url": "https://github.com/sponsors/fb55" - Network accessline 214
"node_modules/decompress-response": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", - Network accessline 215
"version": "10.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", - Network accessline 216
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", - Network accessline 224
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 225
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 226
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 229
"node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - Network accessline 230
"version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - Network accessline 231
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - Network accessline 238
}, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - Network accessline 239
"funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } - Network accessline 240
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - Network accessline 243
"node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - Network accessline 244
"version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - Network accessline 245
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - Network accessline 248
{ "type": "github", "url": "https://github.com/sponsors/fb55" - Network accessline 249
"type": "github", "url": "https://github.com/sponsors/fb55" } - Network accessline 250
"url": "https://github.com/sponsors/fb55" - Network accessline 255
"node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - Network accessline 256
"version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - Network accessline 257
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - Network accessline 265
}, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" - Network accessline 266
"funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } - Network accessline 267
"url": "https://github.com/fb55/domhandler?sponsor=1" - Network accessline 270
"node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - Network accessline 271
"version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - Network accessline 272
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - Network accessline 279
}, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" - Network accessline 280
"funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } - Network accessline 281
"url": "https://github.com/fb55/domutils?sponsor=1" - Network accessline 284
"node_modules/dot-prop": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", - Network accessline 285
"version": "7.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", - Network accessline 286
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", - Network accessline 294
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 295
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 296
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 299
"node_modules/dot-prop/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - Network accessline 300
"version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - Network accessline 301
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - Network accessline 306
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 307
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 308
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 311
"node_modules/electron-to-chromium": { "version": "1.5.321", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", - Network accessline 312
"version": "1.5.321", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ= - Network accessline 313
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", - Network accessline 317
"node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - Network accessline 318
"version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - Network accessline 319
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - Network accessline 324
}, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 325
"funding": { "url": "https://github.com/fb55/entities?sponsor=1" } - Network accessline 326
"url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 329
"node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 330
"version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - Network accessline 331
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 338
"node_modules/form-data-encoder": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", - Network accessline 339
"version": "4.1.0", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", - Network accessline 340
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", - Network accessline 347
"node_modules/generative-bayesian-network": { "version": "2.1.81", "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.81.tgz", - Network accessline 348
"version": "2.1.81", "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.81.tgz", "integrity": "sha512-LrYK+CY5n21p437oahz8jRqTgw0i+S08H+ypag1sgZilfCj33k8Tp8kcFtPiWKsEEJ6niN9gRFP - Network accessline 349
"resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.81.tgz", - Network accessline 357
"node_modules/get-stream": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - Network accessline 358
"version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - Network accessline 359
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - Network accessline 368
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 369
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 370
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 373
"node_modules/got": { "version": "14.6.6", "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", - Network accessline 374
"version": "14.6.6", "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", - Network accessline 375
"resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", - Network accessline 394
}, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" - Network accessline 395
"funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } - Network accessline 396
"url": "https://github.com/sindresorhus/got?sponsor=1" - Network accessline 399
"node_modules/got-scraping": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/got-scraping/-/got-scraping-4.2.1.tgz", - Network accessline 400
"version": "4.2.1", "resolved": "https://registry.npmjs.org/got-scraping/-/got-scraping-4.2.1.tgz", "integrity": "sha512-rhOlO1L4H4Cm31smHJqPtAaXOUrhSKsiTrbZSHKFQW1E/mkTDopnHHpRnXJpqzE0faj+zPsVQnyifIqO+K+cLQ==", - Network accessline 401
"resolved": "https://registry.npmjs.org/got-scraping/-/got-scraping-4.2.1.tgz", - Network accessline 417
"node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - Network accessline 418
"version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - Network accessline 419
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - Network accessline 426
"node_modules/header-generator": { "version": "2.1.81", "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.81.tgz", - Network accessline 427
"version": "2.1.81", "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.81.tgz", "integrity": "sha512-6+27UuqCHFx4xrTWIgcSF/x2WJ+PuVLxziXfPaVLRXi1lXIbTkXO+ffHJefVrdRT5/XEeWfJHrSIE2m1hAdWxw==", - Network accessline 428
"resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.81.tgz", - Network accessline 441
"node_modules/header-generator/node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - Network accessline 442
"version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - Network accessline 443
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - Network accessline 448
}, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 449
"funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } - Network accessline 450
"url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 453
"node_modules/header-generator/node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - Network accessline 454
"version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - Network accessline 455
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - Network accessline 462
"node_modules/header-generator/node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - Network accessline 463
"version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - Network accessline 464
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - Network accessline 472
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 473
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 474
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 477
"node_modules/header-generator/node_modules/ow": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", - Network accessline 478
"version": "0.28.2", "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", - Network accessline 479
"resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", - Network accessline 491
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 492
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 493
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 496
"node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - Network accessline 497
"version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - Network accessline 498
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - Network accessline 502
"node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - Network accessline 503
"version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - Network accessline 504
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - Network accessline 515
"node_modules/http2-wrapper/node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - Network accessline 516
"version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - Network accessline 517
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - Network accessline 522
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 523
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 524
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 527
"node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - Network accessline 528
"version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - Network accessline 529
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - Network accessline 536
"node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - Network accessline 537
"version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - Network accessline 538
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - Network accessline 543
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 544
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 545
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 548
"node_modules/keyv": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - Network accessline 549
"version": "5.6.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - Network accessline 550
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - Network accessline 557
"node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - Network accessline 558
"version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - Network accessline 559
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - Network accessline 564
"node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - Network accessline 565
"version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - Network accessline 566
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - Network accessline 571
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 572
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 573
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 576
"node_modules/mimic-response": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - Network accessline 577
"version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - Network accessline 578
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - Network accessline 583
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 584
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 585
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 588
"node_modules/node-html-parser": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.1.0.tgz", - Network accessline 589
"version": "7.1.0", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.1.0.tgz", "integrity": "sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ==", - Network accessline 590
"resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.1.0.tgz", - Network accessline 598
"node_modules/node-releases": { "version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - Network accessline 599
"version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", - Network accessline 600
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - Network accessline 604
"node_modules/normalize-url": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - Network accessline 605
"version": "8.1.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", - Network accessline 606
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - Network accessline 611
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 612
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 613
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 616
"node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - Network accessline 617
"version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - Network accessline 618
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - Network accessline 623
}, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" - Network accessline 624
"funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } - Network accessline 625
"url": "https://github.com/fb55/nth-check?sponsor=1" - Network accessline 628
"node_modules/ow": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ow/-/ow-1.1.1.tgz", - Network accessline 629
"version": "1.1.1", "resolved": "https://registry.npmjs.org/ow/-/ow-1.1.1.tgz", "integrity": "sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA==", - Network accessline 630
"resolved": "https://registry.npmjs.org/ow/-/ow-1.1.1.tgz", - Network accessline 642
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 643
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 644
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 647
"node_modules/ow/node_modules/@sindresorhus/is": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - Network accessline 648
"version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - Network accessline 649
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - Network accessline 654
}, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 655
"funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } - Network accessline 656
"url": "https://github.com/sindresorhus/is?sponsor=1" - Network accessline 659
"node_modules/p-cancelable": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - Network accessline 660
"version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", - Network accessline 661
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - Network accessline 668
"node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 669
"version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - Network accessline 670
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 674
"node_modules/quick-lru": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.3.0.tgz", - Network accessline 675
"version": "7.3.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.3.0.tgz", "integrity": "sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==", - Network accessline 676
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.3.0.tgz", - Network accessline 681
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 682
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 683
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 686
"node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - Network accessline 687
"version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - Network accessline 688
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - Network accessline 692
"node_modules/responselike": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", - Network accessline 693
"version": "4.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", - Network accessline 694
"resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", - Network accessline 702
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 703
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 704
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 707
"node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - Network accessline 708
"version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - Network accessline 709
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - Network accessline 713
"node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - Network accessline 714
"version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - Network accessline 715
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - Network accessline 720
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 721
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 722
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 725
"node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - Network accessline 726
"version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w= - Network accessline 727
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - Network accessline 730
{ "type": "opencollective", "url": "https://opencollective.com/browserslist" - Network accessline 731
"type": "opencollective", "url": "https://opencollective.com/browserslist" }, - Network accessline 732
"url": "https://opencollective.com/browserslist" - Network accessline 734
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 735
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, - Network accessline 736
"url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 738
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 739
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 740
"url": "https://github.com/sponsors/ai" - Network accessline 755
"node_modules/vali-date": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - Network accessline 756
"version": "1.0.0", "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", - Network accessline 757
"resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
plugins/travel-hacking-toolkit/skills/atlas-obscura/package.json
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/award-calendar/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Network accessline 38
"https://seats.aero/partnerapi/search?origin_airport={ORIGIN}&destination_airport={DEST}&start_date={START}&end_date={END}&cabin={CABIN}"
plugins/travel-hacking-toolkit/skills/awardwallet/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Source:** [business.awardwallet.com](https://business.awardwallet.com) — Requires a Business account. - Network accessline 14
**Source:** [business.awardwallet.com](https://business.awardwallet.com) — Requires a Business account. - Network accessline 18
Set these in your `.env` file: - `AWARDWALLET_API_KEY` — Get from https://business.awardwallet.com/profile/api - Network accessline 18
Set these in your `.env` file: - `AWARDWALLET_API_KEY` — Get from https://business.awardwallet.com/profile/api - Network accessline 19
[Credential-related source omitted] - Network accessline 19
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Network accessline 24
> **First-time setup gotcha:** AwardWallet enforces an IP allowlist on Business API keys. Without your IP whitelisted, every call returns `{"error": "access_denied", "code": "IP_DENIED"}`. **Whitelist before troubleshooting.** > > - **Where - Network accessline 24
> **First-time setup gotcha:** AwardWallet enforces an IP allowlist on Business API keys. Without your IP whitelisted, every call returns `{"error": "access_denied", "code": "IP_DENIED"}`. **Whitelist before troubleshooting.** > > - **Where - Network accessline 25
> > - **Where to whitelist:** https://business.awardwallet.com/profile/api > - **How to find your IP:** `curl ifconfig.me` - Network accessline 25
> > - **Where to whitelist:** https://business.awardwallet.com/profile/api > - **How to find your IP:** `curl ifconfig.me` - Network accessline 26
> - **Where to whitelist:** https://business.awardwallet.com/profile/api > - **How to find your IP:** `curl ifconfig.me` > - **Multi-IP:** home, office, hotspot, VPN exit nodes, and any travel locations each need their own entry. Easiest is - Network accessline 26
> - **Where to whitelist:** https://business.awardwallet.com/profile/api > - **How to find your IP:** `curl ifconfig.me` > - **Multi-IP:** home, office, hotspot, VPN exit nodes, and any travel locations each need their own entry. Easiest is - Network accessline 27
> - **How to find your IP:** `curl ifconfig.me` - Network accessline 27
> - **How to find your IP:** `curl ifconfig.me` - Network accessline 41
https://business.awardwallet.com/api/export/v1 - Network accessline 41
https://business.awardwallet.com/api/export/v1 - Network accessline 47
[Credential-related source omitted] - Network accessline 47
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 48
"https://business.awardwallet.com/api/export/v1/connectedUser/$AWARDWALLET_USER_ID" | jq '.accounts' - Network accessline 48
"https://business.awardwallet.com/api/export/v1/connectedUser/$AWARDWALLET_USER_ID" | jq '.accounts' - Network accessline 69
All filters below assume the curl output is piped in. Replace `...` with the full curl command above. - Network accessline 69
All filters below assume the curl output is piped in. Replace `...` with the full curl command above. - Network accessline 99
[Credential-related source omitted] - Network accessline 99
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Network accessline 100
"https://business.awardwallet.com/api/export/v1/account/{accountId}" | jq '.account[0].history' - Network accessline 100
"https://business.awardwallet.com/api/export/v1/account/{accountId}" | jq '.account[0].history' - Network accessline 108
[Credential-related source omitted] - Network accessline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Network accessline 110
-H "Content-Type: application/json" \ -d '{"start": "2026-01-01", "end": "2027-01-01"}' \ "https://business.awardwallet.com/api/export/v1/travel-timeline/$AWARDWALLET_USER_ID" | jq '.itineraries' - Network accessline 110
-H "Content-Type: application/json" \ -d '{"start": "2026-01-01", "end": "2027-01-01"}' \ "https://business.awardwallet.com/api/export/v1/travel-timeline/$AWARDWALLET_USER_ID" | jq '.itineraries' - Network accessline 112
"https://business.awardwallet.com/api/export/v1/travel-timeline/$AWARDWALLET_USER_ID" | jq '.itineraries' - Network accessline 112
"https://business.awardwallet.com/api/export/v1/travel-timeline/$AWARDWALLET_USER_ID" | jq '.itineraries' - Network accessline 118
[Credential-related source omitted] - Network accessline 118
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Network accessline 119
"https://business.awardwallet.com/api/export/v1/providers/list" | jq '.' - Network accessline 119
"https://business.awardwallet.com/api/export/v1/providers/list" | jq '.'
plugins/travel-hacking-toolkit/skills/bilt/SKILL.md
- Broad permissionsline 1
Bash(curl *), Bash(jq *) - Network accessline 5
[Credential-related source omitted] - Network accessline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 7
allowed-tools: Bash(curl *), Bash(jq *) - Network accessline 12
Search [Bilt Rewards](https://www.bilt.com) travel portal via the public REST API. No authentication required for search. Returns both cash prices in USD and Bilt Points cost for hotels and flights. - Network accessline 16
Bilt's travel search is built directly on top of [Duffel](https://duffel.com). All evidence points to a complete white-label arrangement, not a partial integration: - Network accessline 71
https://api.biltrewards.com/public/travel - Network accessline 81
curl -s "https://api.biltrewards.com/public/travel/hotels/auto-complete?query=New+York" \ - Network accessline 100
curl -s "https://api.biltrewards.com/public/travel/hotels/search" \ - Network accessline 165
curl -s "https://api.biltrewards.com/public/travel/hotels/acc_0000AWPt2s3aNc1GpC5bmU?checkInDate=2026-08-15&checkOutDate=2026-08-18&numGuestAdults=2&numRooms=1" \ - Network accessline 174
# Top 10 cheapest hotels with HaFH flag and CPP rounded to 2 decimals curl -s "$URL" | jq ' - Network accessline 175
curl -s "$URL" | jq ' - Network accessline 185
# Only HaFH properties (worth $300+ benefits if Gold/Platinum) curl -s "$URL" | jq ' - Network accessline 186
curl -s "$URL" | jq ' - Network accessline 198
curl -s "https://api.biltrewards.com/public/travel/flights/search" \ - Network accessline 224
curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID" - Network accessline 230
# Polling loop for i in 1 2 3 4 5; do RESP=$(curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID") - Network accessline 231
for i in 1 2 3 4 5; do RESP=$(curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID") REMAINING=$(echo "$RESP" | jq -r '.data.remainingBatches') - Network accessline 232
RESP=$(curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID")
plugins/travel-hacking-toolkit/skills/chase-travel/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/chase-travel/SKILL.md
plugins/travel-hacking-toolkit/skills/chase-travel/scripts/record_search.py
plugins/travel-hacking-toolkit/skills/chase-travel/scripts/search_flights.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 50
SECURE_BASE = "https://secure.chase.com/svc/wr/profile/l4/gateway/chase-travel/loyalty/bank-rewards/cte-app/v1" - Network accessline 51
TRAVEL_BASE = "https://travelsecure.chase.com/api/air/v1.0" - Network accessline 59
base = f"https://ultimaterewardspoints.chase.com/{path}" - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 179
[Credential-related source omitted] - Access to secretsline 482
[Credential-related source omitted] - Network accessline 498
if in_docker: page.goto("https://www.chase.com", timeout=30000) - Network accessline 499
page.goto("https://www.chase.com", timeout=30000) - Network accessline 506
else: page.goto( "https://secure01ea.chase.com/web/auth/#/logon/logon/chaseOnline", - Network accessline 507
page.goto( "https://secure01ea.chase.com/web/auth/#/logon/logon/chaseOnline", timeout=30000, - Network accessline 508
"https://secure01ea.chase.com/web/auth/#/logon/logon/chaseOnline", - Network accessline 578
print("Navigating to UR account selector...", file=sys.stderr) page.goto("https://ultimaterewardspoints.chase.com/account-selector", timeout=30000) - Network accessline 579
page.goto("https://ultimaterewardspoints.chase.com/account-selector", timeout=30000) - Network accessline 607
# Navigate to the travel portal on secure.chase.com (embedded). # API calls must be same-origin with secure.chase.com, so the standalone # ultimaterewardspoints.chase.com portal won't work for fetch() calls. - Network accessline 609
# ultimaterewardspoints.chase.com portal won't work for fetch() calls. - Network accessline 610
dashboard_travel = "https://secure.chase.com/web/auth/dashboard#/dashboard/travel" - Network accessline 642
print(f"Not on portal yet ({url}), retrying via dashboard...", file=sys.stderr) page.goto( "https://secure.chase.com/web/auth/dashboard#/dashboard/travel", - Network accessline 643
page.goto( "https://secure.chase.com/web/auth/dashboard#/dashboard/travel", timeout=30000, - Network accessline 644
"https://secure.chase.com/web/auth/dashboard#/dashboard/travel", - Possible obfuscationline 704
decoded = base64.b64decode(payload_b64).decode("utf-8") - Possible obfuscationline 711
decoded = base64.b64decode(value).decode("utf-8") - Network accessline 871
js = f""" async () => {{ const resp = await fetch("{url}", {{ - Network accessline 872
async () => {{ const resp = await fetch("{url}", {{ method: "{method}", - Network accessline 873
const resp = await fetch("{url}", {{ - Network accessline 884
js = f""" async () => {{ const resp = await fetch("{url}", {{ - Network accessline 885
async () => {{ const resp = await fetch("{url}", {{ method: "{method}", - Network accessline 886
const resp = await fetch("{url}", {{ - Network accessline 1225
results_url = f"https://travelsecure.chase.com/results/flights/outbound?ssid={ssid}&cnx-onprem=false" - Network accessline 2450
encoded_sid = urllib.parse.quote(ssid, safe="") results_url = f"https://travelsecure.chase.com/results/hotels?h.s.sid={encoded_sid}&cnx-onprem=false" - Network accessline 2451
results_url = f"https://travelsecure.chase.com/results/hotels?h.s.sid={encoded_sid}&cnx-onprem=false" - Network accessline 3512
type=int, default=100, help="Max hotels to fetch (default 100, 0=all)", - Network accessline 3513
default=100, help="Max hotels to fetch (default 100, 0=all)", ) - Network accessline 3514
help="Max hotels to fetch (default 100, 0=all)", - Access to secretsline 3534
[Credential-related source omitted] - Access to secretsline 3535
[Credential-related source omitted] - Access to secretsline 3541
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/chase-travel/tests/test_2fa_method.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/travel-hacking-toolkit/skills/compare-flights/SKILL.md
plugins/travel-hacking-toolkit/skills/compare-hotels/SKILL.md
- Access to secretsline 6
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/deutsche-bahn/SKILL.md
- Network accessline 15
**Source:** [db-vendo-client](https://github.com/public-transport/db-vendo-client) — wraps bahn.de's internal APIs.
plugins/travel-hacking-toolkit/skills/deutsche-bahn/package-lock.json
- Network accessline 14
"node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - Network accessline 15
"version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - Network accessline 16
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - Network accessline 22
"node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 23
"version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuM - Network accessline 24
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 34
"node_modules/call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 35
"version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - Network accessline 36
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 44
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 45
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 46
"url": "https://github.com/sponsors/ljharb" - Network accessline 49
"node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - Network accessline 50
"version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - Network accessline 51
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - Network accessline 57
"node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - Network accessline 58
"version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - Network accessline 59
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - Network accessline 65
"node_modules/db-hafas-stations": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/db-hafas-stations/-/db-hafas-stations-2.0.0.tgz", - Network accessline 66
"version": "2.0.0", "resolved": "https://registry.npmjs.org/db-hafas-stations/-/db-hafas-stations-2.0.0.tgz", "integrity": "sha512-GjcqpZhs+HeOvc2dnAJs2Uy3/b8zRNlvTfLCvqFe9J2JYOlQVyuYCjjdsPBTOmJol42sPToPs71wr03kTMVJDw==", - Network accessline 67
"resolved": "https://registry.npmjs.org/db-hafas-stations/-/db-hafas-stations-2.0.0.tgz", - Network accessline 77
"node_modules/db-vendo-client": { "version": "6.10.8", "resolved": "https://registry.npmjs.org/db-vendo-client/-/db-vendo-client-6.10.8.tgz", - Network accessline 78
"version": "6.10.8", "resolved": "https://registry.npmjs.org/db-vendo-client/-/db-vendo-client-6.10.8.tgz", "integrity": "sha512-MrARSEhIhNca2dTBPrAUW5E5TX2plJLfcJTfKcbsCcAXH+glDjNWf2IWb7kJybSxYxELdJAWBR5DYO0+HjC7Og==", - Network accessline 79
"resolved": "https://registry.npmjs.org/db-vendo-client/-/db-vendo-client-6.10.8.tgz", - Network accessline 94
}, "funding": { "url": "https://github.com/sponsors/derhuerst" - Network accessline 95
"funding": { "url": "https://github.com/sponsors/derhuerst" } - Network accessline 96
"url": "https://github.com/sponsors/derhuerst" - Network accessline 99
"node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 100
"version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - Network accessline 101
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 115
"node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 116
"version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - Network accessline 117
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 128
"node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 129
"version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - Network accessline 130
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 136
"node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 137
"version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - Network accessline 138
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 144
"node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - Network accessline 145
"version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - Network accessline 146
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - Network accessline 155
"node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 156
"version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - Network accessline 157
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 158
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 159
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 160
"url": "https://github.com/sponsors/ljharb" - Network accessline 163
"node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 164
"version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - Network accessline 165
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 181
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 182
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 183
"url": "https://github.com/sponsors/ljharb" - Network accessline 186
"node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 187
"version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - Network accessline 188
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 198
"node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 199
"version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - Network accessline 200
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 204
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 205
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 206
"url": "https://github.com/sponsors/ljharb" - Network accessline 209
"node_modules/gps-distance": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/gps-distance/-/gps-distance-0.0.4.tgz", - Network accessline 210
"version": "0.0.4", "resolved": "https://registry.npmjs.org/gps-distance/-/gps-distance-0.0.4.tgz", "integrity": "sha512-A0Y86IZW5xlozayFdF/trgWir9h3b4cU4e36llhTKzp2uDCxdZijA4ZXSYElfTdYd7fSImWVgIR3Zf0b6adrvg==", - Network accessline 211
"resolved": "https://registry.npmjs.org/gps-distance/-/gps-distance-0.0.4.tgz", - Network accessline 218
"node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 219
"version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - Network accessline 220
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 224
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 225
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 226
"url": "https://github.com/sponsors/ljharb" - Network accessline 229
"node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - Network accessline 230
"version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - Network accessline 231
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - Network accessline 240
"node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - Network accessline 241
"version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - Network accessline 242
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - Network accessline 252
"node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - Network accessline 253
"version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - Network accessline 254
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - Network accessline 257
"node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - Network accessline 258
"version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - Network accessline 259
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - Network accessline 262
"node_modules/luxon": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - Network accessline 263
"version": "3.7.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - Network accessline 264
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - Network accessline 270
"node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - Network accessline 271
"version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - Network accessline 272
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - Network accessline 278
"node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - Network accessline 279
"version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - Network accessline 280
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - Network accessline 281
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 282
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 283
"url": "https://github.com/sponsors/ljharb" - Network accessline 286
"node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 287
"version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - Network accessline 288
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 291
"node_modules/ndjson": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - Network accessline 292
"version": "2.0.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", - Network accessline 293
"resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - Network accessline 309
"node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - Network accessline 310
"version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - Network accessline 311
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - Network accessline 328
"node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - Network accessline 329
"version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - Network accessline 330
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - Network accessline 334
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 335
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 336
"url": "https://github.com/sponsors/ljharb" - Network accessline 339
"node_modules/qs": { "version": "6.15.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - Network accessline 340
"version": "6.15.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", - Network accessline 341
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - Network accessline 348
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 349
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 350
"url": "https://github.com/sponsors/ljharb" - Network accessline 353
"node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - Network accessline 354
"version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - Network accessline 355
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - Network accessline 366
"node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - Network accessline 367
"version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - Network accessline 368
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - Network accessline 371
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 372
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 373
"url": "https://github.com/sponsors/feross" - Network accessline 375
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 376
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 377
"url": "https://www.patreon.com/feross" - Network accessline 379
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 380
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 381
"url": "https://feross.org/support" - Network accessline 385
"node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - Network accessline 386
"version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - Network accessline 387
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - Network accessline 398
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 399
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 400
"url": "https://github.com/sponsors/ljharb" - Network accessline 403
"node_modules/side-channel-list": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - Network accessline 404
"version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - Network accessline 405
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - Network accessline 413
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 414
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 415
"url": "https://github.com/sponsors/ljharb" - Network accessline 418
"node_modules/side-channel-map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - Network accessline 419
"version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - Network accessline 420
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - Network accessline 430
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 431
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 432
"url": "https://github.com/sponsors/ljharb" - Network accessline 435
"node_modules/side-channel-weakmap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - Network accessline 436
"version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - Network accessline 437
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - Network accessline 448
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 449
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 450
"url": "https://github.com/sponsors/ljharb" - Network accessline 453
"node_modules/slugg": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/slugg/-/slugg-1.2.1.tgz", - Network accessline 454
"version": "1.2.1", "resolved": "https://registry.npmjs.org/slugg/-/slugg-1.2.1.tgz", "integrity": "sha512-yzUY7d53sdY3wp6rGCc54fn+cel0aNsdG5lvRVN8bvlAXYQI2fIo36AAOVjArOaMzlidHYyAYqriHzuos93h+Q==" - Network accessline 455
"resolved": "https://registry.npmjs.org/slugg/-/slugg-1.2.1.tgz", - Network accessline 458
"node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - Network accessline 459
"version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - Network accessline 460
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - Network accessline 466
"node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - Network accessline 467
"version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - Network accessline 468
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - Network accessline 474
"node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - Network accessline 475
"version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - Network accessline 476
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - Network accessline 482
"node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - Network accessline 483
"version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - Network accessline 484
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - Network accessline 487
"node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - Network accessline 488
"version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - Network accessline 489
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - Network accessline 492
"node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - Network accessline 493
"version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - Network accessline 494
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - Network accessline 495
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", - Network accessline 496
"funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" - Network accessline 497
"https://github.com/sponsors/broofa", - Network accessline 498
"https://github.com/sponsors/ctavan" - Network accessline 504
"node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - Network accessline 505
"version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - Network accessline 506
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - Network accessline 509
"node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - Network accessline 510
"version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - Network accessline 511
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
plugins/travel-hacking-toolkit/skills/deutsche-bahn/package.json
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/deutsche-bahn/scripts/search_trains.mjs
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/duffel/SKILL.md
- Broad permissionsline 1
Bash(curl *) - Broad permissionsline 1
Bash(curl *) - Network accessline 5
[Credential-related source omitted] - Network accessline 5
[Credential-related source omitted] - Network accessline 6
[Credential-related source omitted] - Network accessline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 7
allowed-tools: Bash(curl *) - Network accessline 7
allowed-tools: Bash(curl *) - Network accessline 12
Search for real-time flight offers across airlines via the [Duffel API](https://duffel.com/docs/api). Returns live pricing, cabin details, baggage info, and booking links. Supports one-way, round-trip, and multi-city searches. - Network accessline 12
Search for real-time flight offers across airlines via the [Duffel API](https://duffel.com/docs/api). Returns live pricing, cabin details, baggage info, and booking links. Supports one-way, round-trip, and multi-city searches. - Network accessline 14
**Source:** [duffel.com](https://duffel.com) - Network accessline 14
**Source:** [duffel.com](https://duffel.com) - Network accessline 23
- **Base URL:** `https://api.duffel.com` - Network accessline 23
- **Base URL:** `https://api.duffel.com` - Network accessline 32
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 32
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 55
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 55
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 85
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 85
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 108
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 108
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \ - Network accessline 199
curl -s "https://api.duffel.com/air/offers/$OFFER_ID" \ - Network accessline 199
curl -s "https://api.duffel.com/air/offers/$OFFER_ID" \
plugins/travel-hacking-toolkit/skills/fallback-and-resilience/SKILL.md
- Network accessline 51
| API | Error Signature | Whitelist Page | |---|---|---| | AwardWallet | `{"error": "access_denied", "code": "IP_DENIED"}` | https://business.awardwallet.com/profile/api | - Network accessline 52
|---|---|---| | AwardWallet | `{"error": "access_denied", "code": "IP_DENIED"}` | https://business.awardwallet.com/profile/api | | TripAdvisor | `User is not authorized to access this resource with an explicit deny` | https://www.tripadviso - Network accessline 53
| AwardWallet | `{"error": "access_denied", "code": "IP_DENIED"}` | https://business.awardwallet.com/profile/api | - Network accessline 54
| TripAdvisor | `User is not authorized to access this resource with an explicit deny` | https://www.tripadvisor.com/developers | - Network accessline 58
1. Run `curl ifconfig.me` to get the user's current outbound IP.
plugins/travel-hacking-toolkit/skills/gardening/SKILL.md
- Access to secretsline 6
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/getting-started/SKILL.md
- Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Network accessline 63
> > ```bash > bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 64
> ```bash > bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) > ``` - Dangerous shell operationline 65
> bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 65
> bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 75
> > ```powershell > iwr https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.ps1 -OutFile $env:TEMP\setup-keys.ps1 - Network accessline 76
> ```powershell > iwr https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.ps1 -OutFile $env:TEMP\setup-keys.ps1 > powershell -NoProfile -ExecutionPolicy Bypass -File $env:TEMP\setup-keys.ps1 - Network accessline 77
> iwr https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.ps1 -OutFile $env:TEMP\setup-keys.ps1 - Access to secretsline 89
[Credential-related source omitted] - Network accessline 97
> "If you keep secrets in 1Password, you can use `op run` to resolve them at launch instead of writing to your shell rc. The toolkit has an `.env.example` that uses `op://` references. See https://developer.1password.com/docs/cli/secrets-en - Network accessline 140
- **User uses 1Password:** Mention `op run --env-file=.env -- claude` as the alternative. - **User on Windows asks about WSL/Git Bash:** Tell them to use the macOS/Linux instructions, not the PowerShell ones. The bash script works the same - Network accessline 142
- **User asks "can't you just collect the keys from me directly?"**: Refuse. Explain why (chat logs). Point them at the script. If they really insist, point them at the [README manual setup section](https://github.com/borski/travel-hacking-
plugins/travel-hacking-toolkit/skills/google-flights/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 48
https://www.google.com/travel/flights?q=Flights+from+{ORIGIN}+to+{DEST}+on+{DATE}[+returning+{DATE}][+one+way][+business+class][+N+passengers][&gl=XX] - Network accessline 56
# Launch both in parallel agent-browser --session econ open "https://www.google.com/travel/flights?q=Flights+from+BKK+to+NRT+on+2026-03-20+returning+2026-03-27" & - Network accessline 57
agent-browser --session econ open "https://www.google.com/travel/flights?q=Flights+from+BKK+to+NRT+on+2026-03-20+returning+2026-03-27" & - Network accessline 58
agent-browser --session biz open "https://www.google.com/travel/flights?q=Flights+from+BKK+to+NRT+on+2026-03-20+returning+2026-03-27+business+class" & - Network accessline 79
agent-browser --session flights open "https://www.google.com/travel/flights?q=Flights+from+LAX+to+LHR+on+2026-04-15+one+way"
plugins/travel-hacking-toolkit/skills/ignav/SKILL.md
- Broad permissionsline 1
Bash(curl *) - Network accessline 5
[Credential-related source omitted] - Network accessline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 7
allowed-tools: Bash(curl *) - Network accessline 12
Fast REST API flight search at `https://ignav.com`. Returns structured JSON with prices, itineraries, and booking links. 1,000 free requests, no rate limit. - Network accessline 16
Get a free API key at https://ignav.com/signup (1,000 requests, no credit card). - Access to secretsline 18
[Credential-related source omitted] - Network accessline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Network accessline 55
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Network accessline 71
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/premium-hotels/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 32
Hotels in BOTH FHR/THC AND Chase Edit can stack benefits. Book through one program and use the other card's credits separately. Look for hotels that appear in multiple programs. Use [awardhelper.com/csr-hotels](https://www.awardhelper.com/c - Network accessline 32
Hotels in BOTH FHR/THC AND Chase Edit can stack benefits. Book through one program and use the other card's credits separately. Look for hotels that appear in multiple programs. Use [awardhelper.com/csr-hotels](https://www.awardhelper.com/c - Network accessline 173
**Data source:** 美卡指南 (US Card Guide) Google My Maps, maintained by Scott. To refresh, re-pull the KML files: - FHR/THC: `https://www.google.com/maps/d/kml?mid=1HygPCP9ghtDptTNnpUpd_C507Mq_Fhec&forcekml=1` - Network accessline 173
**Data source:** 美卡指南 (US Card Guide) Google My Maps, maintained by Scott. To refresh, re-pull the KML files: - FHR/THC: `https://www.google.com/maps/d/kml?mid=1HygPCP9ghtDptTNnpUpd_C507Mq_Fhec&forcekml=1` - Network accessline 174
- FHR/THC: `https://www.google.com/maps/d/kml?mid=1HygPCP9ghtDptTNnpUpd_C507Mq_Fhec&forcekml=1` - Network accessline 174
- FHR/THC: `https://www.google.com/maps/d/kml?mid=1HygPCP9ghtDptTNnpUpd_C507Mq_Fhec&forcekml=1` - Network accessline 175
- Chase Edit: `https://www.google.com/maps/d/kml?mid=1Ickidw1Z6ACres9EnbM2CmPObYsuijM&forcekml=1` - Network accessline 175
- Chase Edit: `https://www.google.com/maps/d/kml?mid=1Ickidw1Z6ACres9EnbM2CmPObYsuijM&forcekml=1`
plugins/travel-hacking-toolkit/skills/rapidapi/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Sources:** - [Google Flights Live API on RapidAPI](https://rapidapi.com/apiheya/api/google-flights-live-api) - Network accessline 15
- [Google Flights Live API on RapidAPI](https://rapidapi.com/apiheya/api/google-flights-live-api) - Network accessline 16
- [Booking.com Live API on RapidAPI](https://rapidapi.com/apiheya/api/booking-live-api) - Network accessline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 46
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 82
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Network accessline 106
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/round-the-world/SKILL.md
- Network accessline 94
**Source:** primary `rtw.oneworld.com` for the structure; secondary [Upgraded Points 2026 RTW guide](https://upgradedpoints.com/travel/airlines/best-round-the-world-tickets/) for the specific economy rates above. Business and First class ra - Network accessline 94
**Source:** primary `rtw.oneworld.com` for the structure; secondary [Upgraded Points 2026 RTW guide](https://upgradedpoints.com/travel/airlines/best-round-the-world-tickets/) for the specific economy rates above. Business and First class ra - Network accessline 94
**Source:** primary `rtw.oneworld.com` for the structure; secondary [Upgraded Points 2026 RTW guide](https://upgradedpoints.com/travel/airlines/best-round-the-world-tickets/) for the specific economy rates above. Business and First class ra - Network accessline 94
**Source:** primary `rtw.oneworld.com` for the structure; secondary [Upgraded Points 2026 RTW guide](https://upgradedpoints.com/travel/airlines/best-round-the-world-tickets/) for the specific economy rates above. Business and First class ra
plugins/travel-hacking-toolkit/skills/scandinavia-transit/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Sources:** - [Entur (Norway)](https://developer.entur.org) — Open GraphQL API for all Norwegian transit - Network accessline 15
- [Entur (Norway)](https://developer.entur.org) — Open GraphQL API for all Norwegian transit - Network accessline 16
- [ResRobot (Sweden)](https://www.trafiklab.se/api/trafiklab-apis/resrobot-v21/) — REST API via Trafiklab for all Swedish transit - Network accessline 17
- [Rejseplanen (Denmark)](https://labs.rejseplanen.dk) — REST API (HAFAS) for all Danish transit including pricing - Network accessline 26
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \ - Network accessline 37
curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Oslo%20S&size=3" \ - Network accessline 56
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \ - Network accessline 62
### Notes - GraphQL API. POST only. One endpoint: `https://api.entur.io/journey-planner/v3/graphql` - Set `ET-Client-Name` header on all requests. - Network accessline 63
- GraphQL API. POST only. One endpoint: `https://api.entur.io/journey-planner/v3/graphql` - Set `ET-Client-Name` header on all requests. - No rate limit key, but respectful usage expected. - Network accessline 64
- Set `ET-Client-Name` header on all requests. - No rate limit key, but respectful usage expected. - Schema explorer: https://api.entur.io/graphql-explorer/journey-planner-v3 - Network accessline 65
- No rate limit key, but respectful usage expected. - Schema explorer: https://api.entur.io/graphql-explorer/journey-planner-v3 - Covers some cross-border routes into Sweden via Vy and SJ Nord. - Network accessline 66
- Schema explorer: https://api.entur.io/graphql-explorer/journey-planner-v3 - Network accessline 75
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Network accessline 80
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Network accessline 86
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Network accessline 111
### Notes - REST API. Base: `https://api.resrobot.se/v2.1/` - Network accessline 112
- REST API. Base: `https://api.resrobot.se/v2.1/` - Network accessline 120
Docs: https://labs.rejseplanen.dk (login required). XSD schemas: https://www.rejseplanen.dk/api/xsd - Network accessline 124
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Network accessline 171
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted] - Network accessline 185
[Credential-related source omitted] - Access to secretsline 185
[Credential-related source omitted] - Network accessline 217
[Credential-related source omitted] - Access to secretsline 217
[Credential-related source omitted] - Network accessline 266
[Credential-related source omitted] - Access to secretsline 266
[Credential-related source omitted] - Network accessline 359
[Credential-related source omitted] - Access to secretsline 359
[Credential-related source omitted] - Network accessline 414
# Norway curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Flåm&size=3" \ - Network accessline 415
curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Flåm&size=3" \ - Network accessline 418
# Sweden curl -s "https://api.resrobot.se/v2.1/location.name?input=Malmö&format=json&accessId=$RESROBOT_API_KEY" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]' - Network accessline 419
[Credential-related source omitted] - Access to secretsline 419
[Credential-related source omitted] - Network accessline 421
# Denmark curl -s "https://www.rejseplanen.dk/api/location.name?accessId=$REJSEPLANEN_API_KEY&input=Svendborg&format=json&type=S&lang=en" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]' - Network accessline 422
[Credential-related source omitted] - Access to secretsline 422
[Credential-related source omitted] - Network accessline 430
[Credential-related source omitted] - Access to secretsline 430
[Credential-related source omitted] - Network accessline 436
[Credential-related source omitted] - Access to secretsline 436
[Credential-related source omitted] - Network accessline 444
[Credential-related source omitted] - Access to secretsline 444
[Credential-related source omitted] - Network accessline 454
[Credential-related source omitted] - Access to secretsline 454
[Credential-related source omitted] - Network accessline 460
[Credential-related source omitted] - Access to secretsline 460
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/seatmaps/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 12
Look up aircraft seat maps, cabin dimensions (pitch, width, recline), seat recommendations, and flight reviews. Uses [SeatMaps.com](https://seatmaps.com) (browser automation) as the primary data source and [AeroLOPA](https://www.aerolopa.co - Network accessline 51
agent-browser open "https://seatmaps.com/" - Network accessline 144
https://seatmaps.com/airlines/{iata-code}-{airline-name-slug}/{aircraft-slug}/ - Network accessline 160
https://seatmaps.com/airlines/{iata-code}-{airline-name-slug}/ - Network accessline 170
https://www.aerolopa.com/ - Network accessline 176
For geeky detail (window positions, to-scale layout): https://www.aerolopa.com/
plugins/travel-hacking-toolkit/skills/seats-aero/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero) - Network accessline 14
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero) - Network accessline 14
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero) - Network accessline 14
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero) - Network accessline 14
**Source:** [seats.aero](https://seats.aero) | [API Docs](https://developers.seats.aero) | [Knowledge Base](https://docs.seats.aero) - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Network accessline 25
https://seats.aero/partnerapi - Network accessline 25
https://seats.aero/partnerapi - Network accessline 25
https://seats.aero/partnerapi - Network accessline 25
https://seats.aero/partnerapi - Network accessline 25
https://seats.aero/partnerapi - Network accessline 71
Airlines release award seats at different advance windows (e.g., Aeroplan releases up to 358 days out). Check [seats.aero/tools/releases](https://seats.aero/tools/releases) to see the maximum days out for each airline by program. Useful for - Network accessline 71
Airlines release award seats at different advance windows (e.g., Aeroplan releases up to 358 days out). Check [seats.aero/tools/releases](https://seats.aero/tools/releases) to see the maximum days out for each airline by program. Useful for - Network accessline 71
Airlines release award seats at different advance windows (e.g., Aeroplan releases up to 358 days out). Check [seats.aero/tools/releases](https://seats.aero/tools/releases) to see the maximum days out for each airline by program. Useful for - Network accessline 71
Airlines release award seats at different advance windows (e.g., Aeroplan releases up to 358 days out). Check [seats.aero/tools/releases](https://seats.aero/tools/releases) to see the maximum days out for each airline by program. Useful for - Network accessline 71
Airlines release award seats at different advance windows (e.g., Aeroplan releases up to 358 days out). Check [seats.aero/tools/releases](https://seats.aero/tools/releases) to see the maximum days out for each airline by program. Useful for - Network accessline 119
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 120
"https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.' - Network accessline 120
"https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.' - Network accessline 120
"https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.' - Network accessline 120
"https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.' - Network accessline 120
"https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.' - Network accessline 166
[Credential-related source omitted] - Network accessline 166
[Credential-related source omitted] - Network accessline 166
[Credential-related source omitted] - Network accessline 166
[Credential-related source omitted] - Network accessline 166
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Network accessline 167
"https://seats.aero/partnerapi/trips/{availability_id}" | jq '.' - Network accessline 167
"https://seats.aero/partnerapi/trips/{availability_id}" | jq '.' - Network accessline 167
"https://seats.aero/partnerapi/trips/{availability_id}" | jq '.' - Network accessline 167
"https://seats.aero/partnerapi/trips/{availability_id}" | jq '.' - Network accessline 167
"https://seats.aero/partnerapi/trips/{availability_id}" | jq '.' - Network accessline 222
[Credential-related source omitted] - Network accessline 222
[Credential-related source omitted] - Network accessline 222
[Credential-related source omitted] - Network accessline 222
[Credential-related source omitted] - Network accessline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Network accessline 223
"https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.' - Network accessline 223
"https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.' - Network accessline 223
"https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.' - Network accessline 223
"https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.' - Network accessline 223
"https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.' - Network accessline 246
[Credential-related source omitted] - Network accessline 246
[Credential-related source omitted] - Network accessline 246
[Credential-related source omitted] - Network accessline 246
[Credential-related source omitted] - Network accessline 246
[Credential-related source omitted] - Access to secretsline 246
[Credential-related source omitted] - Access to secretsline 246
[Credential-related source omitted] - Access to secretsline 246
[Credential-related source omitted] - Access to secretsline 246
[Credential-related source omitted] - Access to secretsline 246
[Credential-related source omitted] - Network accessline 247
"https://seats.aero/partnerapi/routes?source=united" | jq '.' - Network accessline 247
"https://seats.aero/partnerapi/routes?source=united" | jq '.' - Network accessline 247
"https://seats.aero/partnerapi/routes?source=united" | jq '.' - Network accessline 247
"https://seats.aero/partnerapi/routes?source=united" | jq '.' - Network accessline 247
"https://seats.aero/partnerapi/routes?source=united" | jq '.' - Network accessline 269
[Credential-related source omitted] - Network accessline 269
[Credential-related source omitted] - Network accessline 269
[Credential-related source omitted] - Network accessline 269
[Credential-related source omitted] - Network accessline 269
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Network accessline 270
-H "Content-Type: application/json" \ -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \ "https://seats.aero/partnerapi/live" | jq '.' - Network accessline 270
-H "Content-Type: application/json" \ -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \ "https://seats.aero/partnerapi/live" | jq '.' - Network accessline 270
-H "Content-Type: application/json" \ -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \ "https://seats.aero/partnerapi/live" | jq '.' - Network accessline 270
-H "Content-Type: application/json" \ -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \ "https://seats.aero/partnerapi/live" | jq '.' - Network accessline 270
-H "Content-Type: application/json" \ -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \ "https://seats.aero/partnerapi/live" | jq '.' - Network accessline 272
"https://seats.aero/partnerapi/live" | jq '.' - Network accessline 272
"https://seats.aero/partnerapi/live" | jq '.' - Network accessline 272
"https://seats.aero/partnerapi/live" | jq '.' - Network accessline 272
"https://seats.aero/partnerapi/live" | jq '.' - Network accessline 272
"https://seats.aero/partnerapi/live" | jq '.' - Network accessline 349
[Credential-related source omitted] - Network accessline 349
[Credential-related source omitted] - Network accessline 349
[Credential-related source omitted] - Network accessline 349
[Credential-related source omitted] - Network accessline 349
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Network accessline 350
"https://seats.aero/partnerapi/trips/{id}" | jq ' - Network accessline 350
"https://seats.aero/partnerapi/trips/{id}" | jq ' - Network accessline 350
"https://seats.aero/partnerapi/trips/{id}" | jq ' - Network accessline 350
"https://seats.aero/partnerapi/trips/{id}" | jq ' - Network accessline 350
"https://seats.aero/partnerapi/trips/{id}" | jq ' - Network accessline 369
2. **Elite/status restrictions.** Some seats only visible to elite members or cardholders. 3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits - Network accessline 369
2. **Elite/status restrictions.** Some seats only visible to elite members or cardholders. 3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits - Network accessline 369
2. **Elite/status restrictions.** Some seats only visible to elite members or cardholders. 3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits - Network accessline 369
2. **Elite/status restrictions.** Some seats only visible to elite members or cardholders. 3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits - Network accessline 369
2. **Elite/status restrictions.** Some seats only visible to elite members or cardholders. 3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits - Network accessline 370
3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https: - Network accessline 370
3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https: - Network accessline 370
3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https: - Network accessline 370
3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https: - Network accessline 370
3. **Route not monitored.** If the route isn't in Get Routes, cached search won't have it. Live search can check any route. 4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https: - Network accessline 371
4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https://seats.aero/tools/releases). - Network accessline 371
4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https://seats.aero/tools/releases). - Network accessline 371
4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https://seats.aero/tools/releases). - Network accessline 371
4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https://seats.aero/tools/releases). - Network accessline 371
4. **Search window limits.** Airlines release awards at different advance windows. Check [release dates tool](https://seats.aero/tools/releases). - Network accessline 378
- **Alaska Upgrade Finder** ([seats.aero/alaska/upgrades](https://seats.aero/alaska/upgrades)): Find confirmable upgrade space for Alaska elites using Atmos Gold Guest Upgrade certificates. Dedicated tool for scanning upgrade availability. - Network accessline 378
- **Alaska Upgrade Finder** ([seats.aero/alaska/upgrades](https://seats.aero/alaska/upgrades)): Find confirmable upgrade space for Alaska elites using Atmos Gold Guest Upgrade certificates. Dedicated tool for scanning upgrade availability. - Network accessline 378
- **Alaska Upgrade Finder** ([seats.aero/alaska/upgrades](https://seats.aero/alaska/upgrades)): Find confirmable upgrade space for Alaska elites using Atmos Gold Guest Upgrade certificates. Dedicated tool for scanning upgrade availability. - Network accessline 378
- **Alaska Upgrade Finder** ([seats.aero/alaska/upgrades](https://seats.aero/alaska/upgrades)): Find confirmable upgrade space for Alaska elites using Atmos Gold Guest Upgrade certificates. Dedicated tool for scanning upgrade availability. - Network accessline 378
- **Alaska Upgrade Finder** ([seats.aero/alaska/upgrades](https://seats.aero/alaska/upgrades)): Find confirmable upgrade space for Alaska elites using Atmos Gold Guest Upgrade certificates. Dedicated tool for scanning upgrade availability. - Network accessline 379
- **Etihad First Class Finder** ([seats.aero/etihad/first](https://seats.aero/etihad/first)): Dedicated tracker for newly available Etihad First Class seats. Etihad F is rare and highly sought after. This tool surfaces new availability fast - Network accessline 379
- **Etihad First Class Finder** ([seats.aero/etihad/first](https://seats.aero/etihad/first)): Dedicated tracker for newly available Etihad First Class seats. Etihad F is rare and highly sought after. This tool surfaces new availability fast - Network accessline 379
- **Etihad First Class Finder** ([seats.aero/etihad/first](https://seats.aero/etihad/first)): Dedicated tracker for newly available Etihad First Class seats. Etihad F is rare and highly sought after. This tool surfaces new availability fast - Network accessline 379
- **Etihad First Class Finder** ([seats.aero/etihad/first](https://seats.aero/etihad/first)): Dedicated tracker for newly available Etihad First Class seats. Etihad F is rare and highly sought after. This tool surfaces new availability fast - Network accessline 379
- **Etihad First Class Finder** ([seats.aero/etihad/first](https://seats.aero/etihad/first)): Dedicated tracker for newly available Etihad First Class seats. Etihad F is rare and highly sought after. This tool surfaces new availability fast
plugins/travel-hacking-toolkit/skills/serpapi/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Source:** [serpapi.com](https://serpapi.com) — Free tier available, paid plans for higher volume. - Network accessline 14
**Source:** [serpapi.com](https://serpapi.com) — Free tier available, paid plans for higher volume. - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Network accessline 23
https://serpapi.com/search - Network accessline 23
https://serpapi.com/search - Network accessline 33
[Credential-related source omitted] - Network accessline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 63
[Credential-related source omitted] - Network accessline 63
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Network accessline 101
[Credential-related source omitted] - Network accessline 101
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/southwest/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/southwest/SKILL.md
plugins/travel-hacking-toolkit/skills/southwest/scripts/check_change.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 37
HOMEPAGE = "https://www.southwest.com" - Network accessline 303
change_url = "https://www.southwest.com/air/change/" - Access to secretsline 745
[Credential-related source omitted] - Access to secretsline 746
[Credential-related source omitted] - Network accessline 779
log("Navigating to My Account...") account_urls = [ "https://www.southwest.com/myaccount", - Network accessline 780
account_urls = [ "https://www.southwest.com/myaccount", "https://www.southwest.com/account", - Network accessline 781
"https://www.southwest.com/myaccount", - Network accessline 782
"https://www.southwest.com/account", - Access to secretsline 966
[Credential-related source omitted] - Access to secretsline 967
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/southwest/scripts/entrypoint.sh
- Executable scriptline 1
#!/bin/bash
plugins/travel-hacking-toolkit/skills/southwest/scripts/monitor.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/travel-hacking-toolkit/skills/southwest/scripts/search_fares.py
plugins/travel-hacking-toolkit/skills/status-match/SKILL.md
- Network accessline 144
For grants/denials in the past 6 months, point at [statusmatcher.com](https://statusmatcher.com/). Useful for confirming the program is currently accepting matches and what proof is being accepted. - Network accessline 144
For grants/denials in the past 6 months, point at [statusmatcher.com](https://statusmatcher.com/). Useful for confirming the program is currently accepting matches and what proof is being accepted.
plugins/travel-hacking-toolkit/skills/stopovers/SKILL.md
- Network accessline 94
Primary source: [icelandair.com/flights/stopover](https://www.icelandair.com/flights/stopover/) - Network accessline 94
Primary source: [icelandair.com/flights/stopover](https://www.icelandair.com/flights/stopover/) - Network accessline 94
Primary source: [icelandair.com/flights/stopover](https://www.icelandair.com/flights/stopover/) - Network accessline 94
Primary source: [icelandair.com/flights/stopover](https://www.icelandair.com/flights/stopover/) - Network accessline 144
4. **Flying Blue allows unlimited stopovers** but requires phone booking. Some agents incorrectly say only AMS/CDG hub stopovers — cite the FAQ at [flyingblue.us/en/spend/flights/rewards](https://www.flyingblue.us/en/spend/flights/rewards) - Network accessline 144
4. **Flying Blue allows unlimited stopovers** but requires phone booking. Some agents incorrectly say only AMS/CDG hub stopovers — cite the FAQ at [flyingblue.us/en/spend/flights/rewards](https://www.flyingblue.us/en/spend/flights/rewards) - Network accessline 144
4. **Flying Blue allows unlimited stopovers** but requires phone booking. Some agents incorrectly say only AMS/CDG hub stopovers — cite the FAQ at [flyingblue.us/en/spend/flights/rewards](https://www.flyingblue.us/en/spend/flights/rewards) - Network accessline 144
4. **Flying Blue allows unlimited stopovers** but requires phone booking. Some agents incorrectly say only AMS/CDG hub stopovers — cite the FAQ at [flyingblue.us/en/spend/flights/rewards](https://www.flyingblue.us/en/spend/flights/rewards)
plugins/travel-hacking-toolkit/skills/sutochno/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/sutochno/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 35
**City results live on SUBDOMAINS.** Each city has its own host: `https://tbilisi.sutochno.ru/`, `https://batumi.sutochno.ru/`, - Network accessline 36
`https://tbilisi.sutochno.ru/`, `https://batumi.sutochno.ru/`, - Network accessline 37
`https://kutaisi.sutochno.ru/`, etc. The country directory - Network accessline 38
`https://sutochno.ru/georgia` lists the supported Georgian cities and links out - Network accessline 39
to `https://{city}.sutochno.ru/<listingId>` cards. Pass the city as a - Network accessline 85
# Explicit full URL (e.g. a city page with query filters already applied) python3 skills/sutochno/scripts/search_sutochno.py \ --url "https://kutaisi.sutochno.ru/" --json - Network accessline 86
python3 skills/sutochno/scripts/search_sutochno.py --url "https://kutaisi.sutochno.ru/" --json - Network accessline 87
--url "https://kutaisi.sutochno.ru/" --json - Network accessline 95
| Flag | Default | Notes | |------|---------|-------| | `--city` | one of city/url required | City **subdomain** keyword, e.g. `tbilisi`, `batumi`. Resolves to `https://{city}.sutochno.ru/`. | - Network accessline 96
|------|---------|-------| | `--city` | one of city/url required | City **subdomain** keyword, e.g. `tbilisi`, `batumi`. Resolves to `https://{city}.sutochno.ru/`. | | `--url` | one of city/url required | Full city URL — use instead of `--c - Network accessline 97
| `--city` | one of city/url required | City **subdomain** keyword, e.g. `tbilisi`, `batumi`. Resolves to `https://{city}.sutochno.ru/`. | - Network accessline 109
| Field | Selector | Raw shape | Extraction | |-------|----------|-----------|------------| | name + link | `.card-content__object-type` (an `<a>`) | text + `href` → `https://{city}.sutochno.ru/<id>` (or `/hotels/<id>`) | name text; id = tr - Network accessline 110
|-------|----------|-----------|------------| | name + link | `.card-content__object-type` (an `<a>`) | text + `href` → `https://{city}.sutochno.ru/<id>` (or `/hotels/<id>`) | name text; id = trailing digits of href | | price | `.card-price - Network accessline 111
| name + link | `.card-content__object-type` (an `<a>`) | text + `href` → `https://{city}.sutochno.ru/<id>` (or `/hotels/<id>`) | name text; id = trailing digits of href | - Network accessline 134
{ "source": "sutochno", "searchUrl": "https://tbilisi.sutochno.ru/", - Network accessline 135
"source": "sutochno", "searchUrl": "https://tbilisi.sutochno.ru/", "query": { "city": "tbilisi", "url": null, "min_rating": 9.0, "max_price": 8000 }, - Network accessline 136
"searchUrl": "https://tbilisi.sutochno.ru/", - Network accessline 145
"rating": 9.8, "reviews": 10, "url": "https://tbilisi.sutochno.ru/1234567" - Network accessline 146
"reviews": 10, "url": "https://tbilisi.sutochno.ru/1234567" } - Network accessline 147
"url": "https://tbilisi.sutochno.ru/1234567"
plugins/travel-hacking-toolkit/skills/sutochno/scripts/entrypoint.sh
- Executable scriptline 1
#!/bin/bash
plugins/travel-hacking-toolkit/skills/sutochno/scripts/search_sutochno.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 22
2. The JSON API is auth-walled. `https://sutochno.ru/api/geo/suggest` (and the - Network accessline 28
City results live on SUBDOMAINS, one per city: https://tbilisi.sutochno.ru/ https://batumi.sutochno.ru/ etc. - Network accessline 29
https://tbilisi.sutochno.ru/ https://batumi.sutochno.ru/ etc. - Network accessline 30
The country directory `https://sutochno.ru/georgia` lists the supported Georgian - Network accessline 31
cities and links out to `https://{city}.sutochno.ru/<listingId>` cards. - Network accessline 46
# Explicit full URL (e.g. a city page with query filters already applied) python3 search_sutochno.py --url "https://kutaisi.sutochno.ru/" --json - Network accessline 47
python3 search_sutochno.py --url "https://kutaisi.sutochno.ru/" --json - Access to secretsline 71
[Credential-related source omitted] - Network accessline 77
`tbilisi` -> https://tbilisi.sutochno.ru/ - Network accessline 93
host = f"{city}.{BASE_DOMAIN}" return f"https://{host}/" - Network accessline 94
return f"https://{host}/" - Network accessline 147
`https://tbilisi.sutochno.ru/1234567` -> "1234567" - Network accessline 148
`https://tbilisi.sutochno.ru/hotels/9876543?x=1` -> "9876543" - Network accessline 356
g = ap.add_mutually_exclusive_group(required=True) g.add_argument("--city", help='City subdomain keyword, e.g. "tbilisi", "batumi"') g.add_argument("--url", help="Full city URL, e.g. https://tbilisi.sutochno.ru/") - Network accessline 357
g.add_argument("--city", help='City subdomain keyword, e.g. "tbilisi", "batumi"') g.add_argument("--url", help="Full city URL, e.g. https://tbilisi.sutochno.ru/") ap.add_argument("--min-rating", type=float, default=0.0, dest="min_ra - Network accessline 358
g.add_argument("--url", help="Full city URL, e.g. https://tbilisi.sutochno.ru/")
plugins/travel-hacking-toolkit/skills/sutochno/tests/test_search_sutochno.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 48
class BuildCityUrlTests(unittest.TestCase): def test_bare_subdomain(self): self.assertEqual(ss.build_city_url("tbilisi"), "https://tbilisi.sutochno.ru/") - Network accessline 49
def test_bare_subdomain(self): self.assertEqual(ss.build_city_url("tbilisi"), "https://tbilisi.sutochno.ru/") self.assertEqual(ss.build_city_url("batumi"), "https://batumi.sutochno.ru/") - Network accessline 50
self.assertEqual(ss.build_city_url("tbilisi"), "https://tbilisi.sutochno.ru/") - Network accessline 51
self.assertEqual(ss.build_city_url("batumi"), "https://batumi.sutochno.ru/") - Network accessline 53
def test_case_and_whitespace_insensitive(self): self.assertEqual(ss.build_city_url(" Tbilisi "), "https://tbilisi.sutochno.ru/") - Network accessline 54
self.assertEqual(ss.build_city_url(" Tbilisi "), "https://tbilisi.sutochno.ru/") - Network accessline 56
def test_full_host_passthrough(self): self.assertEqual( ss.build_city_url("kutaisi.sutochno.ru"), "https://kutaisi.sutochno.ru/" - Network accessline 57
self.assertEqual( ss.build_city_url("kutaisi.sutochno.ru"), "https://kutaisi.sutochno.ru/" ) - Network accessline 58
ss.build_city_url("kutaisi.sutochno.ru"), "https://kutaisi.sutochno.ru/" - Network accessline 61
def test_strips_scheme_and_path(self): self.assertEqual( ss.build_city_url("https://batumi.sutochno.ru/foo"), - Network accessline 62
self.assertEqual( ss.build_city_url("https://batumi.sutochno.ru/foo"), "https://batumi.sutochno.ru/", - Network accessline 63
ss.build_city_url("https://batumi.sutochno.ru/foo"), - Network accessline 64
"https://batumi.sutochno.ru/", - Network accessline 116
def test_simple_id(self): self.assertEqual( ss.listing_id_from_url("https://tbilisi.sutochno.ru/1234567"), "1234567" - Network accessline 117
self.assertEqual( ss.listing_id_from_url("https://tbilisi.sutochno.ru/1234567"), "1234567" ) - Network accessline 118
ss.listing_id_from_url("https://tbilisi.sutochno.ru/1234567"), "1234567" - Network accessline 121
def test_hotels_path_with_query(self): self.assertEqual( ss.listing_id_from_url("https://tbilisi.sutochno.ru/hotels/9876543?x=1"), - Network accessline 122
self.assertEqual( ss.listing_id_from_url("https://tbilisi.sutochno.ru/hotels/9876543?x=1"), "9876543", - Network accessline 123
ss.listing_id_from_url("https://tbilisi.sutochno.ru/hotels/9876543?x=1"), - Network accessline 127
def test_trailing_slash(self): self.assertEqual( ss.listing_id_from_url("https://batumi.sutochno.ru/555000/"), "555000" - Network accessline 128
self.assertEqual( ss.listing_id_from_url("https://batumi.sutochno.ru/555000/"), "555000" ) - Network accessline 129
ss.listing_id_from_url("https://batumi.sutochno.ru/555000/"), "555000" - Network accessline 132
def test_no_id(self): self.assertIsNone(ss.listing_id_from_url("https://batumi.sutochno.ru/about")) - Network accessline 133
self.assertIsNone(ss.listing_id_from_url("https://batumi.sutochno.ru/about")) - Network accessline 139
raw = { "name": "Уютная студия в центре", "href": "https://tbilisi.sutochno.ru/1234567", - Network accessline 140
"name": "Уютная студия в центре", "href": "https://tbilisi.sutochno.ru/1234567", "priceText": "4 890 ₽ за сутки", - Network accessline 141
"href": "https://tbilisi.sutochno.ru/1234567", - Network accessline 151
self.assertEqual(l["reviews"], 10) self.assertEqual(l["area"], "Тбилиси, Старый город") self.assertEqual(l["url"], "https://tbilisi.sutochno.ru/1234567") - Network accessline 153
self.assertEqual(l["url"], "https://tbilisi.sutochno.ru/1234567") - Network accessline 155
def test_missing_fields(self): l = ss.normalize_listing({"href": "https://batumi.sutochno.ru/9001"}) - Network accessline 156
l = ss.normalize_listing({"href": "https://batumi.sutochno.ru/9001"}) - Network accessline 174
def _raw(self): return [ {"name": "A", "href": "https://tbilisi.sutochno.ru/1001", - Network accessline 175
return [ {"name": "A", "href": "https://tbilisi.sutochno.ru/1001", "priceText": "4 890 ₽ за сутки", "ratingText": "10 отзывов 9,8 (10)"}, - Network accessline 176
{"name": "A", "href": "https://tbilisi.sutochno.ru/1001", - Network accessline 177
"priceText": "4 890 ₽ за сутки", "ratingText": "10 отзывов 9,8 (10)"}, {"name": "A-dup", "href": "https://tbilisi.sutochno.ru/1001", # dup id 1001 "priceText": "9 000 ₽ за сутки", "ratingText": "2 отзыва 7,0 (2)"}, - Network accessline 178
{"name": "A-dup", "href": "https://tbilisi.sutochno.ru/1001", # dup id 1001 - Network accessline 179
"priceText": "9 000 ₽ за сутки", "ratingText": "2 отзыва 7,0 (2)"}, {"name": "B", "href": "https://tbilisi.sutochno.ru/1002", "priceText": "3 000 ₽ за сутки", "ratingText": "5 отзывов 9,8 (5)"}, - Network accessline 180
{"name": "B", "href": "https://tbilisi.sutochno.ru/1002", - Network accessline 181
"priceText": "3 000 ₽ за сутки", "ratingText": "5 отзывов 9,8 (5)"}, {"name": "C", "href": "https://tbilisi.sutochno.ru/1003", "priceText": "12 000 ₽ за сутки", "ratingText": "1 отзыв 6,0"}, - Network accessline 182
{"name": "C", "href": "https://tbilisi.sutochno.ru/1003",
plugins/travel-hacking-toolkit/skills/ticketsatwork/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/ticketsatwork/SKILL.md
- Broad permissionsline 1
Bash(docker *), Bash(python3 *) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 13
Scrapes inventory from [ticketsatwork.com](https://www.ticketsatwork.com), a corporate employee perks platform operated by Entertainment Benefits Group (EBG). Members access negotiated rates through their employer's account. - Network accessline 152
"featured": false, "discount_ranking": 717.95, "detail_url": "https://www.ticketsatwork.com/tickets/hotels.php?sub=details&id=NNNNNN_x" - Network accessline 153
"discount_ranking": 717.95, "detail_url": "https://www.ticketsatwork.com/tickets/hotels.php?sub=details&id=NNNNNN_x" } - Network accessline 154
"detail_url": "https://www.ticketsatwork.com/tickets/hotels.php?sub=details&id=NNNNNN_x" - Network accessline 209
"category": "disneyland", "keyword": null, "landed_url": "https://www.ticketsatwork.com/tickets/pages.php?sub=disneyland", - Network accessline 210
"keyword": null, "landed_url": "https://www.ticketsatwork.com/tickets/pages.php?sub=disneyland", "deal_count": 6, - Network accessline 211
"landed_url": "https://www.ticketsatwork.com/tickets/pages.php?sub=disneyland", - Network accessline 218
"subtitle": "Save up to $65 on Multi-Day Tickets", "description": "Explore 1-5 Day Disneyland Resort theme park tickets...", "image_url": "https://www.ticketsatwork.com/common_resources/...", - Network accessline 219
"description": "Explore 1-5 Day Disneyland Resort theme park tickets...", "image_url": "https://www.ticketsatwork.com/common_resources/...", "detail_url": "https://www.ticketsatwork.com/tickets/packages.php?sub=packages&action=v - Network accessline 220
"image_url": "https://www.ticketsatwork.com/common_resources/...", - Network accessline 221
"detail_url": "https://www.ticketsatwork.com/tickets/packages.php?sub=packages&action=view&id=4704"
plugins/travel-hacking-toolkit/skills/ticketsatwork/scripts/browse_tickets.py
plugins/travel-hacking-toolkit/skills/ticketsatwork/scripts/entrypoint.sh
- Executable scriptline 1
#!/bin/bash
plugins/travel-hacking-toolkit/skills/ticketsatwork/scripts/search_cars.py
plugins/travel-hacking-toolkit/skills/ticketsatwork/scripts/search_hotels.py
plugins/travel-hacking-toolkit/skills/ticketsatwork/scripts/taw_common.py
plugins/travel-hacking-toolkit/skills/transfer-partners/SKILL.md
plugins/travel-hacking-toolkit/skills/trip-calculator/SKILL.md
plugins/travel-hacking-toolkit/skills/trip-log/SKILL.md
- Access to secretsline 5
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/trip-planner/SKILL.md
- Access to secretsline 6
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/tripadvisor/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 18
**Base URL:** `https://api.content.tripadvisor.com/api/v1` - Network accessline 22
**Monthly quota:** 5,000 API calls per month. Each curl request = 1 call. A full hotel lookup (search + details + reviews + photos) = 4 calls. Budget accordingly. Prefer search + details (2 calls) and only fetch reviews/photos when specific - Network accessline 28
> **First-time setup gotcha:** TripAdvisor requires whitelisting your outbound IP at https://www.tripadvisor.com/developers before the key works. Without this, every call returns `User is not authorized to access this resource with an expli - Network accessline 29
> > - **How to find your current IP:** `curl ifconfig.me` > - **Propagation:** changes take 1-5 minutes (AWS edge cache). - Network accessline 30
> - **How to find your current IP:** `curl ifconfig.me` - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Network accessline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 105
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Network accessline 139
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Network accessline 180
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Network accessline 206
[Credential-related source omitted] - Access to secretsline 206
[Credential-related source omitted] - Network accessline 228
# 1. Search for hotel curl -s "https://api.content.tripadvisor.com/api/v1/location/search?key=$TRIPADVISOR_API_KEY&searchQuery=Amerikalinjen+Oslo&category=hotels" | python3 -m json.tool - Dangerous shell operationline 229
[Credential-related source omitted] - Network accessline 229
[Credential-related source omitted] - Access to secretsline 229
[Credential-related source omitted] - Network accessline 231
# 2. Get details with location_id from step 1 curl -s "https://api.content.tripadvisor.com/api/v1/location/1234567/details?key=$TRIPADVISOR_API_KEY¤cy=USD" | python3 -m json.tool - Dangerous shell operationline 232
[Credential-related source omitted] - Network accessline 232
[Credential-related source omitted] - Access to secretsline 232
[Credential-related source omitted] - Network accessline 234
# 3. Get reviews (optional, costs 1 call) curl -s "https://api.content.tripadvisor.com/api/v1/location/1234567/reviews?key=$TRIPADVISOR_API_KEY" | python3 -m json.tool - Dangerous shell operationline 235
[Credential-related source omitted] - Network accessline 235
[Credential-related source omitted] - Access to secretsline 235
[Credential-related source omitted] - Network accessline 237
# 4. Get photos (optional, costs 1 call) curl -s "https://api.content.tripadvisor.com/api/v1/location/1234567/photos?key=$TRIPADVISOR_API_KEY" | python3 -m json.tool - Dangerous shell operationline 238
[Credential-related source omitted] - Network accessline 238
[Credential-related source omitted] - Access to secretsline 238
[Credential-related source omitted] - Network accessline 244
# Search all hotels in city curl -s "https://api.content.tripadvisor.com/api/v1/location/search?key=$TRIPADVISOR_API_KEY&searchQuery=hotels+Copenhagen&category=hotels" - Network accessline 245
[Credential-related source omitted] - Access to secretsline 245
[Credential-related source omitted] - Network accessline 254
# Use hotel's lat/long from details response curl -s "https://api.content.tripadvisor.com/api/v1/location/nearby_search?key=$TRIPADVISOR_API_KEY&latLong=59.31555,18.078924&category=restaurants" - Network accessline 255
[Credential-related source omitted] - Access to secretsline 255
[Credential-related source omitted] - Network accessline 261
# Search for attractions curl -s "https://api.content.tripadvisor.com/api/v1/location/search?key=$TRIPADVISOR_API_KEY&searchQuery=things+to+do+Stockholm&category=attractions" - Network accessline 262
[Credential-related source omitted] - Access to secretsline 262
[Credential-related source omitted] - Network accessline 264
# Nearby attractions from a point curl -s "https://api.content.tripadvisor.com/api/v1/location/nearby_search?key=$TRIPADVISOR_API_KEY&latLong=59.3293,18.0686&category=attractions" - Network accessline 265
[Credential-related source omitted] - Access to secretsline 265
[Credential-related source omitted]
plugins/travel-hacking-toolkit/skills/vrbo/Dockerfile
- Executable scriptline 1
Executable file
plugins/travel-hacking-toolkit/skills/vrbo/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 100
"source": "vrbo", "extractor": "__PLUS_REDUX_STORE__ | dom:lodging-card | dom:anchors", "searchUrl": "https://www.vrbo.com/search?...", - Network accessline 101
"extractor": "__PLUS_REDUX_STORE__ | dom:lodging-card | dom:anchors", "searchUrl": "https://www.vrbo.com/search?...", "count": 12, - Network accessline 102
"searchUrl": "https://www.vrbo.com/search?...", - Network accessline 111
"pricePerNight": 312, "priceTotal": 2184, "priceIncludesTaxes": true, "lat": 51.08, "lng": -115.35, "url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..." - Network accessline 112
"lat": 51.08, "lng": -115.35, "url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..." } - Network accessline 113
"url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..."
plugins/travel-hacking-toolkit/skills/vrbo/scripts/entrypoint.sh
- Executable scriptline 1
#!/bin/bash
plugins/travel-hacking-toolkit/skills/vrbo/scripts/search_vrbo.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 51
SEARCH_URL = "https://www.vrbo.com/search" - Network accessline 52
HOME_URL = "https://www.vrbo.com/" - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Network accessline 219
lat: node.latitude ?? node.lat ?? (node.geoLocation && node.geoLocation.latitude) ?? null, lng: node.longitude ?? node.lng ?? (node.geoLocation && node.geoLocation.longitude) ?? null, url: id ? `https://www.vrbo.com/ - Network accessline 220
lng: node.longitude ?? node.lng ?? (node.geoLocation && node.geoLocation.longitude) ?? null, url: id ? `https://www.vrbo.com/${String(id)}` : null, }); - Network accessline 221
url: id ? `https://www.vrbo.com/${String(id)}` : null, - Network accessline 261
priceText, rating: ratingEl ? (ratingEl.getAttribute('aria-label') || ratingEl.innerText) : null, url: href ? (href.startsWith('http') ? href : `https://www.vrbo.com${href}`) : null, - Network accessline 262
rating: ratingEl ? (ratingEl.getAttribute('aria-label') || ratingEl.innerText) : null, url: href ? (href.startsWith('http') ? href : `https://www.vrbo.com${href}`) : null, }); - Network accessline 263
url: href ? (href.startsWith('http') ? href : `https://www.vrbo.com${href}`) : null, - Network accessline 270
const anchors = Array.from(document.querySelectorAll('a[href*="/"]')) .map(a => a.getAttribute('href')) .filter(h => h && /^\/?\d{5,}/.test(h.replace('https://www.vrbo.com', ''))); - Network accessline 271
.map(a => a.getAttribute('href')) .filter(h => h && /^\/?\d{5,}/.test(h.replace('https://www.vrbo.com', ''))); if (anchors.length) { - Network accessline 272
.filter(h => h && /^\/?\d{5,}/.test(h.replace('https://www.vrbo.com', ''))); - Network accessline 278
if (seen.has(id)) return; seen.add(id); out.listings.push({ id, name: null, priceText: null, url: h.startsWith('http') ? h : `https://www.vrbo.com${h}` }); - Network accessline 279
seen.add(id); out.listings.push({ id, name: null, priceText: null, url: h.startsWith('http') ? h : `https://www.vrbo.com${h}` }); }); - Network accessline 280
out.listings.push({ id, name: null, priceText: null, url: h.startsWith('http') ? h : `https://www.vrbo.com${h}` });
plugins/travel-hacking-toolkit/skills/vrbo/tests/test_search_vrbo.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 25
def test_includes_core_params(self): url = sv.build_search_url("Canmore, Alberta, Canada", "2026-06-26", "2026-07-02", 3, 0, False) self.assertTrue(url.startswith("https://www.vrbo.com/search?")) - Network accessline 26
url = sv.build_search_url("Canmore, Alberta, Canada", "2026-06-26", "2026-07-02", 3, 0, False) self.assertTrue(url.startswith("https://www.vrbo.com/search?")) self.assertIn("startDate=2026-06-26", url) - Network accessline 27
self.assertTrue(url.startswith("https://www.vrbo.com/search?")) - Network accessline 98
self.assertFalse(sv.is_skeleton({"id": "p123", "name": None, "url": None})) self.assertFalse(sv.is_skeleton({"id": None, "name": "Cabin", "url": None})) self.assertFalse(sv.is_skeleton({"id": None, "name": None, "url": "http - Network accessline 100
self.assertFalse(sv.is_skeleton({"id": None, "name": None, "url": "https://vrbo.com/p1"}))
plugins/travel-hacking-toolkit/skills/wheretocredit/SKILL.md
- Access to secretsline 6
[Credential-related source omitted] - Network accessline 14
**Source:** [wheretocredit.com](https://www.wheretocredit.com) — No API key required. Data is scraped via webfetch. - Network accessline 22
https://www.wheretocredit.com/en/{IATA_CODE}/{BOOKING_CLASS} - Network accessline 26
Example: `https://www.wheretocredit.com/en/AY/Z` (Finnair class Z) - Network accessline 30
https://www.wheretocredit.com/en/{IATA_CODE} - Network accessline 34
Example: `https://www.wheretocredit.com/en/AY` (all Finnair classes) - Network accessline 38
https://www.wheretocredit.com/en/programs/{PROGRAM_CODE} - Network accessline 42
Example: `https://www.wheretocredit.com/en/programs/AA` (AA AAdvantage partners) - Network accessline 149
### Step 2: Fetch earning rates - Fetch `https://www.wheretocredit.com/en/{IATA}/{CLASS}` - Network accessline 150
- Fetch `https://www.wheretocredit.com/en/{IATA}/{CLASS}` - Network accessline 201
1. Fetch `https://www.wheretocredit.com/en/{IATA}/{CLASS}` - Network accessline 207
1. Fetch `https://www.wheretocredit.com/en/programs/{CODE}`
plugins/travel-hacking-toolkit/skills/wikipedia-airports/SKILL.md
- Network accessline 33
curl -s "https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=SAN+airport&format=json" \ - Network accessline 44
curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=San_Diego_International_Airport&prop=wikitext&formatversion=2&format=json" \ - Network accessline 51
curl -Ls "https://en.wikipedia.org/wiki/San_Diego_International_Airport" - Network accessline 66
curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=San_Diego_International_Airport&prop=wikitext&formatversion=2&format=json" \ - Network accessline 78
curl -Ls "https://www.southwest.com/en/flights/flights-from-portland-or-to-san-diego" | rg "PDX|SAN|Portland|San Diego" - Network accessline 79
curl -Ls "https://www.southwest.com/en/flights/flights-from-portland-or-to-orange-county-santa-ana" | rg "PDX|SNA|Portland|Orange County" - Network accessline 127
CODE=SAN curl -s "https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${CODE}+airport&format=json" \ - Network accessline 128
curl -s "https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${CODE}+airport&format=json" \ - Network accessline 135
PAGE="San_Diego_International_Airport" curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=${PAGE}&prop=wikitext&formatversion=2&format=json" \ - Network accessline 136
curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=${PAGE}&prop=wikitext&formatversion=2&format=json" \ - Network accessline 144
PAGE="San_Diego_International_Airport" curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=${PAGE}&prop=wikitext&formatversion=2&format=json" \ - Network accessline 145
curl -s "https://en.wikipedia.org/w/api.php?action=parse&page=${PAGE}&prop=wikitext&formatversion=2&format=json" \
scripts/calc_distance.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/check-data-freshness.sh
- Executable scriptline 1
#!/usr/bin/env bash
scripts/refresh-transfer-bonuses.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Network accessline 4
Scrapes https://frequentmiler.com/current-point-transfer-bonuses/ and updates - Network accessline 36
FM_URL = "https://frequentmiler.com/current-point-transfer-bonuses/" - Network accessline 37
AW_URL = "https://awardwallet.com/news/credit-card-transfer-bonuses/" - Network accessline 47
def fetch(url, timeout=20): - Network accessline 48
req = urllib.request.Request( - Network accessline 57
}, ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 58
) with urllib.request.urlopen(req, timeout=timeout) as resp: return resp.read().decode("utf-8", errors="replace") - Network accessline 59
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 104
link_match = re.search( r"<a[^>]+href=['\"](https://frequentmiler\.com/[^'\"]+)['\"][^>]*>([^<]+)</a>", - Network accessline 105
r"<a[^>]+href=['\"](https://frequentmiler\.com/[^'\"]+)['\"][^>]*>([^<]+)</a>", - Network accessline 269
log(f"fetching {FM_URL}") try: fm_html = fetch(FM_URL) - Network accessline 270
try: fm_html = fetch(FM_URL) except Exception as e: - Network accessline 271
fm_html = fetch(FM_URL) - Network accessline 296
aw_html = "" try: aw_html = fetch(AW_URL) - Network accessline 297
try: aw_html = fetch(AW_URL) except Exception as e: - Network accessline 298
aw_html = fetch(AW_URL)
scripts/setup-keys.ps1
- Executable scriptline 1
Executable file - Network accessline 111
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Network accessline 113
'https://seats.aero/profile (Pro ~$8/mo)' - Network accessline 115
Prompt-Key 'DUFFEL_API_KEY_LIVE' ` 'Real GDS cash flight prices. Free to search, pay per booking.' ` 'https://duffel.com (use the LIVE key, not test)' - Network accessline 117
'https://duffel.com (use the LIVE key, not test)' - Network accessline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 121
'https://ignav.com (1,000 free requests/month)' - Network accessline 123
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Network accessline 125
'https://business.awardwallet.com/profile/api (Business account required)' - Network accessline 135
$more = Read-Host "Continue with Tier 2 (SerpAPI, RapidAPI, LiteAPI, TripAdvisor)? [y/N]" if ($more -match '^[Yy]') { Prompt-Key 'SERPAPI_API_KEY' 'Google Flights/Hotels comparison data.' 'https://serpapi.com (100 searches/mo free)' - Network accessline 136
if ($more -match '^[Yy]') { Prompt-Key 'SERPAPI_API_KEY' 'Google Flights/Hotels comparison data.' 'https://serpapi.com (100 searches/mo free)' Prompt-Key 'RAPIDAPI_KEY' 'Booking.com Live + Google Flights Live as fallback sources. - Network accessline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Network accessline 138
Prompt-Key 'RAPIDAPI_KEY' 'Booking.com Live + Google Flights Live as fallback sources.' 'https://rapidapi.com' - Network accessline 139
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Network accessline 140
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted] - Network accessline 147
if ($more -match '^[Yy]') { Prompt-Key 'ENTUR_CLIENT_NAME' "Norway transit search. Free, no signup. Format: 'yourcompany-app'." '' 3 Prompt-Key 'RESROBOT_API_KEY' 'Sweden rail/bus search.' 'https://www.trafiklab.se (30K calls/mo fr - Network accessline 148
Prompt-Key 'ENTUR_CLIENT_NAME' "Norway transit search. Free, no signup. Format: 'yourcompany-app'." '' 3 Prompt-Key 'RESROBOT_API_KEY' 'Sweden rail/bus search.' 'https://www.trafiklab.se (30K calls/mo free)' Prompt-Key 'REJSEPLANEN - Network accessline 149
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted] - Network accessline 150
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted]
scripts/setup-keys.sh
- Executable scriptline 1
#!/usr/bin/env bash - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Network accessline 7
# # Or download and run in one shot: # bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 8
# Or download and run in one shot: # bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) # - Dangerous shell operationline 9
# bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 9
# bash <(curl -fsSL https://raw.githubusercontent.com/borski/travel-hacking-toolkit/main/scripts/setup-keys.sh) - Network accessline 161
[Credential-related source omitted] - Access to secretsline 161
[Credential-related source omitted] - Network accessline 163
"https://seats.aero/profile (Pro ~\$8/mo)" - Network accessline 165
prompt_key DUFFEL_API_KEY_LIVE \ "Real GDS cash flight prices. Free to search, pay per booking." \ "https://duffel.com (use the LIVE key, not test)" - Network accessline 167
"https://duffel.com (use the LIVE key, not test)" - Network accessline 169
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Network accessline 171
"https://ignav.com (1,000 free requests/month)" - Network accessline 173
[Credential-related source omitted] - Access to secretsline 173
[Credential-related source omitted] - Network accessline 175
"https://business.awardwallet.com/profile/api (Business account required)" - Network accessline 187
[Credential-related source omitted] - Access to secretsline 187
[Credential-related source omitted] - Network accessline 188
"Google Flights/Hotels comparison data." \ "https://serpapi.com (100 searches/mo free)" prompt_key RAPIDAPI_KEY \ - Network accessline 189
"https://serpapi.com (100 searches/mo free)" - Network accessline 190
prompt_key RAPIDAPI_KEY \ "Booking.com Live + Google Flights Live as fallback sources." \ "https://rapidapi.com" - Network accessline 191
"Booking.com Live + Google Flights Live as fallback sources." \ "https://rapidapi.com" prompt_key LITEAPI_API_KEY \ - Network accessline 192
"https://rapidapi.com" - Network accessline 193
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted] - Network accessline 194
"Hotel rate inventory via LiteAPI MCP." \ "https://liteapi.travel" prompt_key TRIPADVISOR_API_KEY \ - Network accessline 195
"https://liteapi.travel" - Network accessline 196
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Network accessline 197
"Hotel ratings, reviews, and rankings." \ "https://tripadvisor-content-api.readme.io (5K calls/mo free)" ;; - Network accessline 198
"https://tripadvisor-content-api.readme.io (5K calls/mo free)" - Network accessline 211
[Credential-related source omitted] - Access to secretsline 211
[Credential-related source omitted] - Network accessline 212
"Sweden rail/bus search." \ "https://www.trafiklab.se (30K calls/mo free)" prompt_key REJSEPLANEN_API_KEY \ - Network accessline 213
"https://www.trafiklab.se (30K calls/mo free)" - Network accessline 214
[Credential-related source omitted] - Access to secretsline 214
[Credential-related source omitted] - Network accessline 215
"Denmark rail/bus search." \ "https://help.rejseplanen.dk" ;; - Network accessline 216
"https://help.rejseplanen.dk"
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 500 facts
- Executable script in code of a file that runsamerican-airlines/Dockerfile:1High confidence
- Access to secrets in the frontmatter of the SKILL.md: a variable, placeholder or call, not a stored valueamerican-airlines/SKILL.md:6Low confidence
- Access to secrets in prose of the SKILL.mdamerican-airlines/SKILL.md:61Low confidence
- Executable script in code of a file that runsamerican-airlines/scripts/check_balance.py:1High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamerican-airlines/scripts/check_balance.py:35Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamerican-airlines/scripts/check_balance.py:38Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamerican-airlines/scripts/check_balance.py:58Low confidence
- Network access in code of a file that runsamerican-airlines/scripts/check_balance.py:419High confidence
- Network access in code of a file that runsamerican-airlines/scripts/check_balance.py:420High confidence
- Network access in code of a file that runsamerican-airlines/scripts/check_balance.py:531High confidence
- Network access in code of a file that runsamerican-airlines/scripts/check_balance.py:532High confidence
- Network access in code of a file that runsamerican-airlines/scripts/check_balance.py:533High confidence
- Executable script in code of a file that runsamex-travel/Dockerfile:1High confidence
- Access to secrets in the frontmatter of the SKILL.md: a variable, placeholder or call, not a stored valueamex-travel/SKILL.md:6Low confidence
- Access to secrets in the frontmatter of the SKILL.md: a variable, placeholder or call, not a stored valueplugins/travel-hacking-toolkit/skills/amex-travel/SKILL.md:6Low confidence
- Executable script in code of a file that runsamex-travel/scripts/refresh_login.py:1High confidence
- Network access in code of a file that runsamex-travel/scripts/refresh_login.py:33High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/refresh_login.py:46Low confidence
- Executable script in code of a file that runsamex-travel/scripts/search_flights.py:1High confidence
- Network access in code of a file that runsamex-travel/scripts/search_flights.py:43High confidence
- Network access in code of a file that runsamex-travel/scripts/search_flights.py:44High confidence
- Network access in code of a file that runsamex-travel/scripts/search_flights.py:45High confidence
- Network access in code of a file that runsamex-travel/scripts/search_flights.py:46High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:55Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:123Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:411Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:412Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:2488Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:2489Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueamex-travel/scripts/search_flights.py:2495Low confidence
- Executable script in code of a testamex-travel/tests/test_search_flights.py:1Low confidence
- Access to secrets in the frontmatter of the SKILL.md: a variable, placeholder or call, not a stored valueatlas-obscura/SKILL.md:6Low confidence
- Network access in prose of the SKILL.mdatlas-obscura/SKILL.md:14Low confidence
- Executable script in code of a file that runsatlas-obscura/ao.mjs:1High confidence
- Network access in a comment of a file that runsatlas-obscura/ao.mjs:3Low confidence
- Network access in a comment of a file that runsatlas-obscura/ao.mjs:4Low confidence
- Network access in code of a file that runsatlas-obscura/ao.mjs:63High confidence
- Network access in code of a file that runsatlas-obscura/ao.mjs:64High confidence
- Network access in code of a file that runsatlas-obscura/ao.mjs:65High confidence
- Executable script in code of a file that runsatlas-obscura/package.json:1High confidence
- Access to secrets in the frontmatter of the SKILL.mdaward-calendar/SKILL.md:6Low confidence
- Network access in code of the SKILL.mdaward-calendar/SKILL.md:37High confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueaward-calendar/SKILL.md:37Low confidence
- Network access in code of the SKILL.mdaward-calendar/SKILL.md:38High confidence
- Access to secrets in the frontmatter of the SKILL.mdawardwallet/SKILL.md:6Low confidence
- Access to secrets in the frontmatter of the SKILL.mdplugins/travel-hacking-toolkit/skills/awardwallet/SKILL.md:6Low confidence
- Network access in prose of the SKILL.mdawardwallet/SKILL.md:14Low confidence
- Network access in prose of the SKILL.mdplugins/travel-hacking-toolkit/skills/awardwallet/SKILL.md:14Low confidence
- Network access in prose of the SKILL.mdawardwallet/SKILL.md:18Low confidence
- Network access in prose of the SKILL.mdplugins/travel-hacking-toolkit/skills/awardwallet/SKILL.md:18Low confidence
and 450 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md plugins/travel-hacking-toolkit/skills/alliances/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md plugins/travel-hacking-toolkit/skills/alliances/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md plugins/travel-hacking-toolkit/skills/alliances/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Native | Manifest opencode.json | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/borski-travel-hacking-toolkit/)