pennlabs/penn-courses
pennlabs/penn-courses has 44 GitHub stars and 7 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-09 18:44 UTC. Last push 2026-11-06.
Powering Penn Course Review, Penn Course Plan, Penn Course Alert, and Penn Degree Plan
Measured star growth
- in 24h
- 0
- in 7 days
- Update delayed
- in 15 days
- Update delayed
- in 1 month
- Update delayed
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalPenn Courses
This is the unified home of all Penn Courses products.
Installation & Setup
- Install the backend
- If you need to, install the frontend
Note that you need the backend to run the frontend.
Using Dev Containers
This repository has a built-in dev container that you can use to develop the project. To use it, you need to have Docker and VSCode installed.
Press the remote container button in the bottom left of the window and select "Reopen in Container". This will build the dev container and open the project in a new window.
This container is designed to work with both backend and frontend development. Some additional steps are required, like installing pipenv dependencies and setting up the database and running the frontend server. Please read and follow the instructions in the backend and frontend READMEs.
For more information, visit dev container documentation.
Pushing Code
You can use ssh-add to make your SSH keys available to the dev container. This will allow you to push code to GitHub.
ssh-add ~/.ssh/id_rsa
API Documentation
API Docs can be found at /api/documentation on the back-end server. Also check out the code for more explanations
and documentation! We've tried to keep it up-to-date.
Runbook
This section is to collect thoughts/learnings from the codebase that have been hard-won, so we don't lose a record of it if and when the information proves useful again
Derived fields
Normally, derived fields on models are represented as @property-decorated functions. However, there are a few in
the codebase that need to be accessed on the database layer without JOINs. So that they can be indexed.
Specifically, these are the full_code fields on Course and Section models, which are derived from fields on related
models.
These are updated every time the save() method is called. However, it's possible to get into a state
(such as with db migrations) where full_code isn't set properly.
Open a shell in production, and run this small script:
from tqdm import tqdm
from courses.models import Section, Course
for c in tqdm(Course.objects.all().select_related("department")):
c.save()
for s in tqdm(Section.objects.all().select_related("course")):
s.save()
tqdm will give you a nice progress bar as the script completes. The select_related clause speeds up the query,
avoiding what would be a pretty nasty N+1 scenario.
Explore related projects
freeCodeCamp/freeCodeCamp
freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.
458,826 starsdonnemartin/system-design-primer
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
377,475 starsreact/react
The library for web and native user interfaces.
252,467 starsvuejs/vue
This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core
212,625 stars