Skip to main content

modulift

Find the right Python package among ~485,000 on PyPI: by keywords, plain-language description, or similarity to one you already know.

PyPI version Python versions CI License: MIT


You often know what you need ("something that fills in missing values in a DataFrame") but not which package does it. Web searches and AI assistants tend to surface the same few popular libraries. modulift searches a dataset of PyPI packages, each with a description, keywords, a 1–5 popularity score and a sentence embedding, so the smaller, more specialized packages turn up too. You can search straight from your code or notebook.

Installation

pip install modulift

modulift needs Python 3.10 or newer. The dataset is hosted on the Hugging Face Hub (yeniguno/pypi) and is downloaded on first use (see Performance).

Quick start

import modulift as mf

mf.search_by_description("turn my python script into a nice command line tool", method="cosine")
mf.search_by_keywords("web scraping", "async", relation="and")
mf.find_similar_packages("pandera", method="cosine")
mf.search_by_package_name("requests")
Function What it does Methods
search_by_package_name(name) Look up one package (case-insensitive)
search_by_keywords(*keywords, relation=...) Search by keywords, with AND/OR logic exact (default), jaccard
search_by_description(text) Search descriptions fts (default), cosine
find_similar_packages(name) Packages related to one you know tf-idf (default), cosine, jaccard

Every search takes limit (default 5) and markdown=True, which renders the results in Jupyter.

Usage

The examples below are real results, with descriptions shortened.

Look up a package

mf.search_by_package_name("requests")
{
    "package": "requests",
    "description": "requests is a python library for making http requests, designed for ease of use and robust functionality.",
    "keywords": "http, requests, python, api, authentication, data handling",
    "popularity": 5,
}

The lookup is case-insensitive. An exact-case match wins if one exists. A name that isn't in the dataset raises ValueError.

Search by keywords

mf.search_by_keywords("data validation", "pandas", "schema", relation="and")
pandera-report        pandera extension for row-based reporting, providing enhanced data validation...
pl-compare            compare and find differences between two polars dataframes...
shmessy               deal with messy pandas dataframes...
data-linter           automatic validation of tabular data within data engineering...
minimonolith-schema   validating the columns of data tables...
  • relation="or" (the default) matches any keyword. relation="and" matches all of them.
  • method="exact" matches whole words and phrases, case-insensitively, so "data" matches "data science" but not "metadata". Results are sorted by popularity.
  • method="jaccard" ranks packages by keyword overlap, and adds a jaccard_score to each result.

Search by description

Plain-text search (fts, the default) finds descriptions that contain your text:

mf.search_by_description("missing data")
fancyimpute   matrix completion and imputation... to handle missing data in datasets
fbprophet     time series forecasting... designed to handle strong seasonal effects and missing data
hyperimpute   handling missing data in machine learning pipelines...
impyute       missing data imputation algorithms...
knnimpute     k-nearest neighbors (knn) imputation...

Semantic search (cosine) embeds your query with a sentence-transformers model and compares it with every package's embedding. Describe the problem in your own words:

mf.search_by_description("turn my python script into a nice command line tool", method="cosine")
uclt      0.780   functions to create a command-line tool
pith      0.775   a simple command-line tool for executing python scripts...
captain   0.767   a python cli framework for creating easy-to-use command-line scripts
hazwaz    0.766   a python library for writing command-line scripts
pyglib    0.765   a framework for creating command-line scripts and applications

The default model is sentence-transformers/all-MiniLM-L6-v2. Use another with embedding_model="...". Each result gets a cosine_similarity.

Find similar packages

mf.find_similar_packages("pandera", method="cosine")
pandera-tool        data manipulation and analysis using the pandera library...
panderaext          extends the pandera type checking framework...
streamlit_pandera   data ingestion, validation, and processing using pandera...
panorma             typed models for pandas dataframes using classes...
pano                creating and maintaining panoramic data models...
  • tf-idf compares description and keyword text.
  • cosine compares embeddings.
  • jaccard compares keyword sets.

The reference package itself is never part of the results.

Results

Every function returns plain Python data, so the output can go straight into json.dumps or pandas.DataFrame:

{"package": str, "description": str, "keywords": str, "popularity": int}
# plus "jaccard_score" or "cosine_similarity" (float) for those methods

Invalid arguments (an empty query, a non-positive limit, an unknown method) raise ValueError. If the dataset can't be loaded, you get a RuntimeError with the reason.

Performance

  • First use downloads the dataset: about 1 GB, plus a few GB of disk for the Hugging Face cache. Cosine search also downloads the embedding model (about 90 MB) the first time.

  • Within a process, everything is cached: the dataset, the TF-IDF matrix, the embeddings, the keyword index and the model. Only the first search is slow.

  • Logging: modulift doesn't print. It reports events such as loading the embedding model through the standard logging module (logger modulift). To see them:

    import logging
    logging.basicConfig(level=logging.INFO)
    

Things to keep in mind

  • The dataset is a snapshot of PyPI. It can miss very new packages and include ones that have since been abandoned.
  • PyPI includes clones, forks and test uploads. Treat results as leads. Check a package on PyPI (latest release, license, supported Python versions) before you depend on it.

Use with AI coding agents

skills/modulift is an agent skill that teaches a coding agent (such as Claude Code) to use modulift when it has to choose a dependency. The agent searches in several ways, filters out clones and abandoned packages, checks the shortlist against live PyPI data, and only then recommends a package. To use it, copy the folder into ~/.claude/skills/ or a project's .claude/skills/.

Contributing

Contributions are welcome. See CONTRIBUTING.md for the development setup (uv, ruff, pytest) and release process, and CHANGELOG.md for what changed.

License

MIT. See Licence.md.

Contact

Okan Yenigün: okanyenigun@gmail.com

Metadata

Release files for modulift 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for modulift 0.1.2
File Size Uploaded Provenance Actions
modulift-0.1.2.tar.gz 337.9 kB Without provenance Details for modulift-0.1.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for modulift 0.1.2
File Interpreter ABI Platform Actions
modulift-0.1.2-py3-none-any.whl Python 3 none any Details for modulift-0.1.2-py3-none-any.whl

Total release size: 349.1 kB

Release files / modulift-0.1.2.tar.gz

Download URL modulift-0.1.2.tar.gz
Size 337.9 kB
Tags Source
SHA-256 checksum
How to use checksums
aa58ab3165d1a197ff4205ab2066b2a791be068e4c36cdcee3afeea86550342d
BLAKE2b-256 checksum
How to use checksums
86d57d47deadc37c834661c2bf4bb37d4f4333771d4c461c4a5b35cdf2bc4849
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / modulift-0.1.2-py3-none-any.whl

Download URL modulift-0.1.2-py3-none-any.whl
Size 11.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7024a6a353575b053aee6feb8a8b7beab7aec90009cae22724556c834a04e464
BLAKE2b-256 checksum
How to use checksums
86d70c8c63ea6726db5e4463c05dd820f187488495619d4f7568a19a42b6a643
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for modulift 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page