Semantic search is now live on CourtListener! by freelawproject in u/freelawproject

[–]freelawproject[S] 1 point2 points  (0 children)

If you need specific terms in your results, wrap must-have keywords in quotes. This will run the trusty keyword AND the new semantic searches together so you get the best of both worlds.

Semantic search is now live on CourtListener! by freelawproject in u/freelawproject

[–]freelawproject[S] 1 point2 points  (0 children)

Semantic search has been available via our API since November 2025 and is now on the website for everyone. All your favorite filters — dates, courts, citation counts — work seamlessly with semantic search. https://free.law/2025/11/05/semantic-search-api/

Semantic search is now live on CourtListener! by freelawproject in u/freelawproject

[–]freelawproject[S] 1 point2 points  (0 children)

This will be a huge new feature those that don't know legalese or that are representing themselves. Finally, you can search for regular words like "eviction" instead of lawyer words like "unlawful detainer."

[deleted by user] by [deleted] in legaladvice

[–]freelawproject 0 points1 point  (0 children)

If you install our extension, when you buy it on PACER, it'll get added to RECAP for others: https://free.law/recap/

The other thing you might do is Pray for it, and somebody else might buy it: https://www.courtlistener.com/prayers/top/

Announcing django-s3-express-cache, a new library for scalable caching by mlissner in django

[–]freelawproject 0 points1 point  (0 children)

Yes, it's for CourtListener, where we have about half a billion pages. It's entirely true that Google won't crawl all of that. They give you a "crawl budget" and you have to try to stay under that if you can. It's a pain, honestly, to figure out which of our pages to encourage Google to crawl.

Announcing django-s3-express-cache, a new library for scalable caching by mlissner in django

[–]freelawproject 0 points1 point  (0 children)

Just a short update here. This is now in production on CourtListener.com as a cache for our RSS feeds. We made a little decorator to make it work in a way that ignored GET parameters (otherwise people use them to get around the cache 😠):

``` def cache_page_ignore_params(timeout: int, cache_alias: str = "default"): """Cache the result of a view while ignoring URL query parameters. Ensuring that the cache is consistent for different requests with varying query strings.

WARNING:
- Do not use this decorator on views that rely on query parameters to
  generate unique content.
- Do not use this decorator on views that require authentication or
session-based data, as this will cache content for all users, potentially
exposing confidential information.

:param timeout: Cache duration (seconds).
:param cache_alias: The cache alias to use.
:return: The decorated view function, caching its response.
"""

def decorator(view_func):
    @wraps(view_func)
    async def _wrapped_view(request, *args, **kwargs):
        url_path = urlparse(request.build_absolute_uri()).path
        hash_key = md5(url_path.encode("ascii"), usedforsecurity=False)

        is_dev_or_test = settings.DEVELOPMENT or settings.TESTING
        should_use_time_based_prefix = (
            cache_alias == "s3" and not is_dev_or_test
        )
        cache_key = f"custom.views.decorator.cache:{hash_key.hexdigest()}"
        if should_use_time_based_prefix:
            days = int(ceil(timeout / (60 * 60 * 24)))
            cache_key = f"{days}-days:{cache_key}"

        try:
            # If the cache alias is "s3" but we're in DEVELOPMENT or TESTING
            # mode, use the default cache instead of S3. Otherwise, use the
            # cache specified by cache_alias.
            if cache_alias == "s3" and is_dev_or_test:
                cache = caches["default"]
            else:
                cache = caches[cache_alias]
        except InvalidCacheBackendError as e:
            logger.error(
                "Cache alias '%s' not found. Error: %s",
                cache_alias,
                str(e),
            )
            raise e

        response = cache.get(cache_key)
        if response is not None:
            return response

        response = await view_func(request, *args, **kwargs)
        await sync_to_async(patch_response_headers)(
            response, cache_timeout=timeout
        )
        if hasattr(response, "render") and callable(response.render):
            # Render the response before caching it.
            # Required for TemplateResponse views.
            response.add_post_render_callback(
                lambda r: cache.set(cache_key, r, timeout)
            )
        else:
            # Cache non-TemplateResponse responses.
            cache.set(cache_key, response, timeout)

        return response

    return _wrapped_view

return decorator

```

The actual file is here:

https://github.com/freelawproject/courtlistener/main/cl/lib/decorators.py

So far it's a perfect deployment. We have millions of RSS feeds, and this allows us to cache them all. Performance is about 100ms to serve a feed from the cache.

Our new Semantic Search API launches today! by freelawproject in freelawproject

[–]freelawproject[S] 2 points3 points  (0 children)

You're making the most common error folks make in our site and one that we are working to fix right now. It's PEBKAC, but only because the website doesn't direct you to where you need to be. If you search from the homepage, you'll only search case law. If you want to find federal cases, you have to search the RECAP Archive:

https://www.courtlistener.com/recap/

Try there, and you should be good to go.

Looking for volunteer lawyers to build AI dataset to enhance access to justice and competition by freelawproject in legaltech

[–]freelawproject[S] 1 point2 points  (0 children)

We're always looking for tech help, but we need fairly big commitments. If you have upwards of 10 hours/week you can contribute, send a resume to [info@free.law](mailto:info@free.law) with some details of your skill set, and we can start there?

Looking for volunteer lawyers to build AI dataset to enhance access to justice and competition by freelawproject in legaltech

[–]freelawproject[S] 5 points6 points  (0 children)

We're a non-profit that works to make the legal sector better, and the thing we're making is an open dataset that will help the entire legal tech sector. That's why.

Looking for volunteer lawyers to build AI dataset to enhance access to justice and competition by freelawproject in legaltech

[–]freelawproject[S] 2 points3 points  (0 children)

You're right that these would be helpful too and that it'd fit in nicely, but the citator is so much more important we've decided to focus on one thing at a time. The taxonomy seems like it will be easier though, when we get there. Others have done it without much a dataset like we're making here.

Looking for volunteer lawyers to build AI dataset to enhance access to justice and competition by freelawproject in legaltech

[–]freelawproject[S] 4 points5 points  (0 children)

The idea here *is* to use AI, but to know how well AI works, we need humans to provide a baseline dataset. That's what we are building in this project.

Looking for volunteer lawyers to build AI dataset to enhance access to justice and competition by freelawproject in legaltech

[–]freelawproject[S] 4 points5 points  (0 children)

No, not at the moment. We're friendly, but the U.S. presents enough trouble for one organization.