├── .github ├── ISSUE_TEMPLATE │ ├── edit_role.yaml │ ├── feature_suggestion.yaml │ ├── misc.yaml │ └── new_role.yaml ├── scripts │ ├── contribution_approved.py │ ├── listings.json │ ├── update_readmes.py │ └── util.py └── workflows │ ├── contribution_approved.yml │ └── update_readmes.yml ├── .gitignore ├── CONTRIBUTING.md ├── Canada.md └── README.md /.github/ISSUE_TEMPLATE/edit_role.yaml: -------------------------------------------------------------------------------- 1 | name: Edit Role 2 | description: Edit a Job Posting on our list 3 | title: "Editing Role" 4 | labels: ["edit_role"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Edit Job Posting Form 10 | Thanks for taking the time to contribute! 11 | Make sure you've read `CONTRIBUTING.md` before submitting your edits 12 | Please only fill in **link, reason, and whichever fields you would like to edit** 13 | You may leave the others empty 14 | - type: input 15 | id: url 16 | attributes: 17 | label: Link to Job Posting 18 | placeholder: ex. example.com/link/to/posting 19 | validations: 20 | required: true 21 | - type: input 22 | id: company_name 23 | attributes: 24 | label: Company Name 25 | placeholder: ex. Google 26 | validations: 27 | required: false 28 | - type: input 29 | id: title 30 | attributes: 31 | label: Job Title 32 | placeholder: ex. ML Software Engineer 33 | validations: 34 | required: false 35 | - type: input 36 | id: location 37 | attributes: 38 | label: Location 39 | description: | 40 | Where is the job located? 41 | Please separate locations with a pipe "|" if there are multiple options. 42 | Include Remote if remote option available. 43 | placeholder: ex. San Franciso, CA | Austin, TX | Remote 44 | validations: 45 | required: false 46 | - type: dropdown 47 | id: sponsorship 48 | attributes: 49 | label: Does this job offer sponsorship? 50 | description: | 51 | If the posting does not fall into one of these 52 | categories, select "Other" then specify in parentheses at the end of 53 | the Job Title what the sponsorship status is 54 | multiple: false 55 | options: 56 | - Offers Sponsorship 57 | - Does Not Offer Sponsorship 58 | - U.S. Citizenship is Required 59 | - Other 60 | validations: 61 | required: false 62 | - type: dropdown 63 | id: active 64 | attributes: 65 | label: Is this job posting currently accepting applications? 66 | description: Mark this as "false" if the job is no longer active. 67 | multiple: false 68 | options: 69 | - "Yes" 70 | - "No" 71 | validations: 72 | required: false 73 | - type: checkboxes 74 | id: is_visible 75 | attributes: 76 | label: Permanently remove this job from the list? 77 | description: Only check this box if this job is fake, does not fit the theme of the repo, or is offensive. DO NOT check this box for jobs that are no longer active 78 | options: 79 | - label: "Yes, remove this job" 80 | - type: input 81 | id: email 82 | attributes: 83 | label: Email associated with your GitHub account (Optional) 84 | description: | 85 | If you would like to be listed as the contributor to the repository when our github action 86 | commits your contribution to the repo, please provide your email. This is the only time your 87 | email will be used. If left blank, your contribution will still be made, but it will be made 88 | by the bot actions@github.com. 89 | placeholder: ex. firstLast@gmail.com 90 | validations: 91 | required: false 92 | - type: textarea 93 | id: reason 94 | attributes: 95 | label: Reason for edit 96 | description: If the reason for your edit is not obvious, please explain here. 97 | placeholder: This job is no longer accepting applications... 98 | validations: 99 | required: false -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_suggestion.yaml: -------------------------------------------------------------------------------- 1 | name: New Feature Request 2 | description: Submit your ideas for improvements to the repo! 3 | title: "New Feature Request" 4 | labels: ["enhancement"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to suggest a new feature or improvement 10 | - type: textarea 11 | id: improvement 12 | attributes: 13 | label: Improvement 14 | placeholder: ex. I think the repo should be more colorful... 15 | validations: 16 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/misc.yaml: -------------------------------------------------------------------------------- 1 | name: Miscellaneous Issue 2 | description: Ask us a question or tell us what we could do better 3 | title: "Misc Issue" 4 | labels: ["misc"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to give us feedback 10 | - type: textarea 11 | id: misc 12 | attributes: 13 | label: Issue/Question 14 | description: Ask us a question or tell us what we could do better 15 | placeholder: ex. There are a few jobs that aren't actually technical... 16 | validations: 17 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new_role.yaml: -------------------------------------------------------------------------------- 1 | name: New Role 2 | description: Contribute a Job Posting to our list 3 | title: "New Role" 4 | labels: ["new_role"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## New Job Posting Contribution Form 10 | Thanks for taking the time to contribute! 11 | > Make sure you've read `CONTRIBUTING.md` before submitting your internship 12 | - type: input 13 | id: url 14 | attributes: 15 | label: Link to Job Posting 16 | placeholder: ex. example.com/link/to/posting 17 | validations: 18 | required: true 19 | - type: input 20 | id: company_name 21 | attributes: 22 | label: Company Name 23 | placeholder: ex. Google 24 | validations: 25 | required: true 26 | - type: input 27 | id: title 28 | attributes: 29 | label: Job Title 30 | placeholder: ex. ML Software Engineer 31 | validations: 32 | required: true 33 | - type: input 34 | id: location 35 | attributes: 36 | label: Location 37 | description: | 38 | Where is the job located? 39 | Please separate locations with a pipe "|" if there are multiple options. 40 | Include Remote if remote option available. 41 | placeholder: San Franciso, CA | Austin, TX | Remote 42 | validations: 43 | required: true 44 | - type: dropdown 45 | id: sponsorship 46 | attributes: 47 | label: Does this job offer sponsorship? 48 | description: | 49 | If the posting does not fall into one of these 50 | categories, select "Other" then specify in parentheses at the end of 51 | the Internship Title what the sponsorship status is 52 | multiple: false 53 | options: 54 | - Offers Sponsorship 55 | - Does Not Offer Sponsorship 56 | - U.S. Citizenship is Required 57 | - Other 58 | validations: 59 | required: true 60 | - type: dropdown 61 | id: active 62 | attributes: 63 | label: Is this internship currently accepting applications? 64 | multiple: false 65 | options: 66 | - "Yes" 67 | - "No" 68 | validations: 69 | required: true 70 | - type: input 71 | id: email 72 | attributes: 73 | label: Email associated with your GitHub account (Optional) 74 | description: | 75 | If you would like to be listed as the contributor to the repository when our github action 76 | commits your contribution to the repo, please provide your email. This is the only time your 77 | email will be used. If left blank, your contribution will still be made, but it will be made 78 | by the bot actions@github.com. 79 | placeholder: ex. firstLast@gmail.com 80 | validations: 81 | required: false 82 | - type: textarea 83 | id: reason 84 | attributes: 85 | label: Extra Notes (Optional) 86 | description: | 87 | Optionally, you may provide extra context/insights to our team about the job. 88 | This will not be shown anywhere on the repo, but might ensure your contribution is accepted. 89 | placeholder: This is an exciting new company in the vr space... 90 | validations: 91 | required: false -------------------------------------------------------------------------------- /.github/scripts/contribution_approved.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import json 3 | import subprocess 4 | import sys 5 | import uuid 6 | from datetime import datetime 7 | import os 8 | import util 9 | import re 10 | 11 | 12 | def add_https_to_url(url): 13 | if not url.startswith(("http://", "https://")): 14 | url = "https://" + url 15 | return url 16 | 17 | 18 | def getData(body, is_edit, username): 19 | data = {} 20 | lines = [text.strip("# ") for text in re.split('[\n\r]+', body)] 21 | #["Company Name", "_No response_", "Internship Title", "_No response_", "Link to Internship Posting", "example.com/link/to/posting", "Locatio", "San Franciso, CA | Austin, TX | Remote" ,"What term(s) is this internship offered for?", "_No response_"] 22 | 23 | data["date_updated"] = int(datetime.now().timestamp()) 24 | 25 | if "no response" not in lines[1].lower(): 26 | data["url"] = add_https_to_url(lines[1].strip()) 27 | if "no response" not in lines[3].lower(): 28 | data["company_name"] = lines[3] 29 | if "no response" not in lines[5].lower(): 30 | data["title"] = lines[5] 31 | if "no response" not in lines[7].lower(): 32 | data["locations"] = [line.strip() for line in lines[7].split("|")] 33 | if "no response" not in lines[9].lower(): 34 | data["sponsorship"] = "Other" 35 | for option in ["Offers Sponsorship", "Does Not Offer Sponsorship", "U.S. Citizenship is Required"]: 36 | if option in lines[9]: 37 | data["sponsorship"] = option 38 | if "none" not in lines[11].lower(): 39 | data["active"] = "yes" in lines[11].lower() 40 | if is_edit: 41 | data["is_visible"] = "[x]" not in lines[13].lower() 42 | 43 | email = lines[15 if is_edit else 13].lower() 44 | if "no response" not in email: 45 | util.setOutput("commit_email", email) 46 | util.setOutput("commit_username", username) 47 | else: 48 | util.setOutput("commit_email", "action@github.com") 49 | util.setOutput("commit_username", "GitHub Action") 50 | 51 | return data 52 | 53 | 54 | def main(): 55 | event_file_path = sys.argv[1] 56 | 57 | with open(event_file_path) as f: 58 | event_data = json.load(f) 59 | 60 | 61 | # CHECK IF NEW OR OLD JOB 62 | 63 | new_role = "new_role" in [label["name"] for label in event_data["issue"]["labels"]] 64 | edit_role = "edit_role" in [label["name"] for label in event_data["issue"]["labels"]] 65 | 66 | if not new_role and not edit_role: 67 | util.fail("Only new_role and edit_role issues can be approved") 68 | 69 | 70 | # GET DATA FROM ISSUE FORM 71 | 72 | issue_body = event_data['issue']['body'] 73 | issue_user = event_data['issue']['user']['login'] 74 | 75 | data = getData(issue_body, is_edit=edit_role, username=issue_user) 76 | 77 | if new_role: 78 | data["source"] = issue_user 79 | data["id"] = str(uuid.uuid4()) 80 | data["date_posted"] = int(datetime.now().timestamp()) 81 | data["company_url"] = "" 82 | data["is_visible"] = True 83 | 84 | # remove utm-source 85 | utm = data["url"].find("?utm_source") 86 | if utm == -1: 87 | utm = data["url"].find("&utm_source") 88 | if utm != -1: 89 | data["url"] = data["url"][:utm] 90 | 91 | 92 | # UPDATE LISTINGS 93 | 94 | listings = [] 95 | with open(".github/scripts/listings.json", "r") as f: 96 | listings = json.load(f) 97 | 98 | listing_to_update = next( 99 | (item for item in listings if item["url"] == data["url"]), None) 100 | if listing_to_update: 101 | if new_role: 102 | util.fail("This role is already in our list. See CONTRIBUTING.md for how to edit a listing") 103 | for key, value in data.items(): 104 | listing_to_update[key] = value 105 | 106 | util.setOutput("commit_message", "updated listing: " + listing_to_update["title"] + " at " + listing_to_update["company_name"]) 107 | else: 108 | if edit_role: 109 | util.fail("We could not find this role in our list. Please double check you inserted the right url") 110 | listings.append(data) 111 | util.setOutput("commit_message", "added listing: " + data["title"] + " at " + data["company_name"]) 112 | 113 | with open(".github/scripts/listings.json", "w") as f: 114 | f.write(json.dumps(listings, indent=4)) 115 | 116 | 117 | if __name__ == "__main__": 118 | main() -------------------------------------------------------------------------------- /.github/scripts/update_readmes.py: -------------------------------------------------------------------------------- 1 | import json 2 | from datetime import datetime 3 | import os 4 | import util 5 | import re 6 | 7 | 8 | def main(): 9 | 10 | listings = util.getListingsFromJSON() 11 | 12 | util.checkSchema(listings) 13 | filtered = util.filterListings(listings, earliest_date=1714528377) 14 | 15 | util.sortListings(filtered) 16 | util.embedTable(filtered) 17 | 18 | util.setOutput("commit_message", "Updating README at " + datetime.now().strftime("%B %d, %Y %H:%M:%S")) 19 | 20 | 21 | if __name__ == "__main__": 22 | main() -------------------------------------------------------------------------------- /.github/scripts/util.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from datetime import date, datetime, timezone, timedelta 4 | import random 5 | import os 6 | 7 | # SIMPLIFY_BUTTON = "https://i.imgur.com/kvraaHg.png" 8 | SHORT_APPLY_BUTTON = "https://i.imgur.com/w6lyvuC.png" 9 | LONG_APPLY_BUTTON = "https://i.imgur.com/u1KNU8z.png" 10 | 11 | 12 | def setOutput(key, value): 13 | with open(os.environ['GITHUB_OUTPUT'], 'a') as fh: 14 | print(f'{key}={value}', file=fh) 15 | 16 | def fail(why): 17 | setOutput("error_message", why) 18 | exit(1) 19 | 20 | def getLocations(listing): 21 | locations = "
".join(listing["locations"]) 22 | if len(listing["locations"]) <= 3: 23 | return locations 24 | num = str(len(listing["locations"])) + " locations" 25 | return f'
**{num}**{locations}
' 26 | 27 | def getSponsorship(listing): 28 | if listing["sponsorship"] == "Does Not Offer Sponsorship": 29 | return " 🛂" 30 | elif listing["sponsorship"] == "U.S. Citizenship is Required": 31 | return " 🇺🇸" 32 | return "" 33 | 34 | def getLink(listing): 35 | if not listing["active"]: 36 | return "🔒" 37 | link = listing["url"] 38 | if "?" not in link: 39 | link += "?utm_source=cvrve" 40 | else: 41 | link += "&utm_source=cvrve&ref=cvrve" 42 | # return f'Apply' 43 | 44 | if listing["source"] != "cvrve": 45 | return f'Apply' 46 | 47 | return f'Apply' 48 | 49 | 50 | def create_md_table(listings): 51 | table = "" 52 | table += "| Company | Role | Location | Application/Link | Date Posted |\n" 53 | table += "| --- | --- | --- | :---: | :---: |\n" 54 | for listing in listings: 55 | company_url = listing["company_url"] 56 | company = listing["company_name"] 57 | company = f"[{company}]({company_url})" if len( 58 | company_url) > 0 and listing["active"] else company 59 | location = getLocations(listing) 60 | position = listing["title"] + getSponsorship(listing) 61 | link = getLink(listing) 62 | month = datetime.fromtimestamp(listing["date_posted"]).strftime('%b') 63 | dayMonth = datetime.fromtimestamp(listing["date_posted"]).strftime('%b %d') 64 | isBeforeJuly18 = datetime.fromtimestamp(listing["date_posted"]) < datetime(2023, 7, 18, 0, 0, 0) 65 | datePosted = month if isBeforeJuly18 else dayMonth 66 | table += f"| **{company}** | {position} | {location} | {link} | {datePosted} |\n" 67 | # table += f"| **{company}** | {location} | {position} | {link} | {status} | {datePosted} |\n" 68 | return table 69 | 70 | def filterListings(listings, earliest_date): 71 | final_listings = [] 72 | inclusion_terms = ["software eng", "software dev", "data scientist", "data engineer", "product manage", "apm", "frontend", "front end", "front-end", "backend", "back end", "full-stack", "full stack", "full-stack", "devops", "android", "ios", "mobile dev", "sre", "site reliability eng", "quantitative trad", "quantitative research", "quantitative trad", "quantitative dev", "security eng", "compiler eng", "machine learning eng", "infrastructure eng"] 73 | new_grad_terms = ["new grad", "early career", "college grad", "entry level", "early in career", "university grad", "fresh grad", "2024 grad", "2025 grad", "engineer 0", "engineer 1", "engineer i ", "junior"] 74 | for listing in listings: 75 | if listing["is_visible"] and listing["date_posted"] > earliest_date: 76 | if listing['source'] != "Simplify" or (any(term in listing["title"].lower() for term in inclusion_terms) and (any(term in listing["title"].lower() for term in new_grad_terms) or (listing["title"].lower().endswith("engineer i")))): 77 | final_listings.append(listing) 78 | 79 | return final_listings 80 | 81 | def getListingsFromJSON(filename=".github/scripts/listings.json"): 82 | with open(filename) as f: 83 | listings = json.load(f) 84 | print("Recieved " + str(len(listings)) + 85 | " listings from listings.json") 86 | return listings 87 | 88 | 89 | def embedTable(listings): 90 | canada_listings = [listing for listing in listings if "Canada" in getLocations(listing)] 91 | other_listings = [listing for listing in listings if "Canada" not in getLocations(listing)] 92 | 93 | # Write to Canada.md 94 | if canada_listings: 95 | filepath = "Canada.md" 96 | newText = "" 97 | readingTable = False 98 | with open(filepath, "r") as f: 99 | for line in f.readlines(): 100 | if readingTable: 101 | if "|" not in line and "TABLE_END" in line: 102 | newText += line 103 | readingTable = False 104 | continue 105 | else: 106 | newText += line 107 | if "TABLE_START" in line: 108 | readingTable = True 109 | newText += "\n" + create_md_table(canada_listings) + "\n" 110 | with open(filepath, "w") as f: 111 | f.write(newText) 112 | 113 | # Write to README.md 114 | filepath = "README.md" 115 | newText = "" 116 | readingTable = False 117 | with open(filepath, "r") as f: 118 | for line in f.readlines(): 119 | if readingTable: 120 | if "|" not in line and "TABLE_END" in line: 121 | newText += line 122 | readingTable = False 123 | continue 124 | else: 125 | newText += line 126 | if "TABLE_START" in line: 127 | readingTable = True 128 | newText += "\n" + create_md_table(other_listings) + "\n" 129 | with open(filepath, "w") as f: 130 | f.write(newText) 131 | 132 | def sortListings(listings): 133 | oldestListingFromCompany = {} 134 | linkForCompany = {} 135 | for listing in listings: 136 | date_posted = listing["date_posted"] 137 | if listing["company_name"].lower() not in oldestListingFromCompany or oldestListingFromCompany[listing["company_name"].lower()] > date_posted: 138 | oldestListingFromCompany[listing["company_name"].lower()] = date_posted 139 | if listing["company_name"] not in linkForCompany or len(listing["company_url"]) > 0: 140 | linkForCompany[listing["company_name"]] = listing["company_url"] 141 | 142 | listings.sort( 143 | key=lambda x: ( 144 | x["active"], # Active listings first 145 | datetime( 146 | datetime.fromtimestamp(x["date_posted"]).year, 147 | datetime.fromtimestamp(x["date_posted"]).month, 148 | datetime.fromtimestamp(x["date_posted"]).day 149 | ), 150 | x['company_name'].lower(), 151 | x['date_updated'] 152 | ), 153 | reverse=True 154 | ) 155 | for listing in listings: 156 | listing["company_url"] = linkForCompany[listing["company_name"]] 157 | return listings 158 | 159 | def checkSchema(listings): 160 | props = ["source", "company_name", 161 | "id", "title", "active", "date_updated", "is_visible", 162 | "date_posted", "url", "locations", "company_url", 163 | "sponsorship"] 164 | for listing in listings: 165 | for prop in props: 166 | if prop not in listing: 167 | fail("ERROR: Schema check FAILED - object with id " + 168 | listing["id"] + " does not contain prop '" + prop + "'") -------------------------------------------------------------------------------- /.github/workflows/contribution_approved.yml: -------------------------------------------------------------------------------- 1 | name: Contribution Approved 2 | 3 | on: 4 | issues: 5 | types: ["labeled"] 6 | 7 | concurrency: add_internships 8 | 9 | jobs: 10 | run-python-script: 11 | runs-on: ubuntu-latest 12 | if: github.event.label.name == 'approved' 13 | 14 | steps: 15 | - name: Checkout Repository 16 | uses: actions/checkout@v3 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v3 20 | with: 21 | python-version: "3.9" 22 | 23 | - name: execute contribution_approved.py 24 | id: python_script 25 | env: 26 | GITHUB_EVENT_PATH: ${{ github.event_path }} 27 | run: python .github/scripts/contribution_approved.py $GITHUB_EVENT_PATH 28 | 29 | - name: execute update_readmes.py 30 | id: python_script_readme 31 | run: python .github/scripts/update_readmes.py 32 | 33 | - name: commit files 34 | if: success() 35 | run: | 36 | git config --local user.email ${{ steps.python_script.outputs.commit_email }} 37 | git config --local user.name ${{ steps.python_script.outputs.commit_username }} 38 | git add .github/scripts/listings.json 39 | git add README.md 40 | git diff-index --quiet HEAD || (git commit -a -m "${{ steps.python_script.outputs.commit_message }}" --allow-empty) 41 | 42 | - name: push changes 43 | if: success() 44 | uses: ad-m/github-push-action@v0.6.0 45 | with: 46 | github_token: ${{ secrets.GITHUB_TOKEN }} 47 | branch: dev 48 | 49 | - name: Auto Close Issue 50 | run: gh issue close --comment "Your contribution was accepted. Auto-closing issue" ${{ github.event.issue.number }} 51 | if: success() 52 | env: 53 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 54 | 55 | - name: Problem With Action 56 | run: gh issue comment ${{ github.event.issue.number }} --body "There was an error with our github action. Error - ${{ steps.python_script.outputs.error_message }} ${{ steps.python_script_readme.outputs.error_message }}" 57 | if: failure() 58 | env: 59 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/update_readmes.yml: -------------------------------------------------------------------------------- 1 | name: Update READMEs 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/scripts/listings.json' 7 | workflow_dispatch: 8 | 9 | concurrency: 10 | group: listings_update 11 | cancel-in-progress: true 12 | 13 | 14 | jobs: 15 | run-python-script: 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout Repository 20 | uses: actions/checkout@v3 21 | 22 | - name: Set up Python 23 | uses: actions/setup-python@v3 24 | with: 25 | python-version: "3.9" 26 | 27 | - name: execute update_readmes.py 28 | id: python_script 29 | run: python .github/scripts/update_readmes.py 30 | 31 | - name: commit files 32 | if: success() 33 | run: | 34 | git config --local user.email action@github.com 35 | git config --local user.name 'Github Action' 36 | git add README.md 37 | git diff-index --quiet HEAD || (git commit -a -m "${{ steps.python_script.outputs.commit_message }}" --allow-empty) 38 | 39 | - name: push changes 40 | if: success() 41 | uses: ad-m/github-push-action@v0.6.0 42 | with: 43 | github_token: ${{ secrets.GITHUB_TOKEN }} 44 | branch: dev 45 | 46 | - name: Problem With Action 47 | run: echo "There was an error with the github action. ${{ steps.python_script.outputs.error_message }}" 48 | if: failure() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | testing/ -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the Job List 2 | Thank you for your interest in contributing to the new-grad job list! 3 | 4 | Below, you'll find the guidelines for our repository. If you have any questions, please create a [miscellaneous issue](https://github.com/cvrve/New-Grad/issues/new/choose). 5 | 6 | ## Finding a Job to Add 7 | We ask that the jobs openings that you add meet some requirements. Specifically, your posting must 8 | - be in one of the following categories: 9 | - software/computer engineering 10 | - computer/data science 11 | - product management 12 | - quant 13 | - any other tech-related field 14 | - be for recently graduated students 15 | - be located in the United States, Canada, or remote. 16 | - not already exist in the list. 17 | 18 | ## Adding a Job 19 | Cool! You're ready to add a job to the list. Follow these steps: 20 | 21 | 1) First create a new issue [here](https://github.com/cvrve/New-Grad/issues/new/choose). 22 | 2) Select the **New Role** issue template. 23 | 3) Fill in the information about your job opening into the form, then hit submit. 24 | > Please make a new submission for each unique position, **even if they are for the same company**. 25 | 4) That's it! Once a member of our team has reviewed your submission, it will be automatically added to the `README` 26 | 27 | ## Editing a Job 28 | To edit a job posting (changing name, setting as inactive, removing, etc.), follow these steps: 29 | 1) First copy the url of the job you would like to edit. 30 | > This can be found by right-clicking on the `APPLY` button and selecting **copy link address** 31 | 2) Create a new issue [here](https://github.com/cvrve/New-Grad/issues/new/choose). 32 | 3) Select the **Edit Role** issue template. 33 | 4) Fill in the url to the **link** input. 34 | > This is how we ensure your edit affects the correct job posting 35 | 5) Leave every other input blank except for whichever fields you would like to update or change about the role. 36 | 6) If it is not obvious why you are making these edits, please specify why in the reason box at the bottom of the form. 37 | 7) Hit submit. A member of our team will review your revision and approve it shortly. -------------------------------------------------------------------------------- /Canada.md: -------------------------------------------------------------------------------- 1 | # Canadian New Grad Positions by V 2 | 3 | Use this repo to share and keep track of entry-level software, tech, CS, PM, quant jobs for 2024 & 2025 new graduates. 4 | 5 | The list is maintained collaboratively by [WeCracked](https://wecracked.com/) and [Resumes.fyi](https://resumes.fyi/)! 6 | 7 | :warning: Please note that this page is exclusively for roles in Canada, or Remote positions :earth_americas: 8 | 9 | 🙏 **Contribute by submitting an [issue](https://github.com/cvrve/New-Grad/issues/new/choose)! See the contribution guidelines [here](./CONTRIBUTING.md)!** 🙏 10 | 11 | This repo is inspired by [Pitt CSC & Simplify Repo](https://github.com/SimplifyJobs/New-Grad-2025). 12 | 13 | --- 14 | 15 |
16 |

Want notifications when new roles open?

17 |

18 | Join the ⬇️ discord ⬇️ and get your applications in right when they open! 19 | 20 | 21 |
22 |

23 | 24 | cvrve 25 | 26 |
27 | 28 | Join the Discord to connect with fellow peers and streamline your newgrad search. 29 |

30 |
31 | 32 | --- 33 | 34 | ## The List 🚴🏔 35 | 36 | - 🛂 - Does NOT offer Sponsorship 37 | - 🇨🇦 - Requires Canadian Citizenship 38 | - 🔒 - Job application is closed 39 | 40 | [⬇️ Jump to bottom ⬇️](https://github.com/cvrve/New-Grad#we-love-our-contributors-%EF%B8%8F%EF%B8%8F) 41 | 42 | 43 | | Company | Role | Location | Application/Link | Date Posted | 44 | | --- | --- | --- | :---: | :---: | 45 | | **Nokia** | Jr. Applied R&D Engineer | Canada | Apply | May 15 | 46 | | **Mastercard** | Software Engineer I | Vancouver, Canada | Apply | May 15 | 47 | | **Google** | Relations Developer, Cloud and Generative AI |
**7 locations**Seattle, WA
Cambridge, MA
Kirkland, WA
New York, NY
San Francisco, CA
Sunnyvale, CA
Toronto, Canada
| Apply | May 15 | 48 | | **Electronic Arts** | Gameplay Software Engineer | Vancouver, Canada | Apply | May 15 | 49 | | **Tower Research Capital** | New Grad: C++ Software Engineer, MTL | Montreal, Canada | Apply | May 03 | 50 | | **Oracle** | Software Developer | Remote
Canada | Apply | Apr 19 | 51 | | **Oracle** | Software Developer - Rotational Program - NetSuite | Kitchiner, Canada | Apply | Apr 19 | 52 | | **Canonical** | Graduate Software Engineer, Open Source and Linux, Canonical Ubuntu | Remote
Toronto, Canada | Apply | Apr 19 | 53 | | **Applied Systems** | Software Engineer | Toronto, Canada | Apply | Apr 14 | 54 | | **Amazon** | New Grad 2025: Software Development Engineer I | Vancouver, BC
Toronto, Canada | Apply | Apr 12 | 55 | | **Secoda** | New Grad Software Engineer | Toronto, Canada | Apply | Feb 25 | 56 | | **Wanderlog - YC** | New Grad: Full-Stack Software Engineer | Remote
Canada | Apply | Feb 18 | 57 | | **Qualcomm** | Machine Learning Framework, Compiler & Performance Engineer | Markham, Canada | Apply | Feb 16 | 58 | | **IBM** | Software Engineer | Markham, Canada | Apply | Feb 16 | 59 | | **Amazon** | System Development Engineer, AWS Security | Toronto, Canada | Apply | Feb 16 | 60 | | **Qualcomm** | DSP Systems Engineer | Markham, Canada | Apply | Feb 05 | 61 | | **Linamar Corporation** | Jr. Security Engineer | Guelph, Canada | Apply | Feb 05 | 62 | | **Intact** | New Grad Tech Development Program | Montreal, Canada
Toronto, Canada | Apply | Feb 05 | 63 | | **Canadalife** | Software Developer | London, Canada
Winnipeg, MB
Toronto, ON | Apply | Feb 05 | 64 | | **Coalition** | Software Engineer, Servicing | Canada
United States | Apply | Jan 16 | 65 | | **ExxonMobil** | New Grad: Software Developer | Calgary, Canada | Apply | Jan 01 | 66 | | **Quora** | New Grad 2025: Machine Learning Engineer | Remote
US
Canada | Apply | Dec 24 | 67 | | **Amazon** | New Grad 2025: Front-End Engineer | Vancouver, Canada | Apply | Nov 11 | 68 | | **Epic Games** | Desktop Platform Programmer | Montréal, Canada | Apply | Oct 14 | 69 | | **Uber** | New Grad 2024: Software Engineer I, TOR | Toronto, Canada | Apply | Oct 05 | 70 | | **Ciena** | Software Performance Engineer | Ottawa, Canada | Apply | Sep 18 | 71 | | **Capital One** | New Grad: Software Engineer | Toronto, Canada | Apply | Aug 31 | 72 | | **Intelliware** | New Grad: Junior Software Developer | Toronto, Canada | Apply | Aug 21 | 73 | | **Konrad** | New Grad: Software Developer | Vancouver, Canada | Apply | Aug 06 | 74 | | **Warp** | Software Engineer | Remote US & Canada | Apply | Jul 10 | 75 | | **TD Bank** | Software Engineer I | Toronto, Canada | 🔒 | May 23 | 76 | | **Cloudflare** | Software Engineer, Experiment and Data Capture |
**5 locations**Austin, TX
Atlanta, GA
Denver, CO
Washington D.C., DC
Toronto, Canada
| 🔒 | May 23 | 77 | | **Affirm** | Machine Learning Engineer | Remote
Canada | 🔒 | May 19 | 78 | | **Marqeta** | Software Engineer I, Transaction Engine Foundation | Toronto, Canada
Vancouver, Canada | 🔒 | May 17 | 79 | | **Marqeta** | Software Engineer I, Core Edge Processing | Toronto, Canada
Vancouver, Canada | 🔒 | May 17 | 80 | | **Crowdstrike** | New Grad 2025: Machine Learning Software Engineer | Remote
US
Canada | 🔒 | Jan 29 | 81 | | **Capital One** | New Grad: Associate Software Engineer | Toronto, Canada | 🔒 | Jan 16 | 82 | | **Intel** | Junior Compiler Engineer | Toronto, Canada | 🔒 | Dec 22 | 83 | | **IBM** | Software Developer | Markham, Canada | 🔒 | Dec 22 | 84 | | **Vertex** | New Grad 2025: Software Developer | Remote
US
Canada | 🔒 | Dec 15 | 85 | | **Capital One** | New Grad 2025: Associate Data Scientist | Toronto, Canada | 🔒 | Dec 13 | 86 | | **Johnson Controls** | Junior Embedded Software Developer | Ontario, Canada | 🔒 | Dec 11 | 87 | | **Yelp** | Entry Level Software Engineer |
**5 locations**Montreal
Vancouver
Calgary
Toronto
Canada
| 🔒 | Nov 26 | 88 | | **Capital One** | New Grad: Associate Software Engineer | Toronto, Canada | 🔒 | Nov 26 | 89 | | **Crowdstrike** | Software Engineer, Linux | Remote
US
Canada | 🔒 | Nov 19 | 90 | | **Ciena** | New Grad: Routing/IP Software Engineer | Ottawa, Canada | 🔒 | Nov 19 | 91 | | **Samsara** | New Grad: Software Engineer | Remote
Canada | 🔒 | Oct 22 | 92 | | **Amazon** | Software Dev Engineer I, Redshift | Vancouver, Canada
Toronto, Canada | 🔒 | Oct 15 | 93 | | **Robinhood** | Software Development Engineer in Test | Toronto, Canada | 🔒 | Oct 14 | 94 | | **Quora** | New Grad: Data Scientist, Monetization | Remote
US
Canada | 🔒 | Oct 03 | 95 | | **Tailscale** | Backend Engineer | Remote
Canada | 🔒 | Oct 02 | 96 | | **Coalition** | Software Engineer, Renewals | Canada | 🔒 | Oct 02 | 97 | | **Coalition** | Software Engineer | Canada | 🔒 | Oct 02 | 98 | | **Coalition** | Software Engineer, Renewals | Canada | 🔒 | Oct 02 | 99 | | **Canonical** | Web Frontend Engineer | Vancouver, Canada | 🔒 | Sep 27 | 100 | | **Trend Micro** | Software Developer | Ottawa, Canada | 🔒 | Sep 18 | 101 | | **Mastercard** | Data Scientist I | Vancouver, Canada | 🔒 | Sep 13 | 102 | | **Waabi** | New Grad: Software Engineer | Remote
Canada | 🔒 | Sep 12 | 103 | | **Github** | New Grad: Software Engineer | Remote, Canada | 🔒 | Sep 12 | 104 | | **Clio** | New Grad: Software Developer | Toronto
Calgary
Vancouver, Canada | 🔒 | Sep 11 | 105 | | **Balyasny Asset Management** | New Grad: Commodities Quantitative Analyst | Calgary, Canada | 🔒 | Sep 11 | 106 | | **Bell** | New Grad 2025: Cyber Security Engineer |
**5 locations**Halifax, Canada
Ottawa, Canada
Montreal, Canada
Toronto, Canada
Bedford, Canada
| 🔒 | Sep 03 | 107 | | **Replicant** | New Grad: Software Engineer I | Canada | 🔒 | Sep 01 | 108 | | **Autodesk** | New Grad: Software Development Engineer | Toronto, Canada | 🔒 | Sep 01 | 109 | | **Canonical** | New Grad: Software Engineer | Vancouver, Canada | 🔒 | Aug 20 | 110 | | **Sentry** | New Grad 2025: Software Engineer 🛂 | Toronto, Canada | 🔒 | Aug 06 | 111 | | **Jerry** | Software Engineer I - Toronto | Toronto, ON, Canada | 🔒 | Jul 05 | 112 | 113 | 114 | [⬆️ Back to Top ⬆️](https://github.com/cvrve/New-Grad#the-list-) 115 | 116 | ## We love our contributors ❤️❤️ 117 | 118 | Contribute by submitting an [issue](https://github.com/cvrve/New-Grad/new/choose)! 119 | 120 | 121 | 122 | 123 | --------------------------------------------------------------------------------