Skip to content

Repository files navigation

FreeCreds

Find the community-college course that transfers for the class you need.

CI Deploy MIT License

FreeCreds helps California students find community-college courses that articulate to a selected university course, with optional term and online-offering filters.

Important

FreeCreds is an independent planning aid, not an official advising service. Results can be delayed, incomplete, or interpreted differently by an institution. Confirm decisions with the relevant colleges and an academic counselor.

Features

  • Look up reverse articulation for CSU, UC, and participating private schools.
  • Handle standalone equivalents and multi-course AND bundles correctly.
  • Filter by current and upcoming terms for CVC-listed online offerings.
  • Serve fast Cloudflare Pages Functions backed by D1.
  • Refresh data on a schedule through GitHub Actions and a Cloudflare Worker.

Run locally

Requirements: Python 3.10+, Node.js 22+, npm, and SQLite.

git clone https://github.com/ivan-grebe/freecreds.git
cd freecreds
python -m pip install -c requirements-dev.lock -e ".[dev]"
npm ci

Run the site and API locally through Cloudflare Pages:

npm run cf:dev

Testing

npm run check

That runs Python lint and tests, TypeScript typechecking, Vitest, and the migration validator. GitHub Actions runs the same checks on every pull request and each push to main.

Deployment

Pushing to main deploys automatically: the deploy workflow runs the full check suite, then publishes the Pages site and the refresh Worker. You can also trigger it manually from the Actions tab.

To deploy by hand instead:

npm run cf:deploy
npm run cf:deploy:refresh

First-time database setup

Create a D1 database, put its ID in wrangler.toml and wrangler.refresh.toml, then apply every migration:

npm run cf:db:create
npm run cf:db:schema

Build a local database and export it in D1-sized chunks:

python -m freecreds.ingester --all
python -m freecreds.cvc_fetcher
npm run cf:db:dump
npm run cf:db:import

Secrets

Repository secrets used by the deploy and refresh workflows:

Secret Purpose
CLOUDFLARE_API_TOKEN Pages and Workers deploys, plus D1 read/write and export
CLOUDFLARE_ACCOUNT_ID Account that owns the database

The scheduled Worker additionally needs GITHUB_TOKEN, GITHUB_OWNER, GITHUB_REPO, and MANUAL_TRIGGER_TOKEN as encrypted Worker secrets. Never commit their values.

For production, configure Cloudflare rate limiting or WAF rules for /api/*, and review logging, caching, analytics, and retention settings.

API

Endpoint Description
GET /universities.json Supported universities
GET /api/terms Current and upcoming terms
GET /api/courses?university=CSUFULL Courses at a university
GET /api/reverse?university=CSUFULL&prefix=MATH&number=170A Articulating community-college courses

The reverse endpoint also supports term, async_only, and standalone_only.

License

Released under the MIT License. That license does not grant rights to third-party data, names, marks, APIs, or website content.

About

Reverse-lookup tool for California community college articulation agreements

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages