<div align="center">
<img src="https://cdn.jsdelivr.net/gh/OsamaS99/pipt@main/assets/logo.png" alt="pipt Logo" width="640"/>
<p align="center">
The Python Package Time Machine
</p>
<p align="center">
<strong>Install dependencies as they existed on any given date.</strong>
</p>
<p align="center">
<a href="https://github.com/OsamaS99/pipt/actions"><img alt="CI" src="https://github.com/OsamaS99/pipt/actions/workflows/ci.yml/badge.svg"></a>
<a href="https://pypi.org/project/pipt"><img alt="PyPI" src="https://img.shields.io/pypi/v/pipt"></a>
</p>
</div>
---
`pipt` is a command-line tool that acts as a time machine for your Python environment. It lets you install packages and their dependencies exactly as they were on a specific date, making past environments reproducible without hunting down historical versions by hand.
It's not a new package manager. It wraps `pip`, using its resolver to do the heavy lifting while `pipt` finds the right time-appropriate releases for you.
## Quickstart
- See what you’d get as of a date:
```bash
pipt resolve "pandas<2.0" --date 2023-01-01
```
- Install with a cutoff date:
```bash
pipt install "pandas<2.0" --date 2023-01-01
```
- Create a lockfile you can install with pip later:
```bash
pipt lock django --date 2021-03-15 > requirements.lock
pip install -r requirements.lock
```
- No date? Behaves like pip:
```bash
pipt install requests # passes through to pip install
```
## Key Features
- Reproducible builds tied to a specific date
- Optional cutoff: without `--date`, pipt behaves like pip
- Date strategies: `--date-mode before` (default) or `--date-mode nearest`
- Intelligent failure analysis with actionable messages
- Preflight environment checks (Requires-Python, wheel tags) with Python version suggestions
- Lockfile generation compatible with `pip`
- Works with your existing workflows (constraints, pre-releases, yanked handling)
- Polished CLI powered by `rich`
## Installation
```bash
pip install pipt
```
Or with pipx (recommended for global CLI tools):
```bash
pipx install pipt
```
## How It Works
`pipt` iteratively refines version constraints. It starts from your requested requirements, selects the latest releases that existed on the cutoff date, and runs `pip`'s resolver in a dry run. If transitive dependencies are too new, `pipt` tightens constraints and repeats until a historically accurate plan is found.
It also performs a lightweight preflight check to surface environment incompatibilities early (e.g., no wheels for your Python/platform for the cutoff-era release) and will suggest the minimum Python version inferred from wheel filenames or Requires-Python.
## Usage
### Install a package as of a date
```bash
# Install pandas as it was on New Year's Day 2023
pipt install "pandas<2.0" --date 2023-01-01
```
### Resolve (dry run) without installing
```bash
# See the dependency plan for flask on June 1st, 2022
pipt resolve flask --date 2022-06-01
```
Add JSON output if you want to script around the result:
```bash
pipt resolve flask --date 2022-06-01 --json
```
### Create a pip-compatible lockfile
```bash
# Lock Django and its dependencies to their state on March 15th, 2021
pipt lock django --date 2021-03-15 > requirements.lock
# Include hashes for extra integrity
pipt lock django --date 2021-03-15 --include-hashes > requirements.lock
```
### List available versions before a date
```bash
# List all versions of requests published before 2020
pipt list requests --before 2020-01-01
```
### Diagnose without installing
```bash
# See environment summary, latest allowed by cutoff, and wheel/Requires-Python info
pipt diagnose numpy --date 2021-01-01
```
### Handy options
- `--pre`: allow pre-releases when needed
- `--allow-yanked`: include yanked releases
- `--python-version X.Y`: resolve as if running on Python X.Y (respects Requires-Python)
- `-c constraints.txt`: layer your own constraints
- `--allow-source`: in historical mode, permit building from source (disables binary-only)
- `--date-mode nearest`: pick the version closest to the cutoff (experimental)
- Global `-v`: show the exact pip command and raw output
## Compatibility
- Python: 3.9–3.12
- Platforms: Linux, macOS, Windows
## Contributing
Contributions are welcome! See the [Contributing Guide](CONTRIBUTING.md).
## License
`pipt` is licensed under the [MIT License](LICENSE).
Raw data
{
"_id": null,
"home_page": null,
"name": "pipt",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "pip, reproducibility, dependencies, packages, PyPI, time travel",
"author": "pipt contributors",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/17/bf/d4346b5cf85b21819f5902757b79b16aea145c352ef84c330f78dc61ad86/pipt-0.1.7.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n <img src=\"https://cdn.jsdelivr.net/gh/OsamaS99/pipt@main/assets/logo.png\" alt=\"pipt Logo\" width=\"640\"/>\n <p align=\"center\">\n The Python Package Time Machine\n </p>\n <p align=\"center\">\n <strong>Install dependencies as they existed on any given date.</strong>\n </p>\n <p align=\"center\">\n <a href=\"https://github.com/OsamaS99/pipt/actions\"><img alt=\"CI\" src=\"https://github.com/OsamaS99/pipt/actions/workflows/ci.yml/badge.svg\"></a>\n <a href=\"https://pypi.org/project/pipt\"><img alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/pipt\"></a>\n </p>\n</div>\n\n---\n\n`pipt` is a command-line tool that acts as a time machine for your Python environment. It lets you install packages and their dependencies exactly as they were on a specific date, making past environments reproducible without hunting down historical versions by hand.\n\nIt's not a new package manager. It wraps `pip`, using its resolver to do the heavy lifting while `pipt` finds the right time-appropriate releases for you.\n\n## Quickstart\n\n- See what you\u2019d get as of a date:\n\n```bash\npipt resolve \"pandas<2.0\" --date 2023-01-01\n```\n\n- Install with a cutoff date:\n\n```bash\npipt install \"pandas<2.0\" --date 2023-01-01\n```\n\n- Create a lockfile you can install with pip later:\n\n```bash\npipt lock django --date 2021-03-15 > requirements.lock\npip install -r requirements.lock\n```\n\n- No date? Behaves like pip:\n\n```bash\npipt install requests # passes through to pip install\n```\n\n## Key Features\n\n- Reproducible builds tied to a specific date\n- Optional cutoff: without `--date`, pipt behaves like pip\n- Date strategies: `--date-mode before` (default) or `--date-mode nearest`\n- Intelligent failure analysis with actionable messages\n- Preflight environment checks (Requires-Python, wheel tags) with Python version suggestions\n- Lockfile generation compatible with `pip`\n- Works with your existing workflows (constraints, pre-releases, yanked handling)\n- Polished CLI powered by `rich`\n\n## Installation\n\n```bash\npip install pipt\n```\n\nOr with pipx (recommended for global CLI tools):\n\n```bash\npipx install pipt\n```\n\n## How It Works\n\n`pipt` iteratively refines version constraints. It starts from your requested requirements, selects the latest releases that existed on the cutoff date, and runs `pip`'s resolver in a dry run. If transitive dependencies are too new, `pipt` tightens constraints and repeats until a historically accurate plan is found.\n\nIt also performs a lightweight preflight check to surface environment incompatibilities early (e.g., no wheels for your Python/platform for the cutoff-era release) and will suggest the minimum Python version inferred from wheel filenames or Requires-Python.\n\n## Usage\n\n### Install a package as of a date\n\n```bash\n# Install pandas as it was on New Year's Day 2023\npipt install \"pandas<2.0\" --date 2023-01-01\n```\n\n### Resolve (dry run) without installing\n\n```bash\n# See the dependency plan for flask on June 1st, 2022\npipt resolve flask --date 2022-06-01\n```\n\nAdd JSON output if you want to script around the result:\n\n```bash\npipt resolve flask --date 2022-06-01 --json\n```\n\n### Create a pip-compatible lockfile\n\n```bash\n# Lock Django and its dependencies to their state on March 15th, 2021\npipt lock django --date 2021-03-15 > requirements.lock\n\n# Include hashes for extra integrity\npipt lock django --date 2021-03-15 --include-hashes > requirements.lock\n```\n\n### List available versions before a date\n\n```bash\n# List all versions of requests published before 2020\npipt list requests --before 2020-01-01\n```\n\n### Diagnose without installing\n\n```bash\n# See environment summary, latest allowed by cutoff, and wheel/Requires-Python info\npipt diagnose numpy --date 2021-01-01\n```\n\n### Handy options\n\n- `--pre`: allow pre-releases when needed\n- `--allow-yanked`: include yanked releases\n- `--python-version X.Y`: resolve as if running on Python X.Y (respects Requires-Python)\n- `-c constraints.txt`: layer your own constraints\n- `--allow-source`: in historical mode, permit building from source (disables binary-only)\n- `--date-mode nearest`: pick the version closest to the cutoff (experimental)\n- Global `-v`: show the exact pip command and raw output\n\n## Compatibility\n\n- Python: 3.9\u20133.12\n- Platforms: Linux, macOS, Windows\n\n## Contributing\n\nContributions are welcome! See the [Contributing Guide](CONTRIBUTING.md).\n\n## License\n\n`pipt` is licensed under the [MIT License](LICENSE).\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A time machine for your Python environment. Install packages as they existed on a given date.",
"version": "0.1.7",
"project_urls": {
"Homepage": "https://github.com/OsamaS99/pipt",
"Issues": "https://github.com/OsamaS99/pipt/issues",
"Repository": "https://github.com/OsamaS99/pipt"
},
"split_keywords": [
"pip",
" reproducibility",
" dependencies",
" packages",
" pypi",
" time travel"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a7e45269d7c704079da16a5d47dfa09f945dcf5acfffdc19ba2b0b74d3024006",
"md5": "0952c98be1d0c1f44b8d1b2b0d351f62",
"sha256": "102279d1f3d5199913767d36845cf33728a6e2a65b7782ca5182ab91ba7610ed"
},
"downloads": -1,
"filename": "pipt-0.1.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0952c98be1d0c1f44b8d1b2b0d351f62",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 20917,
"upload_time": "2025-08-30T15:45:49",
"upload_time_iso_8601": "2025-08-30T15:45:49.235255Z",
"url": "https://files.pythonhosted.org/packages/a7/e4/5269d7c704079da16a5d47dfa09f945dcf5acfffdc19ba2b0b74d3024006/pipt-0.1.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "17bfd4346b5cf85b21819f5902757b79b16aea145c352ef84c330f78dc61ad86",
"md5": "b0d77074f44fd28a405af278cdd3e22d",
"sha256": "664aaa95ce0127f4f4aea0076aa48c0668f433d9afbb0db75c972842accc8803"
},
"downloads": -1,
"filename": "pipt-0.1.7.tar.gz",
"has_sig": false,
"md5_digest": "b0d77074f44fd28a405af278cdd3e22d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 20611,
"upload_time": "2025-08-30T15:45:50",
"upload_time_iso_8601": "2025-08-30T15:45:50.706790Z",
"url": "https://files.pythonhosted.org/packages/17/bf/d4346b5cf85b21819f5902757b79b16aea145c352ef84c330f78dc61ad86/pipt-0.1.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-30 15:45:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "OsamaS99",
"github_project": "pipt",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pipt"
}