The listings command group provides tools for managing, searching, validating, and analyzing internship listings.
mark-inactive
Bulk mark listings as inactive from a GitHub issue.
uv run python main.py listings mark-inactive <event_file>
Path to the GitHub event JSON file containing the bulk_mark_inactive issue
What it does
- Extracts URLs from the issue body
- Marks each listing as
active: false
- Updates
date_updated timestamp
- Generates summary comment for the issue
- Sets GitHub Actions outputs for commit message and attribution
remove
Remove a listing by URL or ID.
uv run python main.py listings remove --url <url>
uv run python main.py listings remove --id <uuid>
URL of the listing to remove
UUID of the listing to remove
Hide from all READMEs (sets is_visible: false)
Permanently delete from listings.json (requires --confirm)
Required with --permanent to confirm deletion
Removal modes
Default (mark inactive):
uv run python main.py listings remove --url "https://example.com/job/123"
Sets active: false but keeps the listing in the database.
Hide from READMEs:
uv run python main.py listings remove --url "https://example.com/job/123" --hide
Sets is_visible: false - listing stays in database but won’t appear in any README.
Permanent deletion:
uv run python main.py listings remove --url "https://example.com/job/123" --permanent --confirm
Completely removes the listing from listings.json. Cannot be undone!
stats
Show listing statistics (counts, categories, top companies).
uv run python main.py listings stats
uv run python main.py listings stats --json
Output as JSON instead of formatted text
Statistics included
- Total listings - Active, inactive, visible, hidden counts
- By category - Breakdown of internships by job category
- By sponsorship - Sponsorship status distribution
- By source - Simplify vs community contributions
- Top 10 companies - Companies with most listings
Example output
============================================================
LISTING STATISTICS
============================================================
Total Listings: 1247
Active: 892 (71.5%)
Inactive: 355 (28.5%)
Visible: 1240
Hidden: 7
By Category:
💻 Software Engineering: 847
📊 Data Science, AI & Machine Learning: 178
📈 Quantitative Finance: 92
📱 Product Management: 71
⚙️ Hardware Engineering: 43
📋 Other: 16
Top 10 Companies:
1. Google: 12 listings
2. Amazon: 11 listings
3. Microsoft: 9 listings
...
validate
Validate listings.json schema and data integrity.
uv run python main.py listings validate
uv run python main.py listings validate --fix
Attempt to auto-fix issues (currently limited functionality)
Validation checks
Schema validation:
- All required fields present (company_name, title, url, date_posted, etc.)
- Valid data types
Data integrity:
- No duplicate URLs
- No duplicate IDs
- Valid timestamps (not in future)
- Non-empty required fields
- Valid categories
Filtering issues:
- Empty terms list (filtered from README)
- Blocked companies (filtered from README)
Example output
============================================================
VALIDATION RESULTS
============================================================
❌ ERRORS (3):
- [Acme Corp] Empty title (id: 98b2d671-3f03-430e-b18c)
- Duplicate URL found 2 times: https://example.com/job/456
- [TechCo] Missing required property: date_updated
⚠️ WARNINGS (5):
- [StartupX] Missing/None category (id: f7a9b123-4567-890a-bcde)
- [DataCorp] Empty terms list - will be filtered from README
Total: 1247 listings checked
Errors: 3, Warnings: 5, Fixed: 0
Run 'listings fix' to interactively fix issues.
search
Search and filter listings.
uv run python main.py listings search [options]
Filter by company name (case-insensitive substring match)
Filter by job title (case-insensitive substring match)
Filter by location (case-insensitive substring match)
Filter by category (case-insensitive substring match)
Show only active listings
Show only inactive listings
Maximum number of results to show
Examples
Search by company:
uv run python main.py listings search --company "Google"
Search active software engineering roles:
uv run python main.py listings search --category "Software" --active
Search remote positions with custom limit:
uv run python main.py listings search --location "Remote" --limit 50
Combine multiple filters:
uv run python main.py listings search --company "Meta" --title "Engineering" --active
Search output
Found 3 matching listings
================================================================================
✅ [Software Engineering] Google
Software Engineering Intern, Summer 2026
📍 Mountain View, CA; New York, NY
📅 Posted: 2025-01-15
🔗 https://google.com/careers/job123
✅ [Software Engineering] Google
Backend Engineering Intern
📍 Seattle, WA
📅 Posted: 2025-01-10
🔗 https://google.com/careers/job456
diff
Show changes to listings since a date or commit.
uv run python main.py listings diff
uv run python main.py listings diff --since "2025-01-01"
uv run python main.py listings diff --commit abc123
Show changes since this date (YYYY-MM-DD format)
Show changes since this git commit hash
Diff modes
Default (compare with last commit):
uv run python main.py listings diff
Shows additions, removals, and status changes from HEAD~1.
Since specific date:
uv run python main.py listings diff --since "2025-01-01"
Shows all listings added or updated since January 1, 2025.
Since specific commit:
uv run python main.py listings diff --commit abc123
Compares current listings with the specified commit.
Example output
Changes from previous commit
============================================================
➕ ADDED (5):
- Google: Software Engineering Intern
- Meta: Data Science Intern
- Amazon: Backend Engineer Intern
...
➖ REMOVED (2):
- StartupX: Full Stack Developer Intern
- OldCorp: Software Engineer Summer 2026
🔄 STATUS CHANGES (8):
- Microsoft: Cloud Engineer Intern (active → inactive)
- Apple: Hardware Engineer Intern (inactive → active)
...
Total: +5 added, -2 removed, ~8 status changes
fix
Interactively fix issues in listings.json.
uv run python main.py listings fix
uv run python main.py listings fix --dry-run
uv run python main.py listings fix --type empty
uv run python main.py listings fix --auto
Show fixes without saving changes
Only fix specific issue type: empty, duplicate, or blocked
Auto-accept all recommended fixes without prompting
Interactive fixing
The fix command walks through issues one-by-one and prompts for action:
Empty titles:
- Suggests title based on category (e.g., “Software Engineering Intern”)
- Options: accept suggestion, fix custom, hide, delete, or skip
Invalid categories:
- Suggests category based on job title using ML classification
- Shows list of valid categories with recommendation highlighted
- Options: select category by number, skip, or quit
Duplicate URLs/IDs:
- Lists all duplicates with source labels
- Recommends keeping Simplify-sourced listings (most reliable)
- Options: choose which to keep (others are deleted), skip, or quit
Blocked companies:
- Shows company details
- Options: hide from README, delete, skip, or quit
Fix examples
Preview fixes without saving:
uv run python main.py listings fix --dry-run
Only fix empty fields:
uv run python main.py listings fix --type empty
Only fix duplicates:
uv run python main.py listings fix --type duplicate
Auto-fix all issues:
uv run python main.py listings fix --auto
Automatically accepts recommended fixes:
- Empty titles → generates from category
- Invalid categories → uses ML-suggested category or “Other”
- Duplicates → keeps Simplify-sourced or newest
- Blocked companies → hides from README
Preview auto-fixes:
uv run python main.py listings fix --auto --dry-run
Example session
Found 3 issues to review
============================================================
Issue 1/3: Empty Title
----------------------------------------
Company: TechCorp
Category: Software Engineering
ID: 98b2d671-3f03-430e-b18c
URL: https://techcorp.com/careers/123
Posted: 2025-01-15
Suggested title: Software Engineering Intern
[a]ccept suggestion [f]ix custom [h]ide [d]elete [s]kip [q]uit: a
→ Fixed: Set title to "Software Engineering Intern"
...
============================================================
SUMMARY
============================================================
Fixed: 3
Hidden: 0
Deleted: 0
Skipped: 0
✅ Changes saved to .github/scripts/listings.json