← Blog

Clean a downloaded STL pack on ingest

What actually cleans a downloaded pack: content-hash dedup on ingest during ZIP import, not mesh repair or a manual duplicate sweep.

guideorganizationworkflow

A downloaded STL pack is usually the same project under a zip, several plate variants, and the occasional duplicate you have pulled before. It is easier to leave it in Downloads than to sort it, and most tools frame the cleanup as mesh repair or a manual dedupe sweep. Neither is what cleans a pack on its way in.

The job that actually handles a downloaded pack is a library that hashes file contents at ingest and lets you import the archive itself, so the duplicate never becomes a second model and the pack comes in already organized. PrintStash does both: import the ZIP, pick which entries you want, and every extracted file is hashed against what you already have. That is the whole clean. The same STL you already stored does not arrive twice.

Why ingest-time hashing is the pack cleanup

Cleaning a pack after the fact means pointing a dedupe tool at the files once they are extracted, then deciding from paths which copies to delete. PrintStash skips the extract-first step. Upload the archive, choose the incoming files you want to keep, and each selected entry is hashed during ingest. Re-importing a model you already have produces one model, not a second copy, because the hash is the key, not the filename. Two files named differently that are byte identical resolve to the same entry. That is the duplicate verdict PrintStash owns: sha256 over the bytes, exact for identical copies and blind to re-exports.

The one thing ingest hashing does not do is geometry matching. A rescaled or re-exported variant arrives as a separate model, because its bytes differ. If you are trying to catch near-duplicates too, the metadata export gives you triangle count and volume to compare by hand.

Import the pack and let the structure come with it

The fastest cleaning is not cleaning at all. A multi-part pack arrives as an archive, and the folder structure inside it is usually the only organization that project will ever get. Upload the archive instead of extracting and importing the loose files. PrintStash turns the archive into a collection named after it, keeps the folders inside as sub-collections, and you pick which files to keep on extraction rather than taking all forty plate variants. That is covered in full in organizing STL files by how they arrive.

Unless you were sent a single file, importing the pack as a ZIP is the move. The archive import path inspects the entries, lets you choose the ones you actually want, and ingests each as its own model. Extraction into a temporary folder happens inside the import, not as a manual step, so the dedup check runs on the files the moment they land.

Use cases

You download a big pack and want the duplicates gone. Import the ZIP, skip the variants you do not need, and let the hash collapse anything you already owned. One model, not three copies of the same part.

You keep pulling the same models from different places. The download URL barely existed two years ago. The pack from a friend, the one from a forum post, and the one you saved last week can all contain the same bytes under different names. On ingest they become one model.

Your library already has thousands of files and you are wary of the first scan at scale. That concern applies to the shared-volume scan, not to archive import. A pack import only hashes the files you selected for that pack, so it stays cheap. The large-library management guide covers the scan-cost difference.

When a downloaded pack is not worth importing

Importing is the wrong move when you expect to print the model once and forget it. A wishlist belongs on the site you found it on, where updates and search live. Import the pack if you will print from it again; an occasional one-off can stay in Downloads.

There is also a limit worth naming: ZIP files sitting in a watched folder are not scanned in place. If you keep model packs zipped on disk and never import them, their contents stay invisible to the hash. Import them or extract them before indexing. The archive path that does the job is the deliberate import, not a folder scan.

Questions that come up

Does importing a ZIP delete my downloaded file?

No. Importing reads the archive and stores the models in the library; it does not remove the original ZIP or extract files next to it. You can delete the download after the import if you no longer want it, and it will not affect what you stored.

How is this different from running a duplicate finder over my Downloads?

A duplicate finder lists copies and leaves the deciding to you. It is the right tool for reclaiming disk space across a whole drive. Library ingest hashing removes the step entirely: the duplicate is never stored as a second model, so there is nothing to review. That is the difference between cleaning a folder and never having made the mess.

Will it catch a model that was re-exported or rescaled?

No. Dedup is over the file bytes, so a re-export, a rescale, or an ASCII/binary STL conversion arrives as a separate model. Nothing compares the geometry. If that is what you need, sort the metadata export by triangle count and volume and inspect the groups by hand, as covered in find duplicate 3D models.

What counts as a duplicate when the pack has plate variants?

Only byte-identical files count. Forty plate variants are forty different meshes, so they arrive as forty models whether you want them or not. The import screen lets you pick which of the archive’s entries to keep, which is where you drop the variants you do not need before they reach the library.

Sources

  • PrintStash user guide for URL and archive import, and find duplicate 3D models for the byte-hash verdict and its limits.
  • Product source (v0.12.1): backend/app/services/importer.py for archive inspection and entry selection on import, and backend/app/services/ingestion.py for the streaming sha256 and dedup on Model.hash.