Spaces:
Running
Running
| title: Hayward | |
| emoji: 🌾 | |
| colorFrom: green | |
| colorTo: blue | |
| sdk: static | |
| app_file: index.html | |
| pinned: false | |
| license: mit | |
| short_description: Check whether loading a model repo will run code | |
| tags: | |
| - security | |
| - pickle | |
| - model-security | |
| - supply-chain | |
| - safetensors | |
| # Hayward | |
| Paste a Hub repo id, or drop a checkpoint from your own machine. Hayward reads | |
| the model files and tells you whether loading them will run code. | |
| `torch.load`, `joblib.load` and `numpy.load(allow_pickle=True)` execute code | |
| from the file they read. That is what pickle does, and the Hub is still full | |
| of pickle. | |
| The real thing runs offline, in your CI, with one dependency: | |
| ```bash | |
| pip install hayward | |
| hayward scan ./models | |
| ``` | |
| Source and documentation: https://github.com/hedgerow-dev/hayward | |
| Hayward is built by [Hedgerow](https://hedgerow.dev/open-source#hayward). | |
| ## How this page works | |
| There is no server. The page loads the `hayward` wheel from PyPI into | |
| Pyodide and runs the identical scanner in WebAssembly, in your browser. A file | |
| you drop here is never uploaded anywhere. A repo you name is fetched from the | |
| Hub straight into the tab. | |
| That is the same property the CLI has, which is the point: a scanner that | |
| phones home is a scanner you cannot run on a file you are worried about. | |
| ## What it does | |
| 1. Lists the repo's files and keeps the ones Hayward can read. | |
| 2. Fetches them one at a time, scans, then discards. | |
| 3. Shows every finding, and every file it had to skip. | |
| A clean result means Hayward read the files and recognised nothing dangerous | |
| in them. It does not mean the model is safe. | |
| ## Limits | |
| A browser tab is not a build box: this stops at 25 files and 500 MB per file. | |
| Anything it skips is listed as skipped rather than quietly dropped. | |