Outil CLI
Skyvern-AI/rustwright avatar
Skyvern-AI/rustwright

Rustwright : l'API de Playwright sur un moteur CDP en Rust

Ce projet transforme « Playwright's API on a Rust CDP engine, Chromium browser automation for Python & Node, no driver subprocess. (Alpha). » en une solution open source exploitable, avec une chaîne d’outils réutilisable et des moyens d’intégration pour des cas d’usage concrets.

888 étoiles58 forksPythonMIT
GitHub

En bref

De quoi s’agit-il ?
Une réécriture de Playwright en Rust qui pilote Chromium directement, sans sous-processus de pilote Node. Alpha, Chromium uniquement.
À qui s’adresse-t-il ?
Rustwright est une bibliothèque d'automatisation en alpha précoce, uniquement Chromium, qui réimplémente l'API Playwright sur un moteur CDP natif en Rust, avec des liaisons pour Python, Node et plusieurs autres langages. Ses chiffres de performance sont des diagnostics locaux, et ses revendications anti-détection sont limitées.
Puis-je l’utiliser commercialement ?
Oui. MIT est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 3 jours.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 14 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Une réécriture de Playwright en Rust

Rustwright est une bibliothèque d'automatisation de navigateur pour Python et Node qui conserve l'API Playwright mais remplace le pilote Node par un moteur Rust natif parlant le protocole Chrome DevTools brut. Il est décrit comme un remplacement direct : installez-le, changez un import, et le code existant s'exécute sur le moteur Rust. Le projet est en alpha et ne prend en charge que Chromium ; Firefox et WebKit génèrent une erreur explicite.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 1 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Un cœur Rust, des liaisons minces

L'architecture est un cœur Rust unique : un client CDP asynchrone basé sur Tokio, avec transport WebSocket et pipe Unix optionnel, communiquant directement avec Chromium. Des liaisons PyO3 (Python) et napi-rs (Node) minces l'exposent en processus. Il n'y a aucun sous-processus de pilote dans le chemin. Les binaires Chromium ou Chrome existants peuvent être utilisés en définissant RUSTWRIGHT_CHROMIUM, CHROME ou CHROMIUM.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 2 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Support de langage et couverture API

La liaison Python couvre environ 96 % de l'API synchrone de Playwright, 515 des 536 méthodes, dont 411 testées par le registre de parité partagé ; l'API asynchrone fournit 488 sur 536. La liaison Node est précoce et ne pont qu'un sous-ensemble : launch, newPage, goto, click, fill, title, textContent, evaluate, screenshot, close. De plus, des liaisons alpha existent pour Go, Java, C#/.NET, Ruby et PHP via une ABI C partagée, ainsi qu'une API Rust native, avec équivalence inter-langages vérifiée dans CI.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 3 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

CLI et serveur MCP pour agents

Deux outils orientés agents accompagnent le projet. rustwright-cli pilote une session Chromium persistante depuis un shell ou une boucle d'agent, offrant les commandes open, snapshot, click et close, avec des arbres d'accessibilité compacts et des références d'éléments à portée de session. rustwright-mcp est un serveur MCP natif en Rust qui expose des outils browser_* à tout client MCP via stdio, avec captures d'écran PNG en ligne et limite de taille configurable. L'ancien serveur MCP Python est déprécié et restera jusqu'à ce que le serveur natif atteigne une parité d'outils complète.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 4 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Détection d'automatisation et gestion des entrées

Puisque le pilote Node n'est jamais chargé, Rustwright n'émet aucune de ses signatures d'automatisation. Il n'y a pas de global __playwright__binding__, pas de bootstrap de pilote, et pas de Runtime.enable sur le chemin par défaut, ce qui ferme la fuite de sérialisation de console derrière isAutomatedWithCDP. L'identité headless est normalisée par défaut. Les événements d'entrée sont envoyés via de vrais événements CDP plutôt que des appels DOM synthétiques. Le README est explicite : ce n'est pas indétectable, ce n'est pas un contournement de CAPTCHA ou Cloudflare, et cela utilise toujours des primitives CDP. Les tests locaux d'empreintes montrent SannySoft, BrowserScan et DeviceAndBrowserInfo propres, tandis que CreepJS détecte headless.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 5 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Les chiffres de performance sont des diagnostics locaux

Les chiffres en tête sont étiquetés comme diagnostics locaux, pas comme preuves CI. Une exécution sur hôte de développement (navigateur chaud, 5 itérations) a remporté 16 des 17 moyennes de cas, avec un accélération de 2,55× (5 256 ms contre 13 418 ms pour playwright-python). Un diagnostic de remplissage de formulaire a mesuré la mémoire de la bibliothèque cliente à 133,5 Mio pour playwright-python contre 40,6 Mio pour Rustwright, soit environ 70 % de moins ; un diagnostic de concurrence asynchrone a mesuré ~66 % de moins. Le README avertit que la mémoire de processus entier dominée par Chromium est à peu près égale et que ce sont des diagnostics de démonstration.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 6 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Limites, feuille de route et licence

Rustwright est alpha : la forme de l'API est couverte mais la parité comportementale complète n'est pas prouvée. Il est uniquement Chromium, Firefox et WebKit ne sont pas prévus. La concurrence asynchrone est recommandée pour environ 25 workflows concurrents ou moins par processus. OOPIF a des lacunes résiduelles. La feuille de route comprend une liaison Kotlin, des preuves de benchmark CI, une surface Node élargie et la fermeture des lacunes OOPIF. La télémétrie envoie un événement engine_launched par processus à PostHog avec version, système d'exploitation et architecture CPU, pas d'URL ni de contenu de page, et peut être désactivée avec DISABLE_TELEMETRY=1 ou DO_NOT_TRACK=1. Le projet est sous licence MIT, copyright 2026 Ikonomos Inc (dba Skyvern), avec les conditions MIT standard accordant l'utilisation, la copie, la modification et la distribution sans garantie.

Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 7 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale.

Conclusion éditoriale

Rustwright est une bibliothèque d'automatisation en alpha précoce, uniquement Chromium, qui réimplémente l'API Playwright sur un moteur CDP natif en Rust, avec des liaisons pour Python, Node et plusieurs autres langages. Ses chiffres de performance sont des diagnostics locaux, et ses revendications anti-détection sont limitées. Le projet sous licence MIT est développé ouvertement par Skyvern. Dans le cas de skyvern-ai-rustwright, ce point doit être lu à partir des éléments réellement cités dans le README : le dépôt skyvern-ai-rustwright, ses exemples et ses fichiers de configuration. Une description de capacité ne constitue pas une promesse indépendante de la version ou de l'environnement. L'équipe peut isoler une entrée, exécuter le chemin documenté, puis examiner la sortie produite et l'erreur éventuelle. Cette méthode est particulièrement utile ici parce que le projet expose un périmètre précis, tandis que les comportements non décrits restent inconnus. Le chapitre 7 s'inscrit donc dans une décision technique concrète, avec un résultat que l'on peut rattacher à skyvern-ai-rustwright plutôt qu'à une impression générale. Ce projet convient à une équipe qui accepte ce périmètre explicite ; il ne convient pas à celle qui attend une garantie absente du README.

Sources officielles

  1. Official README
  2. Project repository
Notes de la communauté

Notes de la communauté