├── .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}'
43 |
44 | if listing["source"] != "cvrve":
45 | return f'
'
46 |
47 | return f'
'
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 |
18 | Join the ⬇️ discord ⬇️ and get your applications in right when they open!
19 |
20 |
21 |
22 |
25 |
26 |