Self-hosted service
freelawproject/courtlistener avatar
freelawproject/courtlistener

courtlistener: the open archive behind CourtListener.com

A fully-searchable and accessible archive of court data including growing repositories of opinions, oral arguments, judges, judicial financial records, and federal filings.

1,049 stars282 forksPythonNOASSERTION

At a glance

What is it?
The Free Law Project's courtlistener repository holds the Django code for CourtListener.com, a searchable archive of American court opinions, oral arguments, judges, judicial financial records and federal filings. It suits a developer or legal researcher who wants the data rather than the website, and it is licensed under the AGPL, which shapes what a fork can become.
Who is it for?
Adopt courtlistener if you are building on American court data and want the collection pipeline, the search stack and the archive model rather than only an API client, and you can meet the AGPL's obligations if you deploy a modified version. Skip it if you just need opinions and citations, since the hosted site and its API already exist for that.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A legal data project, not a legal database product

CourtListener.com is the main initiative of the Free Law Project, and it started in 2009. The stated goal is to provide high quality legal data and services, and the project description gives the scope: a fully-searchable and accessible archive of court data including growing repositories of opinions, oral arguments, judges, judicial financial records and federal filings. The primary language is Python, and the Django project in the manifest is named `cl` with a description of a free and powerful system for awareness and research of the American judicial system. The project is not archived, the last push was on 2026-10-19, and the repository has no GitHub releases, which fits a service that is deployed continuously rather than versioned. The homepage is courtlistener.com, and the project is classified as Production/Stable in its package metadata.

Three directories, and 99% of it in one of them

The repository is organised in a way that says what it is. The `cl` directory holds the Django code for the project, and the README notes with typical candour that 99% of everything is in this directory. The `docker` directory holds the compose files and Dockerfiles for the various components, which tells you this is a multi-service deployment rather than a single Django process. And `scripts` holds logrotate, systemd and init scripts for the configurations and daemons, which is the mark of a long-running system with more than one moving part. The top level also carries `manage.py` as the Django entry point, a `pyproject.toml` with a `uv.lock` for dependency pinning, `FRONTEND.md` as a separate document for the frontend, `CLAUDE.md`, `SECURITY.md`, a `.pre-commit-config.yaml`, a `.semgrepignore` and a `.pyrefly-baseline.json` alongside a `pyrefly.toml`, which is a type checker.

The dependency list describes the whole system

The pyproject file is the most informative document in the repository, because the dependencies are the architecture. Django is pinned to `>=6.0.8, <6.1` and the project requires Python `>=3.13,<3.14`, a narrow range that means the deployment is deliberate. Celery and kombu are there, so long-running work is queued, and `djangorestframework` plus `djangorestframework-xml` mean there is an API with two renderers, XML mattering for court data. `django-pghistory` gives change history on PostgreSQL tables, which is a substantial feature for a legal archive where you need to know when a record changed. `django-ratelimit` handles throttling, `django-cache-memoize` and `django-storages` handle caching and object storage, `djangorestframework` and `django-filter` serve the API and its filtering, and `django-localflavor` provides US-specific form fields. Then there is the collection side: `internetarchive` for the Internet Archive, `courts-db` for court metadata, `beautifulsoup4` and `lxml` for parsing, `networkx` for graph work, and `pandas` for data wrangling. The repository also has a `.postgresql/` directory, so PostgreSQL is not optional.

Credentials for the data sources, and what they imply

The `.env.example` file is short and it lists the accounts the system uses to collect data. There are `PACER_USERNAME` and `PACER_PASSWORD`, which are the credentials for the federal filing system, and `LASC_USERNAME` and `LASC_PASSWORD` for another filing source. There are `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` for object storage, with separate dev variants. `HCAPTCHA_SITEKEY` and `HCAPTCHA_SECRET` show that the site runs a captcha. `SENTRY_DSN` is the error reporting hook, `PLAUSIBLE_API_TOKEN` the analytics token, and `IA_ACCESS_KEY` and `IA_SECRET_KEY` the Internet Archive keys. `FTM_KEY` and `CL_API_TOKEN` are there too, the latter described as the token for cloning data. The presence of a captcha and of site keys tells you the public site is defended against automated access, so a bulk consumer should use the API rather than scrape the site, and the `CL_API_TOKEN` for cloning data is the sanctioned path.

Contributing is organised around labels and ownership

The contribution model is worth reading, because it says how the project actually gets work done. The README says they love volunteers and work with them regularly, and points at a volunteer information page on free.law. The key detail is that every issue is assigned to somebody, so if you find an issue that looks interesting you can chime in and say you want to take it over, and usually they are happy to hand things off. The issue tracker has labels for help wanted and for data quality, which is a telling pair. A data quality label means someone triaging the backlog can point at the records that need checking, and the data is the product here, so a labelled data-quality issue is real work with a real audience rather than a chore. The developer guide lives on the Free Law Project wiki at wiki.free.law, and the issue tracker and the volunteer page are the two doors into the project.

The AGPL, and what it means for a fork

The licence is the constraint that shapes reuse. All materials in the repository are copyright Free Law Project under the Affero GPL, with details in LICENSE.txt, and the package metadata says AGPL-3.0-only with the classifier for the GNU Affero General Public License v3. The AGPL is the GPL with one extra clause, and that clause is the one to think about here. If you modify the program and let other users interact with it remotely, over a network, you owe them the source of your modified version. For a web service, that means a hosted fork of CourtListener has to publish its changes, which is a different obligation from what the plain GPL asks of a distributed binary. For a lawyer or a nonprofit that wants to run their own instance and add features, that is a genuine obstacle, and it is worth knowing before designing around the code rather than after. The alternative is to use the hosted service and its API, which the project provides and which the CL_API_TOKEN is for.

What you get and what you have to build

The honest framing is that this repository is a working production service, not a library you install, and the README does not publish an install command. The project's own guidance for running the code is the developer guide on the Free Law Project wiki, with the compose files and Dockerfiles in the `docker` directory for the various components. What you can see in the repository is the environment the service expects, and the `.env.example` file is the shape of it:

code
DEBUG=on
DEVELOPMENT=on
PACER_USERNAME=""
PACER_PASSWORD=""
LASC_USERNAME=""
LASC_PASSWORD=""
CL_API_TOKEN=""
SITEMAPS_FILES_PER_CALL=10

The honest framing is that this repository is a working production service, not a library you install. There is no pip package for CourtListener, no settings you point at a database and go, and the pyproject describes a project rather than a distribution, with the Django project name `cl` and a version of `1` that is not a real release scheme. The docker directory holds compose files for the various components, so the intended way to run it is to assemble the stack yourself, and the scripts directory holds the systemd and logrotate configuration for the daemons, which tells you that in production this runs as several long-lived services behind a reverse proxy. What you gain from reading it is the collection pipeline, the search and citation model, the archive schema with its change history, and the practices of an organisation that has been ingesting court data since 2009. What you have to supply is the infrastructure, the PostgreSQL instance with its bulk data, and the operational work that a service of this size involves.

Editorial conclusion

Adopt courtlistener if you are building on American court data and want the collection pipeline, the search stack and the archive model rather than only an API client, and you can meet the AGPL's obligations if you deploy a modified version. Skip it if you just need opinions and citations, since the hosted site and its API already exist for that. Before you build, read the developer guide on the Free Law Project wiki, plan for the data volume, since the .postgresql directory and the courts-db dependency show this is a PostgreSQL project with bulk data, and note that the credentials in the environment file include PACER and LASC logins for collecting federal filings, so those belong in a secrets manager rather than a file you commit.

Frequently asked questions

What is the courtlistener repository?

It is the Django code for CourtListener.com, the main initiative of the Free Law Project, started in 2009. It holds a fully-searchable archive of court opinions, oral arguments, judges, judicial financial records and federal filings.

What licence does courtlistener use?

The Affero GPL. All materials in the repository are copyright Free Law Project under the Affero GPL, with the package metadata specifying AGPL-3.0-only and details in LICENSE.txt.

What does the courtlistener repository contain?

Three directories: cl with the Django code, which holds 99% of everything, docker with the compose and Docker files for the various components, and scripts with logrotate, systemd and init scripts for the configurations and daemons.

What Python and Django versions does courtlistener require?

Python >=3.13,<3.14 and Django >=6.0.8,<6.1. The project is classified as Development Status 5, Production/Stable, and depends on PostgreSQL, Celery, djangorestframework and django-pghistory.

How do I contribute to courtlistener?

Start with the volunteer information page on free.law or the developer guide on the Free Law Project wiki. Every issue is assigned to somebody, so if one looks interesting you can say you want to take it over, and the tracker has help wanted and data quality labels.

Official sources

  1. freelawproject/courtlistener on GitHub
  2. Issues
  3. Project website
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/freelawproject-courtlistener.svg)](https://hysenlabs.com/projects/freelawproject-courtlistener)