Universal Archive · IA · Cloud · API REST · Multi-plateforme — Python 3.14

Universal
Installer V2.0

Gestionnaire universel d'archives avec IA prédictive, compression delta UXC v3, cloud S3/Azure/GCS, API REST FastAPI, installateurs natifs Windows/Linux/macOS, marketplace de plugins — 100% Python 3.14.

Python 3.14 PyQt6 GUI IA ONNX Cloud S3/Azure/GCS REST API FastAPI AES-256-GCM MSI·MSIX·Snap·PKG·DMG UXC v3+Delta
16+
Formats
UXC
v3+IA+Delta
AES
256-GCM
3.14
Python
S3
Azure GCS
REST
FastAPI
Installeurs
GUI
3 Thèmes
01

À propos de Universal_Installer V2.0

Universal_Installer V2.0 est la version majeure qui transforme l'outil en plateforme complète. Développé par Tristan Ruard, il intègre désormais l'intelligence artificielle pour la sélection d'algorithme, le cloud (S3, Azure, GCS), une API REST FastAPI, la compression delta UXC v3, et des installateurs natifs pour Linux (Snap, AppImage) et macOS (PKG, DMG).

🤖 IA Prédictive

Modèle ML (ONNX/sklearn) sélectionne l'algo optimal par bloc : UXC, Zstd, LZ4 ou STORED. 19 features d'entropie en <1ms/bloc.

☁ Cloud Natif

Compress & upload atomique vers AWS S3, Azure Blob ou GCS. Retry exponentiel 3×, presigned URLs, toutes storage classes.

🌐 API REST

FastAPI avec 10 endpoints, WebSocket progression temps réel, sessions, auth Bearer, Swagger UI. Idéal CI/CD.

🗺 Delta UXC v3

Format .uxcd — patches bsdiff4 différentiels. Blocs identiques référencés (0 byte). Ne retransmet que ce qui a changé.

🐧 Linux

Snap (snapcraft.yaml auto) et AppImage (appimagetool auto-téléchargé). Compatible toutes distributions.

🍎 macOS

PKG (pkgbuild+productbuild+signature Developer ID) et DMG (hdiutil+AppleScript+zlib-9).

🏪 Marketplace

Catalogue JSON signé, vérification SHA-256 obligatoire, GUI install/uninstall/search. Plugins "🔒 Vérifiés".

👀 Watch

4 stratégies (immediate/debounced/scheduled/incremental). Watchdog + rotation + cloud upload auto.

Universal_Installer V2.0 est rétro-compatible V1.x. Les archives .uxc V1 sont lues sans modification. Les plugins V1.2 fonctionnent en V2.0 sans changement.
02

Installation

Prérequis

PyPI

pip install universal-installer # Core : UXC, ZIP, 7Z, TAR, ISO, RAR + AES-256-GCM pip install universal-installer[gui] # + GUI PyQt6 (3 thèmes + prévisualisation) pip install universal-installer[all] # Tout (sans extensions C) # V2.0 par fonctionnalité pip install universal-installer[ai] # IA prédictive (scikit-learn + onnxruntime) pip install universal-installer[cloud] # Cloud S3 + Azure + GCS pip install universal-installer[cloud_s3] # AWS S3 uniquement (boto3) pip install universal-installer[cloud_azure] # Azure Blob uniquement pip install universal-installer[cloud_gcs] # Google Cloud uniquement pip install universal-installer[api] # API REST (fastapi + uvicorn + pydantic) pip install universal-installer[delta] # Compression delta (bsdiff4) pip install universal-installer[watch] # CLI Watch (watchdog) pip install universal-installer[pdf_preview] # Prévisualisation PDF (PyMuPDF) pip install universal-installer[sfx] # Archives SFX (PyInstaller) pip install universal-installer[formats_extra] # CAB écriture + LZ4

Depuis les sources

git clone https://github.com/tristanruard/universal-installer cd universal-installer pip install -e ".[all]"

Vérification

universal-installer --version # Universal_Installer v2.0.0 — Python 3.14 — UXC v3 Engine OK — AI: ONNX uxc-extract --version # uxc-extract 2.0.0 — Universal_Installer universal-installer-api --host 0.0.0.0 --port 8080 # → http://localhost:8080/docs (Swagger UI) # → http://localhost:8080/redoc (ReDoc)

Dépendances système optionnelles

FonctionnalitéOutilPlateformeInstallation
MSI BuilderWiX Toolset 4.xWindowsdotnet tool install --global wix
MSIX BuilderWindows SDK (makeappx)Windowsdeveloper.microsoft.com/windows/downloads
Snap BuildersnapcraftLinuxsudo snap install snapcraft --classic
AppImage BuilderappimagetoolLinuxAuto-téléchargé depuis GitHub si absent
PKG / DMG BuilderXcode CLI ToolsmacOSxcode-select --install
Signature PKGDeveloper ID Installer certmacOSApple Developer Program
Extraction WIMwimlib-imagexTouswimlib.net
Écriture CABcabfileTouspip install cabfile
Lecture RARunrar runtimeTousGestionnaire de paquets système
Patches delta optimauxbsdiff4Touspip install bsdiff4
Prévisualisation PDFPyMuPDFTouspip install pymupdf
IA ONNX RuntimeonnxruntimeTouspip install onnxruntime
03

Démarrage rapide

CLI
# UXC v3 avec IA (recommandé) universal-installer compress ./mon_projet -o release.uxc -l max # Avec chiffrement AES-256-GCM universal-installer compress ./data -o archive.uxc \ -l max --password "mon_secret" # Upload cloud atomique universal-installer compress ./dist \ -o s3://my-bucket/releases/app-v2.uxc -l max # Extraction universal-installer extract archive.uxc -o ./sortie/ universal-installer extract archive.uxc -o ./sortie/ \ --password "mon_secret" # Delta : créer et appliquer un patch universal-installer delta create v1.uxc v2.uxc -o update.uxcd universal-installer delta apply v1.uxc update.uxcd -o v2.uxc # Watch : compression auto sur changements universal-installer watch ./mon_projet -o ./backups/ \ --strategy debounced --delay 5 # API REST universal-installer-api --host 0.0.0.0 --port 8080
API Python
from universal_installer import compress, extract, Archive from universal_installer.cloud import CloudStorage, S3Config from universal_installer.core.uxc.ai_selector import AIAlgoSelector from universal_installer.core.uxc.delta import UXCDelta # Compression avec IA stats = compress("./mon_projet", "release.uxc", format="uxc", level="max") print(f"Ratio: {stats.ratio:.1%} — {stats.elapsed:.1f}s") # Cloud upload atomique S3 storage = CloudStorage(S3Config(bucket="my-archives")) result = storage.compress_and_upload( "./dist/", "releases/app-v2.uxc", level="max" ) print(f"URL : {result.public_url}") print(f"SHA-256: {result.sha256}") print(f"Ratio : {result.ratio:.1%}") # IA : prédire l'algo optimal pour un bloc sel = AIAlgoSelector() algo = sel.predict(open("fichier.bin", "rb").read()) print(f"Meilleur algo: {algo}") # Delta : patch différentiel p = UXCDelta() p.create_patch("v1.0.uxc", "v1.1.uxc", "update.uxcd") p.apply_patch("v1.0.uxc", "update.uxcd", "v1.1.uxc") # Explorer une archive with Archive("archive.uxc") as arc: for e in arc.list(): print(e.name, e.size)
Universal_Installer V2.0 détecte automatiquement le format par magic bytes et sélectionne l'algorithme optimal par bloc via l'IA. Tout est automatique par défaut.
04

Interface Graphique V2.0 (PyQt6)

La GUI Universal_Installer V2.0 hérite du design dark-theme enrichi de 3 thèmes, d'un canvas MSI interactif, du Marketplace plugins, de la prévisualisation de fichiers et de toutes les actions V1.1/V1.2/V2.0.

universal-installer gui
Barre de menu V2.0

Fichier : Ouvrir · Créer · Compresser en UXC · Convertir · Extraire tout · Quitter
Édition : Tout sélectionner · Rechercher (Ctrl+F)
Vue : Thème (Dark/Light/High Contrast) · Actualiser (F5)
Outils : Vérifier · Réparer · Créer SFX · Diviser · Assembler · Benchmark
Installateurs : MSI · MSIX · Canvas MSI · Snap · AppImage · PKG · DMG
Plugins : Marketplace · Charger plugins locaux
Aide : À propos · Documentation · Changelog

Raccourcis clavier

Ctrl+O : Ouvrir archive
Ctrl+N : Créer archive
Ctrl+E : Extraire tout
Ctrl+A : Tout sélectionner
Ctrl+F : Rechercher dans l'archive
Ctrl+B : Lancer Benchmark
Ctrl+Q : Quitter
F5 : Actualiser l'archive
Double-clic : Prévisualiser le fichier
Clic droit : Menu contextuel complet

Explorateur d'archives

Colonnes : Nom / Taille / Compressé / Ratio / Date / CRC32 / Type. Tri par clic d'en-tête. Filtre de recherche temps réel. Sélection multiple. Drag & drop.

Panneau d'informations

Format · Fichiers & dossiers · Taille orig/comp · Ratio · Algorithme · SHA-256 · Chiffré : 🔒 Oui/Non · Réparé : ⚠ si repaired flag

Toolbar (9 boutons)

📂 Ouvrir · 🗜 Compresser · 📤 Extraire · 🔄 Convertir · 🔧 Réparer · 📦 SFX · 📊 Benchmark · 🪟 MSI · 📦 MSIX

Glisser-déposer une archive sur la fenêtre l'ouvre. Glisser-déposer un dossier ou un fichier non-archive ouvre le dialog de compression avec la source pré-remplie.
05

Formats Supportés

FormatExtensionLectureÉcritureÉditionLibVersionNotes
UXC v3.uxcNatifV2.0IA algo · AES-GCM · Dict partagé · Réparation
ZIP.zip .jar .apk .whlzipfileV1.0Deflate / Store / LZMA / BZ2 / Zstd
7-Zip.7zpy7zrV1.0LZMA2, BCJ, Delta
TAR.tar .tar.gz .tgztarfileV1.0Avec GZ / BZ2 / XZ / ZST
GZIP.gzgzipV1.0Fichier unique uniquement
BZIP2.bz2bz2V1.0Fichier unique uniquement
XZ/LZMA.xz .lzmalzmaV1.0Haute compression
Zstandard.zstzstandardV1.0Meta/Facebook — rapide
RAR.rar .r00rarfileV1.0Lecture uniquement (propriétaire)
ISO 9660.isopycdlibV1.0ISO9660 + Joliet + Rock Ridge + UDF
IMG Raw.img .binNatifV1.0Images disque brutes
CAB.cabnatif+cabfileV1.1Cabinet Windows — magic MSCF
WIM.wim .esdwimlib-imagexV1.1Images Windows — wimlib requis
MSI.msimsilib+WiXV1.0Windows Installer — WiX 4.x requis
MSIX.msix .appxmakeappxV1.0Packages modernes Windows 10/11
UXC Delta.uxcdNatifV2.0Patches différentiels bsdiff4
La détection automatique est basée sur les magic bytes (signature binaire en début de fichier), indépendamment de l'extension. Les plugins tiers installés via le Marketplace ajoutent automatiquement leurs formats à cette détection.
06

Algorithme UXC v3 CUSTOM V2.0

UXC v3 est l'évolution majeure de l'algorithme custom. Il combine le moteur LZ77+ANS avec l'IA prédictive par bloc, le dictionnaire partagé inter-fichiers, et la sélection automatique UXC/Zstd/LZ4/STORED.

Phase Compression (IA-guidée)

1. Analyse entropique — 19 features par bloc de 64 Ko : entropie Shannon, bigrammes, run-length, magic bytes, type fichier.

2. IA sélectionne l'algo — ONNX (~1ms) ou heuristique : UXC pour texte/code, Zstd pour binaire, LZ4 pour lecture rapide, STORED pour données déjà compressées.

3. Dictionnaire partagé — LZ77 pré-entraîné sur les N premiers fichiers, préfixe injecté dans chaque bloc pour maximiser les références cross-fichiers.

4. LZ77 + ANS rANS — fenêtre jusqu'à 32 Mo, tables pré-calculées, décodage sans branchement conditionnel.

5. AES-256-GCM — chiffrement par bloc si activé, nonce unique par index, tag d'authentification 16B.

Phase Décompression (ultra-rapide)

1. Lecture header + crypto — header 128B, crypto header 28B (si chiffré), dict partagé, TOC chargés en une lecture.

2. Déchiffrement AES-GCM — par bloc, nonce reconstruit depuis index, vérification tag GCM, rejet immédiat si invalide.

3. Décompression parallèle — blocs indépendants sur tous les cœurs via ThreadPoolExecutor.

4. Décodage par type — ANS rANS (UXC), Zstd, LZ4, ou copie directe (STORED). Sélectionné depuis algo_hint du BLOCK_TABLE.

5. Assemblage mmap — zéro copie, vérification SHA-256 finale optionnelle.

Format binaire .uxc V2 (VERSION_MINOR = 2)

HEADER (128B) : Magic "UXC!" · Version 1.2 · Flags · NumBlocks · DictSize : OrigSize · CompSize · FileCount · SHA256 (32B) : split_index/split_total · shared_dict_size · CRC32 CRYPTO HDR (28B): Salt 16B + Nonce_base 12B [si ENCRYPTED] SHARED DICT (var): Dictionnaire LZ77 partagé [si SHARED_DICT] TOC (var) : toc_size 4B + N × ArchiveEntry (nom, taille, crc, offset bloc) BLOCK TABLE : NumBlocks × 40B = offset_data + size_comp + size_orig : + block_type + dict_index + crc32 + crypto_tag_offset + algo_hint DATA (var) : Blocs compressés concaténés

Niveaux de compression

NiveauFenêtre LZ77Passes ANSVitesse comp.Ratio typiqueUsage recommandé
store0∞ Mo/s0%Déjà compressé (JPEG, MP4, ZIP)
fast256 Ko1~400 Mo/s30-40%Sauvegardes rapides
normal2 Mo1~80 Mo/s45-55%Usage quotidien
max16 Mo2~15 Mo/s55-70%Distribution logicielle ★
ultra32 Mo3~3 Mo/s60-75%Archives long terme
Le niveau max est recommandé pour les installateurs. Avec l'IA activée (défaut), les blocs non-compressibles (JPEG, ZIP, PDF…) sont automatiquement en STORED — pas de surcoût de traitement sur des données déjà compressées.
07

Chiffrement AES-256-GCM V1.1

Chaque bloc est chiffré indépendamment avec un nonce unique dérivé de son index, garantissant que la corruption ou modification d'un bloc ne compromet pas les autres.

Paramètres de sécurité

Algorithme : AES-256-GCM (authentifié)
Dérivation clé : PBKDF2-HMAC-SHA256, 600 000 itérations
Salt : 16 bytes aléatoires uniques par archive
Nonce : nonce_base XOR LE(block_index, 12B)
Tag GCM : 16 bytes d'authentification par bloc

⚠ Avertissement critique

Un mot de passe perdu = archive irrécupérable. AES-256-GCM sans backdoor. 600k itérations PBKDF2 rendent le brute-force extrêmement coûteux. Utilisez un gestionnaire de mots de passe pour archiver vos clés.

from universal_installer import compress, extract # Compression avec chiffrement compress("./data/", "archive.uxc", format="uxc", level="max", password="mot_de_passe_fort_minimum_16_chars") # Extraction avec déchiffrement extract("archive.uxc", "./sortie/", password="mot_de_passe_fort_minimum_16_chars") # CLI : -p / --password # universal-installer compress ./data -o archive.uxc -l max -p "secret" # universal-installer extract archive.uxc -o ./sortie/ -p "secret"
La dépendance cryptography>=42.0 est incluse dans l'installation de base V2.0. Aucun [crypto] extra supplémentaire n'est nécessaire.
08

IA Prédictive Algo V2.0

Le module IA analyse chaque bloc de 64 Ko et sélectionne l'algorithme optimal en moins d'une milliseconde. Sur des corpus mixtes, le gain typique est de +2 à +5% de ratio par rapport à UXC seul.

Features extraites (19 dimensions)

Entropie & Distribution bytes

• Entropie de Shannon (0-8 bits) et normalisée (0-1)
• Nombre de bytes uniques (0-256)
• Ratio bytes zéro · Ratio ASCII imprimables · Ratio bytes hauts (>0x7F)
• Entropie des bigrammes (paires consécutives de bytes)

Structure & Type de contenu

• Ratio run-length (séquences répétées)
• Score texte · Score binaire · Score déjà compressé · Score code source
• Reconnaissance magic bytes (compressé/image/exécutable/inconnu)
• Estimation LZ77 rapide (scan 512B) · Estimation Zstd niveau 1

Backends disponibles

BackendVitesseConditionPrécision
ONNX Runtime~1ms/bloconnxruntime + algo_selector.onnx dans ~/.universal_installer/models/Entraîné sur corpus
scikit-learn~5ms/blocscikit-learn + algo_selector.pkl dans ~/.universal_installer/models/Entraîné sur corpus
Heuristique~0.1ms/blocToujours disponible — sans aucune dépendanceRègles expertes
from universal_installer.core.uxc.ai_selector import AIAlgoSelector, AlgoSelectorTrainer # Prédiction runtime sel = AIAlgoSelector() print(f"Backend actif : {sel.backend}") # "onnx" | "sklearn" | "heuristic" data = open("fichier.bin", "rb").read() algo = sel.predict(data) # → "uxc" | "zstd" | "lz4" | "stored" # Benchmark comparatif sur un bloc ratios = sel.benchmark_block(data) # {"uxc_estimate": 0.65, "zstd": 0.61, "lz4": 0.45} # Entraînement offline sur votre corpus trainer = AlgoSelectorTrainer() nb = trainer.collect_samples("./training_corpus/") # benchmark réel trainer.train() # GradientBoostingClassifier, ~2 min sur 10k blocs trainer.export_onnx("~/.universal_installer/models/algo_selector.onnx") trainer.export_sklearn("~/.universal_installer/models/algo_selector.pkl")
09

Compression Delta UXC v3 V2.0

Le fichier patch .uxcd ne contient que les blocs modifiés — les blocs identiques sont référencés par SHA-256 (zéro byte dans le patch). Idéal pour les mises à jour logicielles différentielles.

Format .uxcd

HEADER_DELTA (64B) : magic "UXCD", SHA-256 source, SHA-256 target (partiel), nb patches, total blocs
PATCH_TABLE (N×48B) : block_idx, patch_type, patch_size, orig_sha256, offset
PATCH_DATA (var) : données bsdiff4 ou blocs complets

Types de patches

IDENTICAL (0) : blocs identiques — 0 byte dans le patch, réutilise le bloc source
BSDIFF (1) : diff binaire optimal via bsdiff4 — taille minimale
FULL (2) : bloc complet — si bsdiff4 absent ou bloc entièrement nouveau

universal-installer delta create v1.0.uxc v1.1.uxc -o update.uxcd # → Blocs modifiés: 142/2847 Taille: 480 Ko Ratio économie: 68% universal-installer delta apply v1.0.uxc update.uxcd -o v1.1_restored.uxc # → SHA-256 vérifié: ✅ 142 blocs appliqués 0.3s universal-installer delta stats update.uxcd # → identical:2705 bsdiff:98 full:44 patch_size:491Ko
from universal_installer.core.uxc.delta import UXCDelta p = UXCDelta() stats = p.create_patch("v1.0.uxc", "v1.1.uxc", "update.uxcd") print(f"Blocs modifiés : {stats['changed_blocks']}/{stats['total_blocks']}") print(f"Taille patch : {stats['patch_size_bytes']/1024:.1f} Ko") result = p.apply_patch("v1.0.uxc", "update.uxcd", "v1.1.uxc") print(f"SHA-256 vérifié: {result['verified']}") info = p.patch_stats("update.uxcd") print(f"bsdiff: {info['bsdiff_patches']} full: {info['full_patches']}")
Le patch .uxcd ne s'applique qu'à la source exacte (vérification SHA-256). Installez bsdiff4 (pip install universal-installer[delta]) pour des patches optimaux. Sans bsdiff4, les blocs modifiés sont stockés complets (fallback FULL).
10

Opérations de Compression

Via CLI

universal-installer compress <source> -o <sortie> [options] -f, --format uxc, zip, 7z, tar.gz, iso… (défaut: uxc) -l, --level store, fast, normal, max, ultra (défaut: normal) -t, --threads Threads (défaut: auto = nb CPU) -p, --password Mot de passe AES-256-GCM / ZIP / 7Z --split Volumes : 100M, 700M, 4G… --exclude Patterns : "*.tmp,__pycache__,.git" --no-verify Ne pas vérifier SHA-256 après compression --no-shared-dict Désactiver le dictionnaire partagé (V1.2) --no-ai Désactiver la sélection IA par bloc (V2.0)

Via API Python

from universal_installer.core.uxc.engine import UXCCompressor c = UXCCompressor( level="max", threads=8, password="mon_secret", # AES-256-GCM split_size=700*1024*1024, # Volumes 700 Mo use_shared_dict=True, # Dict partagé V1.2 auto_algo=True, # IA algo V2.0 progress_cb=lambda p: print( f"\r{p:.0%}", end=""), ) with c: c.add_directory("./mon_projet", exclude=["*.tmp", "__pycache__"]) c.add_bytes("version.txt", b"2.0.0") stats = c.compress("release.uxc") print(f"Ratio : {stats.ratio:.1%}") print(f"Durée : {stats.elapsed:.1f}s") print(f"SHA-256 : {stats.sha256}") print(f"Chiffré : {stats.encrypted}")
La compression est thread-safe. Plusieurs UXCCompressor peuvent s'exécuter simultanément dans des threads différents sans conflit.
11

Opérations de Décompression

Via CLI

universal-installer extract <archive> [options] -o, --output Dossier de sortie (défaut: .) -p, --password Mot de passe si archive chiffrée -f, --files Extraire uniquement certains fichiers (glob) --overwrite Écraser les fichiers existants --no-verify Désactiver la vérification SHA-256 --flat Sans recréer l'arborescence -t, --threads Threads (défaut: auto) --repair Mode réparation (blocs CRC invalides → zéros)

Via API Python

from universal_installer import extract, Extractor # Extraction complète avec déchiffrement extract("archive.uxc", "./sortie/", password="secret") # Extraction partielle with Extractor("archive.7z") as e: e.extract_file("config/app.json", "./out/") e.extract_pattern("**/*.dll", "./libs/") raw = e.read_file("config.json") # → bytes en mémoire # Décompresseur avancé from universal_installer.core.uxc.engine import UXCDecompressor d = UXCDecompressor(threads=8, verify=True, password="secret", repair=False) stats = d.decompress("archive.uxc", "./sortie/") print(f"{stats.original_size/1e6/stats.elapsed:.0f} Mo/s")
La décompression UXC est parallélisée sur tous les blocs indépendants. Sur un CPU 8 cœurs, cela peut être jusqu'à 6× plus rapide qu'une implémentation mono-thread. Le déchiffrement AES-256-GCM est également parallélisé bloc par bloc.
12

Édition d'Archives

Ajouter

Drag & drop GUI, ou :
universal-installer add archive.uxc fichier.txt

Supprimer

Sélection + Delete GUI, ou :
universal-installer delete archive.zip "*.tmp"

Renommer / MàJ

arc.rename("ancien", "nouveau")
arc.update_file("README.md", "./v2.md")

from universal_installer import Archive with Archive("release.zip", mode="a") as arc: arc.add_file("./CHANGELOG.md") arc.add_bytes("version.json", b'{"version":"2.0.0"}') arc.delete("debug.log") arc.delete_pattern("**/*.pyc") arc.rename("config.example", "config.default") arc.update_file("README.md", "./README_v2.md") arc.mkdir("docs/")
13

Conversion entre Formats

CLI
universal-installer convert source.zip -o sortie.uxc -l max universal-installer convert archive.rar -o archive.zip universal-installer convert backup.tar.gz -o backup.7z -l ultra universal-installer convert ./dossier/ -o image.iso -f iso
API Python
from universal_installer import convert_archive convert_archive( source="ancien.zip", destination="nouveau.uxc", target_level="max", in_memory=True, # zéro fichier intermédiaire verify=True, )
14

SFX & Multi-volumes V1.1

Archive auto-extractible (.exe)

Stratégie A : PyInstaller

Vrai EXE natif Windows/Linux. Ne nécessite pas Python sur la cible. Nécessite PyInstaller en environnement de build.

Stratégie B : Stub Python

Script Python renommé .exe. Nécessite Python installé sur la cible. Utilisé automatiquement si PyInstaller est absent.

universal-installer sfx create archive.uxc -o setup.exe \ --run-after install.bat --title "Mon Application V2.0"
from universal_installer.archive.sfx import SFXBuilder, SFXOptions opts = SFXOptions( archive_path="mon_app.uxc", output_path="setup.exe", title="Mon Application V2.0", run_after="install.bat", extract_dir="C:\\MonApp", # vide = temp auto silent=False, ) SFXBuilder(opts).build()

Multi-volumes

from universal_installer.archive.sfx import MultiVolumeManager # Découper en volumes de 700 Mo vols = MultiVolumeManager.split("archive.uxc", size_mb=700, output_dir="./vols/") print(f"{len(vols)} volumes créés") # Assembler (ou via uxc-extract archive.uxc.001) MultiVolumeManager.join("./vols/archive.uxc.001", "archive_restored.uxc")
15

Réparation d'Archives V1.1

En cas de corruption partielle (secteurs défectueux, téléchargement interrompu), Universal_Installer récupère les blocs CRC32-valides et reconstruit une archive fonctionnelle. Les blocs corrompus sont remplacés par des zéros.

from universal_installer.core.uxc.engine import UXCRepair result = UXCRepair.repair("archive_corrompue.uxc", "reparee.uxc") print(f"OK : {result['ok']}") print(f"Fichiers récup: {result['file_count']}") print(f"Blocs réparés : {result['repaired_blocks']}")
universal-installer repair archive_corrompue.uxc -o reparee.uxc uxc-extract archive_corrompue.uxc -o ./sortie/ --repair
La réparation est au mieux-effort : aucune garantie de récupération complète. Les fichiers dans des blocs corrompus peuvent être illisibles (zéros). La réparation marque l'archive avec le flag REPAIRED (visible dans le panneau info GUI).
16

Prévisualisation de Fichiers V1.1

Double-cliquez sur n'importe quel fichier dans l'explorateur pour le prévisualiser sans l'extraire sur disque. Chargement en thread background.

TypeExtensionsRenduLimite
Textepy, js, ts, md, yaml, toml, sql, sh, bat, rb, go, rs, java, php…Monospace, coloration syntaxique légère512 Ko
JSONjson, jsonc, geojsonFormaté, indenté (indent=2)512 Ko
Imagespng, jpg, jpeg, gif, bmp, ico, webpQPixmap redimensionné à la vue8 Mo
PDFpdfPage 1 via PyMuPDF (optionnel)pip install pymupdf requis
BinaireTout autreHex dump 16B/ligne + ASCII latéral4096 bytes affichés
Détection texte automatique : si 85%+ des bytes sont ASCII imprimables, le fichier est affiché en mode texte quelle que soit son extension. Bouton "🔢 Vue hexadécimale" disponible pour forcer l'affichage hex sur tout fichier.
17

Intégration Cloud V2.0

Universal_Installer V2.0 intègre nativement le compress & upload atomique vers AWS S3, Azure Blob Storage et Google Cloud Storage.

AWS S3 et compatibles (MinIO, Wasabi, Backblaze B2)

from universal_installer.cloud import CloudStorage, S3Config # AWS S3 (credentials depuis env ou explicites) storage = CloudStorage(S3Config( bucket="my-releases", region="eu-west-3", storage_class="STANDARD_IA", # access_key="AKIA...", secret_key="..." (optionnel si env vars) )) # Endpoint custom (MinIO, Wasabi…) storage = CloudStorage(S3Config( bucket="my-bucket", endpoint_url="https://s3.wasabisys.com", access_key="...", secret_key="...", )) result = storage.compress_and_upload( source="./dist/", remote_key="releases/app-v2.0.uxc", format="uxc", level="max", retry=3, progress_cb=lambda p: print(f"\r{p:.0%}", end=""), ) print(f"URL : {result.public_url}") print(f"SHA-256 : {result.sha256}") print(f"Ratio : {result.ratio:.1%}") print(f"Vitesse : {result.upload_speed_mbps:.1f} Mo/s")

Azure Blob Storage

from universal_installer.cloud import CloudStorage, AzureConfig storage = CloudStorage(AzureConfig( container="archives", connection_string="DefaultEndpointsProtocol=https;AccountName=...", # ou env : AZURE_STORAGE_CONNECTION_STRING )) result = storage.compress_and_upload("./dist/", "releases/app-v2.uxc")

Google Cloud Storage

from universal_installer.cloud import CloudStorage, GCSConfig storage = CloudStorage(GCSConfig( bucket="my-archives", project="my-gcp-project", credentials_file="~/.gcloud/key.json", # ou env : GOOGLE_APPLICATION_CREDENTIALS storage_class="NEARLINE", )) result = storage.compress_and_upload("./dist/", "releases/app-v2.uxc")
L'upload est atomique : compression en local (temp), puis upload avec 3 tentatives (retry exponentiel 2^n). En cas d'échec définitif, le temp est supprimé et une exception levée. Le bucket ne contiendra jamais d'archive partielle.
18

API REST FastAPI V2.0

Lancement

universal-installer-api --host 0.0.0.0 --port 8080 --workers 4 UNIVERSAL_INSTALLER_API_KEY=ma_cle universal-installer-api --port 8080 # Documentation auto # http://localhost:8080/docs → Swagger UI interactif # http://localhost:8080/redoc → ReDoc # http://localhost:8080/openapi.json → OpenAPI JSON

Endpoints

MéthodeEndpointDescriptionHeaders réponse clés
POST/compressComprime un upload, retourne l'archiveX-Ratio, X-SHA256, X-Session-ID
POST/extractExtrait une archive, retourne ZIP des fichiersContent-Disposition
POST/uploadUpload fichier → retourne session_idsession_id, filename, size
GET/inspect/{id}Métadonnées archive sans extraction (200 entrées max)JSON complet
POST/convertConversion entre formatsContent-Disposition
POST/delta/createPatch delta entre deux archives UXCX-Changed-Blocks, X-Identical-Blocks, X-Ratio
POST/delta/applyApplication d'un patch deltaX-Verified
GET/formatsFormats read/write supportésJSON {read:[], write:[]}
GET/healthHealth checkJSON {status:"ok", timestamp}
GET/versionVersion, Python, plateformeJSON complet
WS/ws/progress/{id}Progression en temps réel (polling 500ms)JSON {status, progress, result, error}
# Compresser via curl curl -X POST http://localhost:8080/compress \ -H "Authorization: Bearer ma_cle" \ -F "file=@./dist.zip" -F "format=uxc" -F "level=max" \ -o release.uxc # Extraire via curl curl -X POST http://localhost:8080/extract \ -F "file=@archive.uxc" -F "password=secret" \ -o extracted.zip # Créer un patch delta curl -X POST http://localhost:8080/delta/create \ -F "source=@v1.0.uxc" -F "target=@v1.1.uxc" \ -o update.uxcd # WebSocket progression (JavaScript) const ws = new WebSocket("ws://localhost:8080/ws/progress/SESSION_ID"); ws.onmessage = e => { const d = JSON.parse(e.data); console.log(`${d.status} — ${(d.progress*100).toFixed(0)}%`); };
19

CLI Watch — Compression Auto V2.0

Surveille un dossier et comprime automatiquement selon la stratégie choisie. Idéal pour les sauvegardes automatiques en développement ou en production.

StratégieDéclencheurUsage typique
immediateDès qu'un fichier changeFichiers critiques, faible volume
debouncedN secondes d'inactivité (défaut 5s)Développement actif — recommandé ★
scheduledIntervalle fixe (défaut 5 min)Sauvegardes régulières production
incrementalPolling 30s + uniquement fichiers modifiésGrandes arborescences, peu de changements
universal-installer watch ./mon_projet \ --output ./backups/ \ --strategy debounced \ --delay 10 \ --format uxc --level normal \ --max-archives 20 # Avec upload S3 automatique après chaque compression universal-installer watch ./dist \ --output ./backups/ \ --cloud s3 --bucket my-bucket --region eu-west-3
from universal_installer.ui.cli.watch import FileWatcher watcher = FileWatcher( source="./mon_projet", output_dir="./backups/", format="uxc", strategy="debounced", debounce_delay=5.0, max_archives=20, on_compress=lambda path, stats: print(f"✅ {path} ratio={stats['ratio']:.1%}"), ) watcher.start(block=True) # ou block=False pour thread daemon
Installez watchdog (pip install universal-installer[watch]) pour une surveillance événementielle efficace. Sans watchdog, un polling de 2 secondes est utilisé automatiquement (fallback transparent).
20

Création MSI — Windows Installer

Crée des installateurs Windows professionnels via WiX Toolset 4.x. Le GUI MSI Builder (3 onglets : Produit / Raccourcis & Associations / Registre & Options) est accessible depuis Installateurs → Créer MSI....

CLI
universal-installer msi create \ --name "MonApplication" \ --version 2.0.0 \ --manufacturer "Tristan Ruard" \ --source ./dist/mon_app/ \ --icon ./assets/icon.ico \ --license ./LICENSE.rtf \ --banner ./assets/banner.bmp \ --output ./release/MonApp-2.0.0.msi
API Python
from universal_installer.installer import MSIBuilder builder = MSIBuilder( name="MonApplication", version="2.0.0", manufacturer="Tristan Ruard", source_dir="./dist/", output="./release/MonApp-2.0.0.msi", upgrade_code="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", ) builder.set_icon("./assets/icon.ico") builder.set_license("./LICENSE.rtf") builder.set_banner("./assets/banner.bmp") # 493×58 px builder.set_dialog_bg("./assets/dialog.bmp") # 493×312 px builder.add_shortcut("MonApp", "MonApp.exe", desktop=True, start_menu=True, start_menu_folder="Tristan Ruard") builder.add_env_variable("MONAPP_HOME", "[INSTALLDIR]") builder.add_registry_key("HKLM", r"Software\MonApp", {"Version": "2.0.0", "InstallDir": "[INSTALLDIR]"}) builder.add_file_association(".mxf", "Fichier MonApp", "MonApp.exe", icon="MonApp.exe,0") builder.add_condition( "VersionNT >= 1000", "Windows 10 ou supérieur requis.") builder.build()
La création MSI nécessite WiX Toolset 4.x sur Windows uniquement : dotnet tool install --global wix. Non disponible sur Linux/macOS.
21

Création MSIX — Package Moderne Windows 10/11

Packaging moderne pour le Microsoft Store ou la distribution directe. Le GUI MSIX Builder (3 onglets : Manifeste / Assets & Capacités / Signature) est accessible depuis Installateurs → Créer MSIX....

CLI
universal-installer msix create \ --name "MonApp" \ --publisher "CN=TristanRuard" \ --version 2.0.0.0 \ --source ./dist/ \ --assets ./assets/logos/ \ --cert ./cert.pfx \ --cert-pass "secret" \ --output ./release/MonApp.msix
API Python
from universal_installer.installer import MSIXBuilder builder = MSIXBuilder( name="MonApp", publisher="CN=TristanRuard", version="2.0.0.0", source_dir="./dist/", output="./release/MonApp.msix", ) builder.add_visual_assets("./assets/logos/") builder.add_capability("internetClient") builder.add_capability("privateNetworkClientServer") builder.add_file_association(".mxf", "Fichier MonApp") builder.sign("./cert.pfx", "secret", timestamp="http://timestamp.sectigo.com") builder.build()
MSIX nécessite le Windows SDK (makeappx.exe). Pour un certificat de test : New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=TristanRuard" dans PowerShell.
22

Snap & AppImage — Installateurs Linux V2.0

Snap — Compatible toutes distributions

from universal_installer.installer.linux import SnapBuilder, SnapPart builder = SnapBuilder( name="mon-app", version="2.0.0", summary="Mon Application", description="Application Python ultra-rapide V2.0", source_dir="./dist/", output="./release/", confinement="strict", # strict | classic | devmode grade="stable", # stable | candidate | beta | edge architectures=["amd64", "arm64"], ) builder.add_command("mon-app", "./bin/mon_app", plugs=["network", "home"]) builder.set_license("MIT") snap_path = builder.build() # → ./release/mon-app_2.0.0_amd64.snap

AppImage — Portable sans installation

from universal_installer.installer.linux import AppImageBuilder builder = AppImageBuilder( name="MonApp", version="2.0.0", source_dir="./dist/", output="./release/MonApp-2.0.0-x86_64.AppImage", executable="./bin/mon_app", icon="./assets/icon.png", categories="Utility;", description="Mon Application V2.0", arch="x86_64", # ou "arm64", "i686" ) appimage_path = builder.build() # appimagetool auto-téléchargé depuis GitHub si absent
Snap prérequis : sudo snap install snapcraft --classic. AppImage : appimagetool est téléchargé automatiquement depuis GitHub AppImageKit dans ~/.local/bin/ si absent du PATH.
23

PKG & DMG — Installateurs macOS V2.0

PKG — Installateur natif macOS

from universal_installer.installer.macos import PKGBuilder builder = PKGBuilder( name="MonApp", version="2.0.0", identifier="com.tristan.monapp", source_dir="./dist/MonApp.app", output="./release/MonApp-2.0.0.pkg", install_location="/Applications", min_os_version="12.0", ) builder.add_preinstall_script("./scripts/preinstall.sh") builder.add_postinstall_script("./scripts/postinstall.sh") builder.sign("Developer ID Installer: Tristan Ruard") builder.set_welcome("./resources/welcome.html") builder.set_license("./resources/license.rtf") pkg_path = builder.build() # → ./release/MonApp-2.0.0.pkg (signé)

DMG — Image disque distribuable

from universal_installer.installer.macos import DMGBuilder builder = DMGBuilder( name="MonApp", version="2.0.0", app_path="./dist/MonApp.app", output="./release/MonApp-2.0.0.dmg", background_image="./assets/dmg_bg.png", # optionnel window_size=(660, 400), icon_size=128, volume_name="MonApp 2.0.0", ) dmg_path = builder.build() # hdiutil UDRW → AppleScript Finder → hdiutil UDZO (zlib-9) # → ./release/MonApp-2.0.0.dmg
PKG — Ce qui se passe

1. pkgbuild crée le composant pkg
2. distribution.xml généré (conditions OS, welcome, license)
3. productbuild crée le pkg final
4. productsign signe (si identité configurée)

DMG — Ce qui se passe

1. Staging : copie .app + symlink /Applications + bg
2. hdiutil create UDRW (lecture/écriture)
3. Montage + AppleScript Finder (positions icônes, vue)
4. hdiutil convert UDZO (lecture seule, zlib-9)

PKG et DMG nécessitent macOS et les Xcode CLI Tools (xcode-select --install). La signature PKG nécessite un certificat Developer ID Installer (Apple Developer Program, payant). Sans signature, le PKG s'installe en mode non signé.
24

Canvas MSI — Flowchart Interactif V2.0

Visualise l'arbre d'installation d'une configuration MSI sous forme de flowchart interactif PyQt6. Chaque étape (conditions, bienvenue, licence, destination, installation, actions post-install) est représentée par un nœud coloré relié par des courbes de Bézier cubiques.

Navigation canvas

Molette souris : zoom in/out (×1.15 par cran)
Drag fond : déplacer la vue (pan scroll)
Drag nœud : repositionner librement
Hover nœud : bordure accent orange + tooltip
Bouton "Ajuster la vue" : fitInView automatique

Types de nœuds

Démarrage (orange) — point d'entrée
Condition (violet) — VersionNT, Installed…
📋 Étape (bleu sombre) — Bienvenue, Licence, Destination
Action (vert sombre) — raccourcis, registre, associations
Terminé (gris) — fin du flux

from universal_installer.ui.gui.msi_canvas import MSIFlowchartDialog # Passer les options MSI récupérées depuis MSIBuilderDialog.get_options() dlg = MSIFlowchartDialog(msi_config={ "conditions": [{"condition": "VersionNT >= 1000", "message": "Win 10+"}], "shortcuts": [{"name": "MonApp", "target": "MonApp.exe"}], "registry_keys": [{"root": "HKLM", "key": r"Software\MonApp"}], "file_associations": [{"extension": ".mxf", "open_with": "MonApp.exe"}], "license": "./LICENSE.rtf", "install_dir": "ProgramFiles64Folder", }, parent=main_window) dlg.exec() # Via menu GUI : Installateurs → Canvas MSI # Bouton export PNG : QImage 1600×1200 haute résolution
25

Édition MSI / MSIX Existants

MSI Editor
from universal_installer.installer import MSIEditor with MSIEditor("app.msi") as msi: # Lire propriétés v = msi.get_property("ProductVersion") print(f"Version actuelle : {v}") # Modifier msi.set_property("ProductVersion", "2.0.1") # Remplacer un fichier embarqué msi.replace_file("app.exe", "./new_app.exe") # Lister les raccourcis for sc in msi.list_shortcuts(): print(sc.name, sc.target)
CLI
# Inspecter universal-installer msi inspect app.msi universal-installer msi list-files app.msi # Résultat exemple : # ProductName : MonApp # ProductVersion : 2.0.0 # Manufacturer : Tristan Ruard # Files : 47 # Shortcuts : 2 # RegistryKeys : 3 # Associations : 1 (.mxf)
26

Plugin API V1.2

Le système de plugins permet d'ajouter des formats d'archives tiers sans modifier le code source. Les plugins sont détectés automatiquement par magic bytes ou extension.

Créer un plugin de format

# mon_plugin/xyz_handler.py from universal_installer.plugin import register_handler, ArchivePlugin, PluginInfo @register_handler( extensions=[".xyz", ".xz2"], magic=b"XYZ!", name="XYZ Format Handler", version="1.0.0", author="John Doe", ) class XYZHandler(ArchivePlugin): def open(self, path, mode="r", password=None): ... def close(self): ... def list(self): ... # → [ArchiveEntry] def read(self, name): ... # → bytes def write(self, name, data): ... def extract_all(self, dest, overwrite=True): ... def get_info(self): ... # → ArchiveInfo

Enregistrer via pip (entry_points)

# pyproject.toml [project.entry-points."universal_installer.plugins"] xyz-format = "mon_plugin.xyz_handler:XYZHandler"

Charger les plugins

from universal_installer.plugin import load_plugins, get_plugin_handler plugins = load_plugins() # Cherche dans : entry_points pip + ~/.universal_installer/plugins/ print(f"{len(plugins)} plugin(s) chargé(s)") for p in plugins: print(f" {p.name} v{p.version} — {p.extensions}") # Obtenir le handler pour un fichier handler_cls = get_plugin_handler("archive.xyz")
Vous pouvez aussi placer directement un fichier monplugin.py dans ~/.universal_installer/plugins/ sans passer par pip. Il sera chargé automatiquement au démarrage ou via load_plugins().
27

Marketplace V2.0

Installez, désinstallez et mettez à jour des plugins communauté. Chaque plugin est vérifié par SHA-256 avant installation — aucun code non vérifié n'est exécuté. Les plugins 🔒 Vérifiés ont été revus manuellement par l'équipe Universal_Installer.

🔒 Sécurité SHA-256 Obligatoire

Le hash SHA-256 de chaque plugin téléchargé est vérifié contre la valeur du catalogue signé. Si le hash ne correspond pas, une SecurityError est levée et l'installation est annulée immédiatement. Aucun code malicieux ne peut être exécuté.

🔒 Vérifiés vs Communauté

Vérifiés : revus et testés par l'équipe. Icône 🔒 dans l'interface. Processus de revue manuel avant publication.
Communauté : SHA-256 uniquement, non revus manuellement. Utilisez avec discernement.

universal-installer marketplace list # Catalogue complet universal-installer marketplace search "audio" # Rechercher par mot-clé universal-installer marketplace install xyz-format # Installer + vérif SHA-256 universal-installer marketplace uninstall xyz-format universal-installer marketplace update-all # Tout mettre à jour
from universal_installer.marketplace import MarketplaceManager, MarketplaceDialog # API Python mgr = MarketplaceManager() catalog = mgr.fetch_catalog(force_refresh=False) # cache TTL 1h print(f"{len(catalog.plugins)} plugins disponibles") results = mgr.search("audio") for p in results: print(f"{'🔒' if p.verified else ' '} {p.name} v{p.version}") mgr.install("xyz-format", progress_cb=lambda m: print(m)) mgr.uninstall("xyz-format") mgr.update_all(progress_cb=lambda m: print(m)) # Dialog GUI dlg = MarketplaceDialog(parent=main_window) dlg.exec() # Via menu : Plugins → Marketplace
28

CLI Référence Complète

universal-installer [COMMAND] [OPTIONS] ━━ Compression ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ compress Compresser un fichier ou dossier extract Extraire (auto-détection format par magic bytes) inspect Inspecter le contenu sans extraction list Lister le contenu avec tri et filtres add Ajouter des fichiers à une archive existante delete Supprimer des fichiers (pattern glob) rename Renommer un fichier dans une archive convert Convertir entre formats verify Vérifier l'intégrité SHA-256 / GCM tags hash Calculer SHA-256 / CRC32 / MD5 / SHA-512 detect Détecter le format par magic bytes repair Réparer une archive corrompue (V1.1) benchmark Comparer les algorithmes sur vos données ━━ SFX & Volumes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sfx create Créer archive auto-extractible (.exe) (V1.1) split Découper en volumes (V1.1) join Assembler des volumes (V1.1) ━━ Delta V2.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ delta create Créer un patch delta .uxcd (V2.0) delta apply Appliquer un patch delta (V2.0) delta stats Statistiques d'un fichier patch .uxcd (V2.0) ━━ Installateurs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ msi create Créer un installateur MSI (Windows) msi inspect Inspecter un MSI existant msi list-files Lister les fichiers d'un MSI msix create Créer un package MSIX (Windows 10/11) snap create Créer un Snap Linux (V2.0) appimage create Créer un AppImage Linux (V2.0) pkg create Créer un PKG macOS (V2.0) dmg create Créer un DMG macOS (V2.0) ━━ Cloud V2.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ cloud upload Compress & upload vers S3/Azure/GCS (V2.0) cloud download Télécharger et extraire (V2.0) cloud list Lister les objets d'un bucket (V2.0) ━━ IA V2.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ai train Entraîner le modèle IA (V2.0) ai predict Prédire le meilleur algo pour un fichier (V2.0) ai benchmark Comparer les algos sur un fichier (V2.0) ━━ Watch V2.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ watch Surveiller et auto-comprimer (V2.0) ━━ Marketplace V2.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ marketplace list Lister le catalogue (V2.0) marketplace install Installer un plugin (V2.0) marketplace uninstall Désinstaller un plugin (V2.0) marketplace update-all Tout mettre à jour (V2.0) marketplace search Rechercher dans le catalogue (V2.0) ━━ Système ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ api Lancer l'API REST FastAPI (V2.0) gui Lancer l'interface graphique PyQt6 version Afficher la version, Python, moteur IA
29

API Python — Référence des Modules

ModuleClasses / FonctionsDescriptionVersion
universal_installercompress(), extract(), Archive, convert_archive()API haut niveauV1.0
core.uxc.engineUXCCompressor, UXCDecompressor, UXCRepairMoteur UXC v3V1.0
core.uxc.ai_selectorAIAlgoSelector, AlgoSelectorTrainer, BlockFeatures, extract_features()IA prédictive algoV2.0
core.uxc.deltaUXCDelta, DeltaHeader, PatchEntry, PatchTypeCompression deltaV2.0
core.uxc.cryptoUXCCrypto, CryptoHeader, CryptoUnavailableErrorAES-256-GCMV1.1
core.uxc.headerUXCHeader, UXCFlags, BlockType, ArchiveEntryFormat binaire .uxc V2V1.2
core.uxc.standalonemain()uxc-extract CLI autonomeV1.2
cloudCloudStorage, S3Config, AzureConfig, GCSConfig, UploadResultCloud S3/Azure/GCSV2.0
apicreate_app(), start_api(), SessionManager, ConnectionManagerREST API FastAPIV2.0
installerMSIBuilder, MSIXBuilder, MSIEditor, MSIXEditorInstallateurs WindowsV1.0
installer.linuxSnapBuilder, SnapCommand, SnapPart, AppImageBuilderInstallateurs LinuxV2.0
installer.macosPKGBuilder, DMGBuilderInstallateurs macOSV2.0
archive.sfxSFXBuilder, SFXOptions, MultiVolumeManagerSFX + multi-volumesV1.1
pluginArchivePlugin, @register_handler, PluginRegistry, load_plugins(), get_plugin_handler()Plugin APIV1.2
marketplaceMarketplaceManager, MarketplaceDialog, PluginEntry, Catalog, SecurityErrorMarketplaceV2.0
ui.cli.watchFileWatcher, WatchStateCLI WatchV2.0
ui.gui.themesThemeManager, DARK, LIGHT, HIGH_CONTRASTThèmes GUIV1.2
ui.gui.previewFilePreviewDialog, open_preview()PrévisualisationV1.1
ui.gui.msi_canvasMSIFlowchartDialog, MSIFlowchartBuilder, FlowNode, FlowEdgeCanvas MSIV2.0
utilsbenchmark(), verify_integrity(), compute_hash(), detect_format()UtilitairesV1.0
30

Benchmark & Performances

universal-installer benchmark --input ./test_data/ --formats uxc,zip,7z,zst --levels max
┌──────────────────────────────────────────────────────────────────────────────┐ │ FORMAT RATIO COMPRESSION DÉCOMPRESSION RAM THREADS IA │ ├──────────────────────────────────────────────────────────────────────────────┤ │ UXC-max+IA 66.8% 19.1s 1.1s 340Mo 8 cœurs ONNX │ │ UXC-max 64.2% 18.3s 1.2s 320Mo 8 cœurs — │ │ 7z-ultra 66.1% 145.2s 4.8s 280Mo 1 cœur — │ │ ZST-19+IA 62.4% 11.2s 0.7s 240Mo 8 cœurs ONNX │ │ ZIP-max 52.1% 8.1s 2.1s 180Mo 1 cœur — │ │ TAR.XZ 65.8% 134.1s 5.2s 320Mo 1 cœur — │ └──────────────────────────────────────────────────────────────────────────────┘ Données : Python 3.14 stdlib + site-packages (50 Mo, 2847 fichiers) Machine : Intel Core i7-12700K, 32 Go RAM, Python 3.14, onnxruntime 1.18
from universal_installer.utils import benchmark results = benchmark( input_path="./test_data/", formats=["uxc", "zip", "7z", "zst"], levels=["max"], ai=True, ) for r in sorted(results, key=lambda x: x.ratio, reverse=True): print(f"{r.format:15} ratio={r.ratio:.1%} comp={r.compress_time:.1f}s decomp={r.decompress_time:.1f}s")
31

Intégrité & Checksums

universal-installer verify archive.uxc # SHA-256 embarqué dans header universal-installer hash archive.zip # SHA-256 + CRC-32 + MD5 universal-installer hash archive.uxc -a sha512 # SHA-512 uniquement
from universal_installer.utils import verify_integrity, compute_hash # Vérifier l'intégrité SHA-256 embarqué ok, detail = verify_integrity("release.uxc") print(f"{'✅' if ok else '❌'} {detail}") # Calculer checksums hashes = compute_hash("archive.zip", algos=["sha256", "crc32", "md5"]) print(hashes["sha256"]) # Vérification en masse avant publication from pathlib import Path for arch in Path("./release").glob("*.uxc"): ok, _ = verify_integrity(str(arch)) print(f"{'✅' if ok else '❌'} {arch.name}")
Chaque archive .uxc embarque le SHA-256 de son contenu dans le header (champ 32B). La vérification est automatique à l'extraction. Avec AES-256-GCM, chaque bloc possède également un tag d'authentification GCM 16B qui détecte toute modification ou corruption.
32

Multi-threading

from universal_installer.core.uxc.engine import UXCDecompressor import os d = UXCDecompressor( threads=os.cpu_count(), # tous les cœurs CPU verify=True, # SHA-256 + tags GCM si chiffré password="mon_secret", # déchiffrement parallèle par bloc repair=False, ) stats = d.decompress("archive.uxc", "./sortie/") print(f"Vitesse : {stats.original_size/1e6/stats.elapsed:.0f} Mo/s") print(f"Blocs : {stats.block_count} blocs sur {stats.threads} threads") print(f"Vérifié : {stats.verified}")
La décompression parallèle utilise concurrent.futures.ThreadPoolExecutor. Les blocs UXC sont indépendants et peuvent être décompressés simultanément. Sur un CPU 8 cœurs, la décompression est jusqu'à 6× plus rapide qu'une implémentation mono-thread. Le déchiffrement AES-GCM par bloc est également parallélisé.
33

Thèmes GUI V1.2

🌑 Dark (défaut)

Fond #06080d, accent orange #ff6b35, texte #c8d8ea. Inspiré des outils développeurs professionnels. Réduit la fatigue oculaire en environnement sombre.

☀ Light

Fond blanc #f5f6fa, accent orange #e05020. Pour les environnements bien éclairés ou les préférences système claires. Contraste élevé sur fond clair.

⬛ High Contrast

Fond noir #000000, texte blanc #ffffff, accents jaune #ffff00, bordures 2px. Conforme WCAG 2.1 AAA. Pour les utilisateurs malvoyants.

from universal_installer.ui.gui.themes import ThemeManager # Appliquer un thème dynamiquement (sans redémarrage) ThemeManager.apply(app, "dark") # Thème sombre (défaut) ThemeManager.apply(app, "light") # Thème clair ThemeManager.apply(app, "high_contrast") # Accessibilité # Lister les thèmes disponibles for name, display in ThemeManager.available(): print(f"{name}: {display}") # Thème courant (lu depuis config.json) print(ThemeManager.current()) # "dark" | "light" | "high_contrast" # Via menu GUI : Vue → Thème
Le changement de thème est dynamique : sans redémarrage. La préférence est automatiquement sauvegardée dans config.json et restaurée au prochain lancement.
34

Configuration

{ "threads": "auto", "default_format": "uxc", "default_level": "normal", "temp_dir": null, "verify_after_compress": true, "gui_theme": "dark", "recent_files_max": 20, "wix_path": null, "makeappx_path": null, "ai_model_path": null, "ai_backend": "auto", "cloud_provider": null, "cloud_bucket": null, "cloud_region": "us-east-1", "watch_strategy": "debounced", "watch_delay": 5.0, "watch_max_archives": 10, "marketplace_catalog_url": "https://raw.githubusercontent.com/tristanruard/universal-installer-plugins/main/catalog.json", "plugins_dir": "~/.universal_installer/plugins/", "api_host": "127.0.0.1", "api_port": 8080, "api_workers": 1 }
35

Architecture V2.0

Universal_Installer V2.0/ ├── core/ │ ├── uxc/ │ │ ├── engine.py # UXCCompressor V2, UXCDecompressor, UXCRepair │ │ ├── ai_selector.py # AIAlgoSelector, AlgoSelectorTrainer (V2.0) │ │ ├── delta.py # UXCDelta, DeltaHeader, PatchEntry (V2.0) │ │ ├── crypto.py # UXCCrypto, CryptoHeader — AES-256-GCM (V1.1) │ │ ├── header.py # Format binaire .uxc V2 (V1.2) │ │ ├── standalone.py # uxc-extract CLI autonome compilable EXE (V1.2) │ │ ├── analyzer.py # Analyse entropique Shannon │ │ ├── lz77.py # Sliding window LZ77 optimisé │ │ ├── ans_coder.py # Codage ANS rANS │ │ ├── dictionary.py # Dictionnaire global adaptatif │ │ └── huffman.py # Huffman canonique (fallback) │ └── formats/ │ ├── base.py # BaseHandler (interface abstraite) │ ├── uxc_handler.py │ ├── zip_handler.py │ ├── sevenz_handler.py │ ├── tar_handler.py │ ├── iso_handler.py │ ├── img_handler.py │ ├── rar_handler.py │ ├── cab_handler.py # CAB Windows — magic MSCF (V1.1) │ └── wim_handler.py # WIM Windows — wimlib-imagex (V1.1) ├── cloud/ │ └── __init__.py # S3/AzureProvider, GCSProvider, CloudStorage (V2.0) ├── api/ │ └── __init__.py # create_app(), start_api(), SessionManager (V2.0) ├── installer/ │ ├── __init__.py # MSIBuilder, MSIXBuilder, MSIEditor, MSIXEditor │ ├── linux.py # SnapBuilder, AppImageBuilder (V2.0) │ ├── macos.py # PKGBuilder, DMGBuilder (V2.0) │ └── wix_wrapper.py # WiX Toolset wrapper ├── archive/ │ ├── archive.py │ ├── compressor.py │ ├── extractor.py │ ├── converter.py │ └── sfx.py # SFXBuilder, MultiVolumeManager (V1.1) ├── plugin/ │ └── __init__.py # ArchivePlugin, @register_handler, PluginRegistry (V1.2) ├── marketplace/ │ └── __init__.py # MarketplaceManager, MarketplaceDialog (V2.0) ├── ui/ │ ├── gui/ │ │ ├── main_window.py # Fenêtre principale V2.0 │ │ ├── archive_viewer.py │ │ ├── compress_dialog.py # + SourcePickerDialog (bug #1 fix) │ │ ├── preview.py # FilePreviewDialog (V1.1) │ │ ├── themes.py # ThemeManager Dark/Light/High Contrast (V1.2) │ │ ├── msi_canvas.py # Canvas flowchart MSI interactif (V2.0) │ │ ├── progress_widget.py │ │ └── settings.py │ └── cli/ │ ├── commands.py # CLI Typer complète │ └── watch.py # FileWatcher, WatchState (V2.0) ├── utils/ │ ├── benchmark.py │ ├── integrity.py │ ├── detect.py │ └── platform.py ├── tests/ ├── main.py ├── pyproject.toml # v2.0.0 — tous les extras — 3 scripts CLI └── README.md
36

FAQ

Le format .uxc V2 est-il rétro-compatible V1 ?

Oui. L'en-tête est rétro-compatible. Les nouvelles fonctionnalités (chiffrement, dict partagé, auto-algo) sont signalées par des flags optionnels. Un décompresseur V1 ignore les flags inconnus et lit une archive V2 non chiffrée normalement.

L'IA améliore-t-elle vraiment la compression ?

+2 à +5% sur des corpus mixtes (code, binaires, images). Sur des données homogènes, le gain est marginal. L'IA élimine surtout les cas où UXC compresserait des données déjà compressées (JPEG, ZIP, MP4…), économisant du temps CPU.

Le cloud upload est-il atomique ?

Oui. Compression → fichier temp local, puis upload avec 3 tentatives (retry exponentiel). En cas d'échec définitif, le temp est supprimé. L'objet dans le bucket n'est jamais partiel ou corrompu.

Les plugins du Marketplace sont-ils sûrs ?

SHA-256 obligatoire avant toute installation — aucun code non vérifié n'est jamais exécuté. Les plugins "🔒 Vérifiés" ont été revus manuellement. Les plugins communauté sont SHA-256 uniquement.

uxc-extract fonctionne sans Python sur la cible ?

Oui si compilé avec PyInstaller : pyinstaller --onefile uxc_extract.py. Le binaire EXE Windows (~8 Mo) ou binaire Linux embarque Python et toutes les dépendances. Aucune installation requise sur la cible.

Comment entraîner le modèle IA sur mes données ?

Fournissez un corpus représentatif à AlgoSelectorTrainer.collect_samples(). ~2 min pour entraîner sur 10 000 blocs. Exportez en ONNX pour le runtime production. Le modèle est cherché dans ~/.universal_installer/models/.

MSI/MSIX sur Linux ou macOS ?

Non. WiX Toolset et makeappx sont Windows uniquement. Utilisez Snap/AppImage sur Linux, PKG/DMG sur macOS. Toutes les fonctions compression/extraction/cloud/API restent cross-platform.

Mot de passe oublié sur archive UXC chiffrée ?

Irrécupérable. AES-256-GCM sans backdoor. Les 600 000 itérations PBKDF2 rendent le brute-force prohibitif. Utilisez un gestionnaire de mots de passe pour archiver vos clés de chiffrement.

37

Compatibilité V2.0

FonctionnalitéWindows 10/11Linux Ubuntu 22+macOS 12+
GUI PyQt6 (3 thèmes)
CLI complète
API Python + API REST
UXC v3 + IA + Delta
AES-256-GCM
Cloud S3/Azure/GCS
Plugin API + Marketplace
CLI Watch (watchdog)
ZIP / 7Z / TAR / ISO
CAB (lecture + écriture)
WIM (lecture)⚠ wimlib requis⚠ wimlib requis
MSI Builder (WiX 4.x)✅ WiX requis
MSIX Builder (makeappx)✅ SDK requis
Snap Builder✅ snapcraft requis
AppImage Builder✅ appimagetool auto-dl
PKG Builder✅ Xcode CLI requis
DMG Builder✅ hdiutil inclus macOS
Python 3.12
Python 3.14 (cible)
38

Changelog

V2.0.0 — 2027 H1 ACTUELLE

• F-030 : IA prédictive algo — ONNX/sklearn/heuristique, 19 features, AlgoSelectorTrainer
• F-031 : Cloud S3/Azure/GCS — compress & upload atomique, retry 3×, presigned URLs
• F-032 : API REST FastAPI — 10 endpoints, WebSocket, auth Bearer, Swagger UI
• F-033 : Canvas MSI — flowchart interactif drag/zoom/pan, Bézier, export PNG 1600×1200
• F-034 : UXC v3 Delta — format .uxcd, patches bsdiff4, IDENTICAL/BSDIFF/FULL
• F-035 : Snap + AppImage Linux — snapcraft.yaml auto, appimagetool auto-dl
• F-036 : PKG + DMG macOS — pkgbuild+productbuild, hdiutil+AppleScript, signature
• F-037 : Marketplace — catalogue SHA-256 signé, SecurityError si hash invalide, GUI Qt
• F-038 : CLI Watch — 4 stratégies, watchdog, rotation archives, cloud upload auto

V1.2.0 — 2026 Q4

• UXC Engine V2 : dictionnaire LZ77 partagé inter-fichiers, auto-algo par bloc
• Header UXC V2 : BLOCK_ENTRY_SIZE 40B, flags SHARED_DICT + AUTO_ALGO + REPAIRED
• Plugin API : @register_handler, PluginRegistry, entry_points pip, plugins locaux
• 3 Thèmes GUI : Dark / Light / High Contrast — changement dynamique sans redémarrage
• uxc-extract standalone compilable EXE sans Python sur la cible

V1.1.0 — 2026 Q3

• AES-256-GCM par bloc, PBKDF2 600k itérations, nonce unique par block_index, tag GCM
• Formats CAB (parsing binaire MSCF natif) et WIM (wimlib-imagex)
• SFX Builder — EXE auto-extractible (PyInstaller ou stub Python)
• Multi-volumes — split/join .uxc.001… — assemblage automatique par uxc-extract
• Réparation archives — blocs CRC valides conservés, blocs corrompus → zéros
• Prévisualisation GUI — Texte/JSON/Image/PDF/Hex sans extraction sur disque

V1.0.1 — 2026 Q2

• Bug #1 : SourcePickerDialog — choix clair Fichier/Dossier sans annulation forcée
• Bug #2 : compress-current-as-uxc — pré-remplissage source/destination automatique
• F-012 : MSI Builder GUI complet (3 onglets : Produit / Raccourcis / Registre)
• F-013 : MSIX Builder GUI complet (3 onglets : Manifeste / Assets / Signature)

V1.0.0 — 2026 Q1

• Core UXC Engine : analyzer, LZ77, ANS rANS, header binaire .uxc, multi-thread, mmap
• 12+ formats : ZIP, 7Z, TAR, GZ, BZ2, XZ, ZST, RAR, ISO, IMG, MSI, MSIX
• GUI PyQt6 dark theme, explorateur, drag & drop, dialog compression, progress
• CLI Typer complète, MSI/MSIX Builder, SHA-256, Benchmark, API Python unifiée