|
1 | 1 | # omnipkg: The Intelligent Python Package Manager |
2 | | -One environment. Infinite versions. Zero conflicts. |
| 2 | +> One environment. Infinite versions. Zero conflicts. |
| 3 | +
|
3 | 4 | <p align="center"> |
4 | | -<a href="https://github.com/1minds3t/omnipkg/actions/workflows/test.yml"> |
5 | | -<img src="https://img.shields.io/github/actions/workflow/status/1minds3t/omnipkg/test.yml?branch=main" alt="Build Status"> |
6 | | -</a> |
7 | | -<a href="https://pypi.org/project/omnipkg/"> |
8 | | -<img src="https://img.shields.io/pypi/v/omnipkg.svg" alt="PyPI version"> |
9 | | -</a> |
10 | | -<a href="https://www.gnu.org/licenses/agpl-3.0"> |
11 | | -<img src="https://img.shields.io/badge/License-AGPLv3-red.svg" alt="License: AGPLv3"> |
12 | | -</a> |
13 | | -<a href="https://github.com/1minds3t/omnipkg/actions/workflows/security_audit.yml"> |
14 | | -<img src="https://img.shields.io/github/actions/workflow/status/1minds3t/omnipkg/security_audit.yml?branch=main" alt="Security Audit"> |
15 | | -</a> |
| 5 | + <a href="https://github.com/1minds3t/omnipkg/actions/workflows/test.yml"> |
| 6 | + <img src="https://img.shields.io/github/actions/workflow/status/1minds3t/omnipkg/test.yml?branch=main" alt="Build Status"> |
| 7 | + </a> |
| 8 | + <a href="https://pypi.org/project/omnipkg/"> |
| 9 | + <img src="https://img.shields.io/pypi/v/omnipkg.svg" alt="PyPI version"> |
| 10 | + </a> |
| 11 | + <a href="https://www.gnu.org/licenses/agpl-3.0"> |
| 12 | + <img src="https://img.shields.io/badge/License-AGPLv3-red.svg" alt="License: AGPLv3"> |
| 13 | + </a> |
| 14 | + <a href="https://github.com/1minds3t/omnipkg/actions/workflows/security_audit.yml"> |
| 15 | + <img src="https://img.shields.io/github/actions/workflow/status/1minds3t/omnipkg/security_audit.yml?branch=main" alt="Security Audit"> |
| 16 | + </a> |
16 | 17 | </p> |
17 | | -omnipkg lets you install any version of any package without breaking your environment, downgrading dependencies, or needing Conda, Docker, or pipx. Dependency hell? Obliterated. |
18 | 18 |
|
19 | | -Installation & The 30-Second Demo |
20 | | -Get started in seconds. After installing, run the interactive demo to see the magic for yourself. |
| 19 | +--- |
| 20 | + |
| 21 | +`omnipkg` lets you install *any version* of *any package* without breaking your environment, downgrading dependencies, or needing Conda, Docker, or `pipx`. **Dependency hell? Obliterated.** |
21 | 22 |
|
22 | | -Generated bash |
| 23 | +## Installation & Quick Start |
| 24 | + |
| 25 | +```bash |
23 | 26 | pip install omnipkg |
| 27 | +``` |
| 28 | + |
| 29 | +See the magic for yourself. This command runs a fully automated demo showcasing downgrade protection and version isolation. |
| 30 | + |
| 31 | +```bash |
24 | 32 | omnipkg demo |
| 33 | +``` |
25 | 34 |
|
26 | | -content_copy |
| 35 | +## 🔥 See It to Believe It (Live Demo Recording) |
27 | 36 |
|
28 | | -download |
29 | | -Use code with caution. |
30 | | -Bash |
31 | | -The demo will guide you through a real-world dependency conflict, showcasing how omnipkg isolates the problem version instead of breaking your environment. |
| 37 | +A static README can't do it justice. Here is a live recording of `omnipkg` handling a complex installation that would break other tools. |
32 | 38 |
|
33 | | -<details> |
34 | | -<summary><strong>🔬 Click to see what the demo shows you</strong></summary> |
35 | | -Generated bash |
36 | | -# The demo first shows you what happens when you use pip... |
37 | | -💀 You: pip install flask-login==0.4.1 |
38 | | -... |
39 | | -💥 BOOM! Look what pip did: |
40 | | - ❌ Uninstalled flask-login 0.6.3 |
41 | | - ❌ Downgraded Flask and Werkzeug |
42 | | - ❌ Your modern project is now BROKEN |
43 | | - |
44 | | -# Then, it shows you the omnipkg way... |
45 | | -🧠 Smart choice! Using omnipkg instead... |
46 | | -🫧 Creating a protective bubble for the old version... |
47 | | -$ omnipkg install flask-login==0.4.1 |
48 | | -✅ omnipkg install successful! |
49 | | -🎯 BOTH versions now coexist peacefully! |
50 | | - |
51 | | -content_copy |
52 | | - |
53 | | -download |
54 | | -Use code with caution. |
55 | | -Bash |
56 | | -</details> |
57 | | -🔥 The Gauntlet: Surviving the Stress Test |
58 | | -Talk is cheap. Here’s what happens when omnipkg is pushed to its absolute limit with the built-in omnipkg stress-test command. This isn't a simulation; it's omnipkg seamlessly activating different, often incompatible, versions of C-extension-heavy libraries in the same Python process. |
| 39 | +*<-- This is the perfect spot for a GIF created with a tool like `asciinema` or `termtosvg`! -->* |
| 40 | + |
| 41 | + |
| 42 | +*This shows `omnipkg install old-package`, downgrade protection activating, and `omnipkg status` confirming both versions coexist.* |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +## 🚀 Core Features |
| 47 | + |
| 48 | +- 🛡️ **Downgrade Protection**: Stops `pip` from nuking your environment by isolating conflicting versions into protected **"bubbles."** |
| 49 | +- 💾 **Intelligent Deduplication**: Saves up to 60% disk space on bubbled packages while keeping native C extensions stable and separate. |
| 50 | +- 🧠 **Redis-Backed Knowledge Base**: Lightning-fast lookups for all package versions, dependencies, and security info. |
| 51 | +- 🔀 **Runtime Version Switching**: Activate any bubbled package version on the fly, even within the same script, using the built-in loader. |
| 52 | +- 🧪 **Battle-Tested**: Proven to handle massive environments (**520+ packages, 95+ bubbles, 15.4GB+**) without flinching. |
| 53 | + |
| 54 | +--- |
| 55 | + |
| 56 | +## How Is This Possible? |
| 57 | + |
| 58 | +When a downgrade is detected, `omnipkg` performs surgery: |
| 59 | +1. **Intercepts** the request. |
| 60 | +2. **Installs** the conflicting version and its entire dependency tree into a temporary, isolated location. |
| 61 | +3. **Creates** a space-efficient, deduplicated "bubble" in `.omnipkg_versions`. |
| 62 | +4. **Restores** the original package in your main environment, leaving it pristine. |
| 63 | + |
| 64 | +The result: a perfectly stable global environment, with every version you've ever needed on standby. |
59 | 65 |
|
60 | 66 | <details> |
61 | | -<summary><strong>🤯 Click to view the full stress test output.</strong></summary> |
62 | | -Generated bash |
63 | | -# Creating bubbles for older, conflicting versions... |
64 | | ---- Creating bubble for numpy==1.24.3 --- |
65 | | -✅ Bubble created: 1363 files copied, 0 deduplicated. |
66 | | ---- Creating bubble for scipy==1.12.0 --- |
67 | | -✅ Bubble created: 3551 files copied, 0 deduplicated. |
68 | | - |
69 | | -# Executing the test... |
70 | | -💥 NUMPY VERSION JUGGLING: |
71 | | - |
72 | | -⚡ Switching to numpy==1.24.3 |
73 | | -🌀 omnipkg loader: Activating numpy==1.24.3... |
74 | | - ✅ Activated bubble: /path/to/.omnipkg_versions/numpy-1.24.3 |
75 | | - ✅ Version: 1.24.3 |
76 | | - 🔢 Array sum: 6 |
77 | | - |
78 | | -⚡ Switching to numpy==1.26.4 |
79 | | -🌀 omnipkg loader: Activating numpy==1.26.4... |
80 | | - 🧹 Deactivated bubble: numpy-1.24.3 |
81 | | - ✅ Activated bubble: /path/to/.omnipkg_versions/numpy-1.26.4 |
82 | | - ✅ Version: 1.26.4 |
83 | | - 🔢 Array sum: 6 |
84 | | - |
85 | | -🔥 SCIPY C-EXTENSION TEST: |
86 | | - |
87 | | -🌋 Switching to scipy==1.12.0 |
88 | | -🌀 omnipkg loader: Activating scipy==1.12.0... |
89 | | - ✅ Activated bubble: /path/to/.omnipkg_versions/scipy-1.12.0 |
90 | | - ✅ Version: 1.12.0 |
91 | | - ♻️ Sparse matrix: 3 non-zeros |
92 | | - |
93 | | -🌋 Switching to scipy==1.16.1 |
94 | | -🌀 omnipkg loader: Activating scipy==1.16.1... |
95 | | - 🧹 Deactivated bubble: scipy-1.12.0 |
96 | | - ✅ System version already matches requested version (1.16.1). No bubble activation needed. |
97 | | - ✅ Version: 1.16.1 |
98 | | - ♻️ Sparse matrix: 3 non-zeros |
99 | | - |
100 | | - 🚨 OMNIPKG SURVIVED NUCLEAR TESTING! 🎇 |
101 | | - |
102 | | -content_copy |
103 | | - |
104 | | -download |
105 | | -Use code with caution. |
106 | | -Bash |
| 67 | +<summary><strong>🔬 Real-World Example: Downgrading PyTorch</strong></summary> |
| 68 | + |
| 69 | +```bash |
| 70 | +# User wants to install an older torch version |
| 71 | +$ omnipkg install torch==2.7.0 |
| 72 | + |
| 73 | +# ... (omnipkg detects the downgrade) ... |
| 74 | +🛡️ DOWNGRADE PROTECTION ACTIVATED! |
| 75 | +-> Fixing downgrade: torch from v2.7.1 to v2.7.0 |
| 76 | +🫧 Creating isolated bubble for torch v2.7.0 |
| 77 | +✅ Success: Dependencies resolved via PyPI API. |
| 78 | +🧹 Creating deduplicated bubble... |
| 79 | +⚠️ Disabling deduplication for native package: torch |
| 80 | +✅ Bubble created: 16241 files copied, 3211 deduplicated. |
| 81 | +📊 Space efficiency: 16.5% saved. |
| 82 | +🔄 Restoring ‘torch’ to safe version v2.7.1 in main environment… |
| 83 | + |
| 84 | +✅ Environment protection complete! |
| 85 | +``` |
107 | 86 | </details> |
108 | | -🚀 Core Features |
109 | | -🛡️ Downgrade Protection: Stops pip from nuking your environment by isolating conflicting versions into protected "bubbles." |
110 | | -💾 Intelligent Deduplication: Saves up to 60% disk space on bubbled packages while keeping native C extensions stable and separate. |
111 | | -🧠 Redis-Backed Knowledge Base: Lightning-fast lookups for all package versions, dependencies, and security info. |
112 | | -🔀 Runtime Version Switching: Activate any bubbled package version on the fly, even within the same script, using the built-in loader. |
113 | | -🧪 Battle-Tested: Proven to handle massive environments (520+ packages, 95+ bubbles, 15.4GB+) without flinching. |
114 | | -How It Works |
115 | | -When a downgrade is detected, omnipkg performs surgery: |
116 | | - |
117 | | -Intercepts the request. |
118 | | -Installs the conflicting version and its entire dependency tree into a temporary location. |
119 | | -Creates a space-efficient, deduplicated "bubble" in .omnipkg_versions. |
120 | | -Restores the original package in your main environment, leaving it pristine. |
121 | | -The result: a perfectly stable global environment, with every version you've ever needed on standby. |
122 | 87 |
|
123 | | -Why Other Tools Fail |
124 | | -Tool The Task: install old-conflicting-package Result |
125 | | -pip ❌ ERROR: Cannot uninstall... |
126 | | -conda ⏳ Solving environment... (for hours) |
127 | | -poetry 💥 SolverProblemError |
128 | | -uv 🚫 No solution found for the request |
129 | | -omnipkg ✅ DOWNGRADE PROTECTION ACTIVATED! |
130 | | -📜 Licensing |
131 | | -omnipkg is available under a dual-license model. |
132 | | - |
133 | | -Community Edition (AGPLv3): Perfect for individual developers, open-source projects, and academic use. If you use omnipkg in a project that is also open-source under a compatible license, you're good to go. |
134 | | -Commercial License: Required for use in closed-source commercial software or for any organization that cannot comply with the AGPLv3. This license allows you to integrate omnipkg without the obligation to open-source your own code. |
135 | | -→ To inquire about a commercial license, please contact: omnipkg@proton.me |
| 88 | +--- |
| 89 | + |
| 90 | +## Why Other Tools Fail |
| 91 | + |
| 92 | +| Tool | The Task: `install old-conflicting-package` | Result | |
| 93 | +|---------------|---------------------------------------------|---------------------------------------| |
| 94 | +| `pip` | ❌ | `ERROR: Cannot uninstall...` | |
| 95 | +| `conda` | ⏳ | `Solving environment...` (for hours) | |
| 96 | +| `poetry` | 💥 | `SolverProblemError` | |
| 97 | +| `uv` | 🚫 | `No solution found for the request` | |
| 98 | +| **`omnipkg`** | ✅ | **`DOWNGRADE PROTECTION ACTIVATED!`** | |
| 99 | + |
| 100 | +--- |
| 101 | + |
| 102 | +## 📜 Licensing |
| 103 | + |
| 104 | +`omnipkg` is available under a dual-license model to suit different needs. |
| 105 | + |
| 106 | +- **Community Edition (AGPLv3):** Perfect for individual developers, open-source projects, and academic use. If you use `omnipkg` in a project that is also open-source under a compatible license, you're good to go. The source code is available in this repository under the [GNU AGPLv3](LICENSE). |
| 107 | + |
| 108 | +- **Commercial License:** Required for use in closed-source commercial software, proprietary systems, or for any organization that cannot comply with the terms of the AGPLv3. This license allows you to integrate `omnipkg` without the obligation to open-source your own code. |
| 109 | + |
| 110 | + → **To inquire about a commercial license, please contact:** [**omnipkg@proton.me**](mailto:omnipkg@proton.me) |
0 commit comments