Find duplicate 3D models by content, not name
'By content' means two things: byte-identical hashes (dedupe tools) or geometric similarity (CAD part search). Which you need, and what PrintStash does.
Two different jobs hide behind “by content”, and the tool you need depends on which one you mean.
If you mean byte-identical copies, the same file sitting in three folders under three names, hashing answers it exactly and cheaply. For a library you keep, the useful version of that is a tool which hashes on the way in, so the duplicate never becomes a second entry: PrintStash does this on every upload and every shared-folder scan, and Printventory does it as a desktop cataloguer. For a one-off sweep of a plain folder you are about to delete from, rmlint, jdupes, or Czkawka are the right size of tool.
If you mean the same shape stored as different bytes, a re-export from CAD, a rescale, an ASCII copy of a binary STL, then no hash will help you. That is geometric similarity search, and it is a CAD and PLM product category sold to manufacturers, not something the self-hosted 3D printing world currently offers. PrintStash does the first job and not the second.
What “by content” turns out to mean
A hash is a yes or no answer about the bytes. Two files either produce the same sha256 or they do not, and no amount of renaming or refoldering changes that. It is the cheapest reliable check you can run, and it is what almost every tool advertising content-based duplicate detection actually does.
The trouble is that a person looking at two files calls them the same model in cases where the bytes differ. All of these produce different hashes:
- the same mesh exported once as ASCII STL and once as binary STL;
- a re-export from CAD after any change, however small;
- the same geometry stored as a standalone STL and inside a 3MF project;
- a copy that was rescaled, repaired, or decimated.
Matching those means comparing the geometry, which is a different and much harder problem. You need a description of the shape that survives translation, rotation, scaling, and remeshing, and then a way to rank a whole library against that description instead of looking up one fixed key. That is why the two features rarely ship in the same tool: one is a dictionary lookup and the other needs an index built for nearest-neighbour queries.
Why the filename is the wrong key
A downloads folder collects the same model under several names. bracket.stl, bracket (1).stl, and bracket_v2_FINAL.stl might be three copies of one mesh, or three genuinely different meshes, and the names do not tell you which. The failure runs the other way too. The same STL pulled from Printables in March and from a friend’s ZIP in July can sit in two project folders under two unrelated names with identical contents.
Sorting by size narrows it down and still gets things wrong: two different meshes exported from the same CAD file often land within a few bytes of each other. A hash of the full contents is the only cheap check that gives a definite answer.
Exact copies, on the way in
PrintStash computes a streaming sha256 over each file during ingest and deduplicates against what is already stored. Upload the same STL twice and you get one model, not two. Re-sending an identical file through the API is a no-op rather than a second copy, which matters when a slicer post-processing hook fires twice.
Shared volumes apply the same rule to files you never uploaded. Point PrintStash at a local or NAS folder and a scan hashes every supported file in place, leaving the bytes where they are. When two files in different folders have identical content, they index as two linked files under a single model rather than as two models. Delete one of them from disk and the next scan trashes only that file entry, while the model itself survives until the last copy is gone. Removing a model or a volume never deletes source bytes from the folder.
One limit, stated plainly: PrintStash has no screen that lists duplicate pairs for you to work through. Deduplication happens at index time, so duplicates surface as a single model carrying more than one linked file, never as a report you work through. That is the right shape when the goal is a clean library, and the wrong shape when the goal is reclaiming disk space on a NAS, which is a job for the filesystem tools below.
The first scan of a large archive hashes and parses every supported file, so start with a representative subfolder before pointing it at ten years of downloads. The shared volumes guide has the scan and safety rules in full.
Reclaiming space in a plain folder
When there is no library involved and the goal is deleting redundant files off a disk, the classic Unix tools are the right size for the job. fdupes, jdupes, and rmlint all group files by content and let you review before deleting. Czkawka does the same with a GUI, finding duplicates by name, size, or hash, and adding fuzzy modes for images, video, and music. Its core and CLI are MIT licensed and the Krokiet and Cedinia GUIs are GPL-3.0.
The limitation is not the matching, it is the review. These tools hand you a list of paths. You decide from /mnt/tank/models/misc/thing.stl alone whether that copy is redundant, with no preview and no idea which one your slicer profile points at. That works for a few dozen matches and gets unpleasant at a few thousand. The folder and metadata guide covers where those tools fit in a plain-folder workflow.
Printventory, which is free and runs both as a desktop app and in Docker, closes that specific gap: it finds duplicates by content hash and then lets you compare the matches with thumbnails, so you are choosing between pictures rather than between paths. It is a good answer when you want a reviewable list of duplicates to delete and do not want to run a server.
Same shape, different bytes: who actually does that
Geometric similarity search exists and works, but it grew up in manufacturing, where an engineer about to model a new bracket wants to know whether the company already has one. 3DPartFinder indexes native CAD data through Catia, Creo, Inventor, NX, Solid Edge, Solidworks, and TopSolid, and searches it with a rough 3D model as the query. Symge does the same for 2D drawings and 3D parts together, aimed at manufacturing engineers with large CAD archives. Both are quote-priced and sold to companies, with a demo request where a download button would be, and neither is built around a folder of STLs.
Connecter comes up in almost every search for this, so it deserves a precise description. It is a Windows asset manager for visual and archviz libraries, free for local use, and its duplicate finder matches on the properties you tick: file name, extension, size, and optionally content, with pixel-by-pixel comparison for image assets. That is thorough for a 3ds Max library, but it is still file comparison rather than mesh comparison, and 3D printing formats are outside what it targets.
Closest to home, Modelist is a desktop cataloguer for Mac, Windows, and Linux that runs byte-exact matching, similar name and size comparison, and perceptual hashing at the same time, so it will flag some renamed and re-encoded copies that a pure hash misses. Fuzzy matching brings false positives with it, so every match still needs a human look. It is free up to 50 files, with a one-time €20 license for the current major version.
For a home library that leaves an awkward gap. Exact duplicates are solved several times over, while near-duplicate geometry matching is not available in anything you would install next to your slicer.
The closest thing to a geometry check in PrintStash
PrintStash parses each mesh on ingest and stores bounding-box dimensions, volume, and triangle count. The dimensions sit on the viewer as an overlay, volume and triangles appear under mesh geometry in the model detail view when you enable those fields in display preferences, and all of them come out of the metadata export at Settings → Overview, as JSON or as CSV with one row per stored file including its sha256.
That export is a usable manual substitute for the search PrintStash does not have. Open the CSV in a spreadsheet and sort by triangle_count, and re-encodings of one mesh line up: converting binary STL to ASCII changes every byte and keeps the triangle count and the dimensions identical. Sort by volume_mm3 and rescaled copies group loosely, since a uniform scale changes volume by the cube of the factor. It is not similarity search and it will hand you coincidences, because two unrelated meshes can share a triangle count. It does narrow a few thousand files down to a handful of pairs worth opening.
Two gaps to know about before you rely on it. Meshes above the configured load cap are skipped rather than parsed, so their geometry columns stay empty, and volume is best-effort: a mesh that is not watertight leaves that field blank while dimensions and triangle count still arrive. The user guide covers what the export includes and what it deliberately leaves out.
A workable order of operations
- Index rather than move. Add the folder as a shared volume so nothing is copied and your slicer paths keep working.
- Let the first scan finish on a small subfolder, then add the rest.
- Look for models that carry more than one linked file. Those are your byte-identical copies, already collapsed into one entry.
- Export the CSV and sort by triangle count and volume to find the near-duplicates the hash could not see. Treat every group as a question, not an answer.
- Open the preview before you delete anything from disk. Two files with confusingly similar names may hold different meshes.
- Delete from the filesystem deliberately, then rescan. PrintStash trashes the file entry that disappeared and keeps the model as long as another copy remains.
If you are adopting a large existing archive rather than cleaning up a small one, organizing thousands of STL files covers the wider migration, and mirroring a NAS folder covers the mount and scheduling details.
Questions that come up
Does “by content” mean the bytes or the shape?
In practice it almost always means the bytes. When a file manager, a dedupe utility, or a model library says it finds duplicates by content rather than by filename, it is hashing the file and grouping equal hashes, which is exact for identical copies and blind to everything else. Comparing the shape is a separate technique, usually called geometric or shape similarity search, and it needs a rotation and scale independent description of the mesh rather than a digest of the file. Both are legitimate readings of the question, so decide which one your library problem actually is before you pick a tool.
Can PrintStash find a model that was re-exported or rescaled?
No. Deduplication is sha256 over the file bytes, so a re-export, a rescale, a repair, or a conversion between ASCII and binary STL arrives as a separate model. Nothing in PrintStash compares one mesh against another. The nearest workaround is the metadata export: sort the CSV by triangle count and by volume and inspect the groups by hand, since a re-encoded copy of one mesh keeps both numbers and a rescaled copy keeps its triangle count.
Which tools compare the geometry itself?
CAD part search products do. 3DPartFinder plugs into Catia, Creo, Inventor, NX, Solid Edge, Solidworks, and TopSolid and finds duplicate and similar parts from an existing design or a rough model, and Symge searches 2D drawings and 3D parts by shape for manufacturing engineers. Both are commercial, quote-priced, and built around CAD and PLM repositories rather than STL folders. On the hobbyist side nothing does true geometry comparison today; Modelist gets closest by combining byte-exact matching with name, size, and perceptual-hash comparison, which catches some renamed and re-encoded copies without ever comparing meshes.
Does it find duplicates inside ZIP files?
No. A ZIP sitting in a watched folder is not a supported format, so a scan does not open it and its contents are never hashed. Since v0.11.1, a URL capture arrives as a pending import where you can pick which entries of an archive to extract before ingestion, and the extracted files are hashed like anything else. To clean a downloaded pack on the way in instead, import the archive and let the hash collapse anything you already own: clean a downloaded STL pack.
Can I keep the better-quality version?
If two files are byte identical there is no better version, only a better location, and PrintStash already treats them as one model. When the difference is real, such as a repaired mesh or a cleaner re-export, the hashes differ and the two arrive as separate models. Delete the one you do not want from the library. If it came from a shared volume, the source bytes stay on disk until you remove them there.
How is this different from Czkawka or dupeGuru?
Different jobs. Czkawka and dupeGuru scan any filesystem and are the better choice when the goal is reclaiming disk space across a whole drive. dupeGuru offers fuzzy filename matching, content comparison, and a fuzzy picture mode, and neither tool knows anything about 3D printing. PrintStash is not a disk cleaner. It deduplicates as a side effect of building a library that also holds slicer metadata, G-code revisions, and print outcomes. Use the utility for the drive, use the library for the models you actually print.
Sources
- PrintStash core concepts, the shared volumes guide, and the user guide for hashing, scan behavior, and the metadata export.
- Czkawka, rmlint, and dupeGuru for the filesystem tools.
- Printventory and Modelist for the desktop cataloguers, and Connecter for the archviz asset manager.
- 3DPartFinder and Symge for CAD geometric search. All external pages checked on August 17, 2026.