Find the community-college course that transfers for the class you need.
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.
- 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.
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 ciRun the site and API locally through Cloudflare Pages:
npm run cf:devnpm run checkThat 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.
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:refreshCreate 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:schemaBuild 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:importRepository 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.
| 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.
Released under the MIT License. That license does not grant rights to third-party data, names, marks, APIs, or website content.