Rust-powered deduplication and text-set toolkit for large file collections.
Desktop app: Tauri 2 + React • Engine: Rust • Platforms: Windows, macOS, Linux
Dupli-Annihilator-G started as a high-performance duplicate remover for large text corpora. It is now a broader desktop and CLI toolkit for:
- exact deduplication across one or many files,
- rich-input extraction from
PDFandEPUB, - frequency analysis,
- fuzzy clustering for near-duplicates,
- relational set operations between file groups,
- fast word membership checks against loaded wordlists.
The Rust core is built to handle both small and very large datasets without turning the UI into a guessing game. Jobs expose live stage progress, throughput, ETA, and a final diagnostic summary.
| Area | What you get |
|---|---|
| Exact deduplication | Merge one or many inputs into one duplicate-free output. |
| Execution modes | ram, disk, and auto mode selection. |
| Ordering modes | preserve_first_seen, alphabetical, unordered_fast. |
| Disk alphabetical strategies | fast_bucket_local for speed or global_perfect for strict global sort order. |
| Normalization controls | trim, drop_empty, and character-length filtering with drop_length_min / drop_length_max. |
| Rich inputs | Direct processing of PDF and EPUB files through an extraction stage. |
| Folder ingestion | Add a folder and expand supported files recursively. |
| Output control | Newline, CRLF, tab, comma, semicolon, pipe, or any custom separator. |
| Mission Report | End-of-run summary with metrics, warnings, stage timing, JSON export, and copy/open actions. |
| Cancellation | Running jobs can be canceled cleanly. |
| Updater flow | In-app update check/install flow with GitHub Releases fallback when needed. |
| Localization | 10 desktop UI languages. |
The desktop app is no longer just a single dedupe screen. It includes several tools backed by the same Rust engine.
- Add files or folders with picker or drag-and-drop.
- Run exact, case-sensitive deduplication across the entire input set.
- Choose output ordering and execution mode.
- Tune disk processing with bucket count and run size when operating on very large inputs.
- Load a wordlist from a text-based file.
- Check whether a specific token exists in the loaded set.
- O(1) membership lookup after the wordlist is loaded.
- Scan one or many inputs and return the most frequent tokens.
- Supports
top Nlimiting. - Useful for corpus inspection before or after cleanup.
- Groups near-duplicate tokens using edit distance.
- Good for typos, variant spellings, and noisy datasets.
- Exposed in the desktop app as a separate output-producing tool.
A - Bintersect(A, B)union(A, B)
This makes the app useful not only for deduplication, but also for dataset comparison and corpus curation.
txtcsvtsvlog
pdfepub
Rich inputs are extracted into temporary text before tokenization. Recent engine changes improved this path substantially:
- extraction progress is visible immediately,
PDFandEPUBextraction runs with bounded parallelism,- large PDFs are streamed page by page to reduce memory pressure,
AUTOmode chooses betweenRAMandDISKafter extraction using host memory telemetry plus a corpus sample, not just the compressed container size.
When a folder is selected, the backend recursively expands compatible files inside it.
- Tokens are split by whitespace, comma
,, and semicolon;. - Matching is exact and case-sensitive.
Apple,apple, andAPPLEare three different tokens.trimremoves leading/trailing whitespace before deduplication.drop_emptyskips empty tokens after normalization.- Length filtering drops tokens whose character count falls inside an inclusive
[min, max]range. - Output is written using the separator you choose, with no trailing separator appended at the end.
Fastest path when the unique-token set fits comfortably in memory.
For large workloads, the engine avoids memory blowups by switching to bounded on-disk strategies:
- bucket partitioning for large unsorted or locally sorted workloads,
- external merge sort when strict global alphabetical output is required.
Lets the engine choose the effective mode based on:
- the resolved post-extraction input footprint,
- current available memory on the host,
- a lightweight token sample that estimates uniqueness and duplicate pressure,
- the workload shape (
1file vs2+files with partial overlap).
The same corpus may resolve to different effective modes on different machines if available memory differs.
The desktop app reports:
- current stage,
- file progress,
- rich-input extraction progress,
- current input path,
- tokens seen,
- unique tokens,
- duplicates,
- throughput,
- elapsed time,
- ETA.
Every completed run ends with a detailed summary screen that can:
- show unique count, duplicate count, reduction ratio, elapsed time, and throughput,
- display stage timings and warnings,
- open the output file or its folder,
- copy a text report to the clipboard,
- export the full summary as JSON,
- reset the app for a new unrelated task,
- run the same job again.
Optional per-file breakdown is also available in RAM mode, including:
- source path,
- file size,
- tokens seen,
- duplicates,
- unique contributions,
- tokens filtered by length.
This repository also ships a CLI app for scripted or headless workflows.
- multiple
--inputpaths, - file or folder inputs,
--mode auto|ram|disk,--ordering preserve-first-seen|alphabetical|unordered-fast,--disk-alphabetical-mode fast-bucket-local|global-perfect,- custom separators with escaped or raw handling,
--trim,--drop-empty,--drop-length-min,--drop-length-max,- disk tuning via
--disk-bucketsand--disk-run-size, --benchmark-jsonfor machine-readable summary output,Ctrl+Ccancellation support.
cargo run -p dedupe_cli -- \
--input ./data/a.csv ./data/b.pdf \
--output ./out/ready.txt \
--mode auto \
--ordering alphabetical \
--disk-alphabetical-mode global-perfect \
--separator "\n" \
--trim true \
--drop-empty trueShow full CLI help:
cargo run -p dedupe_cli -- --help| Feature | Desktop | CLI |
|---|---|---|
| Exact dedupe pipeline | Yes | Yes |
| Folder expansion | Yes | Yes |
PDF / EPUB ingestion |
Yes | Yes |
| Live progress + stage telemetry | Yes | Yes |
| Mission Report UI | Yes | No |
| Word Checker | Yes | No |
| Frequency Analysis | Yes | No |
| Fuzzy Cluster | Yes | No |
| Set Operations | Yes | No |
| In-app updater | Yes | No |
| Localization | Yes | No |
Dupli-Annihilator-G/
|-- crates/
| |-- core/ Deduplication engine, rich-input readers, analysis helpers
| |-- job_runner/ Background job orchestration and event streaming
| `-- backend/ API layer used by desktop and CLI surfaces
|-- apps/
| |-- cli/ Command-line interface
| `-- desktop/ Tauri desktop app with React frontend
|-- docs/ Specifications, release notes, operations docs
`-- scripts/ Release, CI, and benchmarking helpers
| Layer | Technology |
|---|---|
| Core engine | Rust 2021 |
| Desktop shell | Tauri 2 |
| Frontend | React 18 + TypeScript |
| Build tool | Vite |
| CLI parsing | clap |
| Serialization | serde / serde_json |
| Hashing/data structures | ahash, hashbrown, indexmap |
The desktop UI currently ships with 10 locales:
- English (
en) - Spanish (
es) - French (
fr) - Portuguese (
pt) - Chinese Simplified (
zh-CN) - Hindi (
hi) - Arabic (
ar) - Bengali (
bn) - Russian (
ru) - Urdu (
ur)
- Download the latest desktop release from GitHub Releases.
- Install the platform-native package:
Windows:
-setup.exemacOS:.dmgLinux:.AppImageor.deb - Add files or a folder.
- Choose an output path.
- Run the job and review the Mission Report.
Requirements:
- Rust stable
- Node.js 20+
- npm
Run workspace tests:
cargo test --workspaceReal-corpus benchmark harness:
pwsh -NoProfile -File scripts/bench/run-real-corpus.ps1 -ListScenarios
pwsh -NoProfile -File scripts/bench/run-real-corpus.ps1 -ValidateCorpus -RequireCorpus
pwsh -NoProfile -File scripts/bench/run-real-corpus.ps1 -Suite smoke-realWhen testfiles/ is present locally, the benchmark harness treats it as the canonical real corpus. The current scenarios expect large text corpora such as Test1.csv, Test2.csv, Test3.csv, a dense wordlist such as spanish.txt, and rich inputs such as local .pdf and .epub files. These .csv fixtures are benchmark text corpora and are not assumed to be tabular CSV datasets.
See docs/benchmarks.md for the scenario matrix, baseline numbers, and emitted JSON/CSV artifacts.
Install desktop dependencies:
npm ci --prefix apps/desktopRun the desktop app in dev mode:
cargo install tauri-cli --version "2.10.1" --locked
cd apps/desktop/src-tauri
cargo tauri dev --ciBuild the frontend bundle only:
npm --prefix apps/desktop run buildArtifacts are generated under apps/desktop/src-tauri/target/release/bundle.
npm ci --prefix apps/desktop
cargo install tauri-cli --version "2.10.1" --locked
cd apps/desktop/src-tauri
cargo tauri build --ci --bundles nsis --no-signnpm ci --prefix apps/desktop
cargo install tauri-cli --version "2.10.1" --locked
cd apps/desktop/src-tauri
cargo tauri build --ci --bundles dmg --no-signsudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf
npm ci --prefix apps/desktop
cargo install tauri-cli --version "2.10.1" --locked
cd apps/desktop/src-tauri
cargo tauri build --ci --no-sign- Release notes live in
docs/releases/. - Product and engine documentation live in
docs/. - Release automation helpers live in
scripts/release/. - CI verification helpers live in
scripts/ci/. - Real-corpus benchmark helpers live in
scripts/bench/.
If you are preparing a release, review:
docs/07_RELEASE_OPERATIONS.mddocs/releases/TEMPLATE.mdscripts/release/bump-version.mjsscripts/release/prepare-release.mjs
This project is licensed under the PolyForm Small Business License 1.0.0.
- Free for personal use and for organizations that qualify as a small business under the license.
- A commercial license is required for organizations that do not qualify.
See:
Principal Author: Giuseppe Rojas