Contributing to the Internship List
July 30, 2026 Β· View on GitHub
Thank you for your interest in contributing to the Pitt CSC and Simplify internship list!
Below, you'll find the guidelines for our repository. If you have any questions, please create a miscellaneous issue.
Finding an Internship to Add
We ask that the internships that you add meet some requirements. Specifically, your internship must
- be in one of the following categories:
- Software Engineering - Software development, computer engineering, full-stack, frontend, backend, mobile development
- Product Management - Product manager, associate product manager (APM), product analyst roles
- Data Science, AI & Machine Learning - Data science, machine learning, AI research, data engineering, analytics
- Quantitative Finance - Quantitative trading, quantitative research, fintech engineering
- Hardware Engineering - Hardware design, embedded systems, firmware, FPGA, circuit design
- Other - Any other tech-related internships that don't fit the above categories
- be located in the United States, Canada, or remote.
- not already exist in the internship list.
- belong to a company using a formal ATS such as Workday, Greenhouse, Ashby, etc.
- any company using non-ATS platforms such as forms or surveys must be verified/approved on Simplify.
Adding an Internship
Cool! You're ready to add an internship to the list. Follow these steps:
- First create a new issue here.
- Select the New Internship issue template.
- Fill in the information about your internship into the form, including:
- Category: Choose the appropriate category from the dropdown (Software Engineering, Product Management, etc.)
- Advanced Degree Requirements: Check this box if the internship specifically requires or prefers Master's, MBA, or PhD degrees
- All other required fields (company, title, location, etc.)
- Hit submit.
Please make a new submission for each unique position, even if they are for the same company.
- That's it! Once a member of our team has reviewed your submission, it will be automatically added to the correct
READMEwith proper categorization and degree indicators
Editing an Internship
To edit an internship (changing name, setting as inactive, removing, etc.), follow these steps:
- First copy the url of the internship you would like to edit.
This can be found by right-clicking on the
APPLYbutton and selecting copy link address
- Create a new issue here.
- Select the Edit Internship issue template.
- Fill in the url to the link input.
This is how we ensure your edit affects the correct internship
- Leave every other input blank except for whichever fields you would like to update or change about the internship, including:
- Category: Change the internship category if needed
- Advanced Degree Requirements: Check or uncheck if the degree requirements have changed
- Any other fields you want to modify
- If it is not obvious why you are making these edits, please specify why in the reason box at the bottom of the form.
- Hit submit. A member of our team will review your revision and approve it shortly.
Automatic README.md Updates
A script will automatically add new contributions as well as new internships found by Simplify to the appropriate README. Internships will be:
- Categorized into the appropriate section (Software Engineering, Product Management, Data Science, etc.)
- Marked with special indicators:
- π₯ for FAANG+ companies (Google, Meta, Apple, Amazon, Microsoft, etc.)
- π for roles requiring advanced degrees (Master's/MBA/PhD)
- π for roles that don't offer sponsorship
- πΊπΈ for roles requiring U.S. citizenship
The row will look something like this:
| Company | Role | Location | Application | Age |
| --- | --- | --- | :---: | :---: |
| π₯ **[Google](https://google.com)** | Software Engineering Internship π | San Francisco, CA | <a href="..."><img src="..." alt="Apply"></a> | 2d |
When rendered, it will look like:
| Company | Role | Location | Application | Age |
|---|---|---|---|---|
| π₯ Google | Software Engineering Internship π | San Francisco, CA | 2d |
Maintainer Guide
This section is for maintainers who need to understand how the repository operates behind the scenes.
High Level Overview
Internships are stored in .github/scripts/listings.json. This file is edited by:
- Submitting a
new_internshiporedit_internshipissue form - An external microservice that runs daily to fetch internships from Simplify's database
Once an approved label is attached to an issue, a GitHub Action automatically edits listings.json with the new information. Every time listings.json is updated, another GitHub Action called "Update READMEs" updates the README files with the new internships.
listings.json Schema
All internships are stored in .github/scripts/listings.json. A listing entry looks like:
{
"company_name": "Capital One",
"locations": ["McLean, VA", "Plano, TX"],
"title": "Product Development Intern",
"date_posted": 1690430400,
"terms": ["Summer 2024"],
"active": true,
"url": "https://example.com/job/123",
"is_visible": true,
"source": "Simplify",
"company_url": "",
"date_updated": 1690430400,
"id": "98b2d671-3f03-430e-b18c-e5ddb8ce5035"
}
| Property | Type | Description |
|---|---|---|
company_name | str | Name of company |
company_url | str | Link to Simplify page (empty for contributions) |
title | str | Name of internship position |
date_posted | int | Unix timestamp when added |
date_updated | int | Unix timestamp when last updated |
url | str | Link to job posting |
terms | [str] | Array of terms (e.g., ["Summer 2024"]) |
locations | [str] | Array of locations |
active | bool | true if application is open |
is_visible | bool | true if visible in README |
source | str | Simplify or GitHub username of contributor |
id | str | Unique identifier |
GitHub Issue Templates
Issue templates are in .github/ISSUE_TEMPLATE/:
| Template | File | Purpose | Label |
|---|---|---|---|
| New Internship | new_internship.yaml | Add a new internship | new_internship |
| Edit Internship | edit_internship.yaml | Update existing internship | edit_internship |
| Bulk Mark Inactive | bulk_mark_inactive.yaml | Mark multiple listings inactive | bulk_mark_inactive |
| Miscellaneous | misc.yaml | Questions, bugs, etc. | misc |
| Feature Suggestion | feature_suggestion.yaml | Improvements to repo | enhancement |
Processing Issues
- Review the submission to ensure fields are correct and the internship fits the repo theme
- If issues exist, respond explaining what needs to be changed
- If no issues, add the
approvedlabel to trigger the GitHub Action - If the action fails, it will comment on the issue with the error
- If successful, the issue is auto-closed and changes are reflected in
listings.json
GitHub Actions
Contribution Approved (.github/workflows/contribution_approved.yml):
- Triggered when
approvedlabel is added to an issue - Runs
main.py contribution processto extract issue data and updatelistings.json - Commits changes with contributor attribution
- Auto-closes the issue
Update READMEs (.github/workflows/update_readmes.yml):
- Triggered on changes to
listings.jsonor manually - Runs
main.py readme updateto regenerate README tables - Commits and pushes changes
Lint (.github/workflows/lint.yml):
- Triggered on changes to Python code
- Runs ruff and mypy checks
External Script
A private script runs externally once per day to:
- Pull new internships from Simplify's database
- Add them to
listings.json
Code Contribution
This section is for developers who want to contribute to the codebase itself (the list-updater CLI tool).
Requirements
- Python 3.12+
- uv package manager
Installation
From the repository root:
uv sync
CLI Usage
uv run python main.py <group> <command> [options]
The CLI uses grouped subcommands. Use --help on any command for details:
uv run python main.py --help
uv run python main.py listings --help
README Commands
# Update README files from listings.json
uv run python main.py readme update
Contribution Commands
# Process an approved contribution issue
uv run python main.py contribution process <event_file>
Listings Commands
# Bulk mark listings as inactive
uv run python main.py listings mark-inactive <event_file>
# Show listing statistics
uv run python main.py listings stats
uv run python main.py listings stats --json
# Validate listings.json schema and data
uv run python main.py listings validate
uv run python main.py listings validate --fix
# Search and filter listings
uv run python main.py listings search --company "Google"
uv run python main.py listings search --category "Software" --active
uv run python main.py listings search --location "Remote" --limit 50
# Show changes 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
# Interactively fix issues in listings.json
uv run python main.py listings fix
uv run python main.py listings fix --dry-run # Preview without saving
uv run python main.py listings fix --type empty # Only fix empty fields
uv run python main.py listings fix --type duplicate # Only fix duplicates
uv run python main.py listings fix --auto # Auto-accept all recommended fixes
uv run python main.py listings fix --auto --dry-run # Preview auto-fixes
The fix command walks through issues one-by-one, prompting for action:
- Empty titles: fix, hide, delete, or skip
- Invalid categories: set to "Other" or custom
- Duplicate URLs/IDs: choose which to keep (prefers Simplify-sourced listings)
- Blocked companies: hide or delete
Project Structure
/
βββ main.py # CLI entry point (Typer)
βββ pyproject.toml # Project configuration
βββ list_updater/ # Core library
β βββ __init__.py
β βββ analytics.py # Stats, validate, search, diff commands
β βββ category.py # Job category classification
β βββ commands.py # Core CLI commands
β βββ constants.py # Configuration constants
β βββ formatter.py # Table/markdown formatting
β βββ github.py # GitHub Actions utilities
β βββ listings.py # Listing data operations
β βββ readme.py # README generation
βββ .github/
βββ scripts/
βββ listings.json # Internship data
Development
Linting
uv run ruff check .
uv run ruff format .
Type Checking
uv run mypy .
GitHub Actions Integration
The CLI is used in GitHub Actions workflows:
- name: Process contribution
run: uv run main.py contribution process $GITHUB_EVENT_PATH
- name: Update READMEs
run: uv run main.py readme update
Outputs are set via GITHUB_OUTPUT:
commit_message: Suggested commit messagecommit_email: Contributor email (for attribution)commit_username: Contributor usernamesummary_comment: Summary for bulk operationserror_message: Error details (on failure)